Canvas e media queries per responsive design

Jakub Lemiszewski

Utente Attivo
5 Dic 2013
119
1
0
Salve,

Ho creato un codice per poter avere un rettangolo canvas per poter disegnare su un device touch. Ho implementato le media queries che pero non funzionano e vorrei capire perchè. Non ho ancora implementato quella per i tablet perchè prima vorrei risolvere il mio problema.
Quello che le queries dovrebbero fare e che su 2 device smartphone e tablet visualizzo il canvas sia in portrait che landscape al 90% della superficie del device. Di seguito il codice intero con il link che va aperto su un device dove vdrete il problema. Grazie mille dell'aiuto.
http://jaku0260.keaweb.dk/responsive_designM8/multitouch.htm
HTML:
<!DOCTYPE html>
<html>
  <head>
  	<meta charset="utf-8" />
    <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
    <title>
      Jake's Multitouch
    </title>
    <link rel="stylesheet" href="paint.css">

	  <script>
      var canvas;
      var ctx;
      var lastPt = new Object();
      var colours = ['red', 'green', 'blue', 'yellow','black'];
      function init() {
        var touchzone = document.getElementById("canvasbox");
        
        // stop default document drag behavior
        document.addEventListener("touchmove", function(e){
        	e.preventDefault();
        }, false);
        
        touchzone.addEventListener("touchmove", draw, false);
        touchzone.addEventListener("touchend", end, false);
        canvas = document.getElementById('canvasbox');
        ctx = canvas.getContext("2d");
      }
      
      function draw(e) {
      	var fingerX, fingerY
        console.log(e);
        
        for(var i=0;i<e.touches.length;i++) {
          var id = e.touches[i].identifier;
          if(lastPt[id]) {
          	fingerX = e.touches[i].pageX - this.offsetLeft;
          	fingerY = e.touches[i].pageY - this.offsetTop;
            ctx.beginPath();
            ctx.moveTo(lastPt[id].x, lastPt[id].y);
            ctx.lineTo( fingerX, fingerY );
            ctx.strokeStyle = colours[id%4];
            ctx.lineWidth = 3;
            ctx.stroke();
          }
          lastPt[id] = {x:fingerX, y:fingerY};
        }
        e.preventDefault();
      }
      
      function end(e) {
        e.preventDefault();
        for(var i=0;i<e.changedTouches.length;i++) {
          var id = e.changedTouches[i].identifier;
          delete lastPt[id];
        }
      }
      
    </script>
  </head>
  
  <body onload="init()">
  
    <canvas id="canvasbox">
      Canvas element not supported.
    </canvas>
  
  </body>
  
</html>
Codice:
/* Smartphones (landscape) ----------- */
@media only screen and (min-width : 321px) {
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}


#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px black solid;
	width: 90%;
	height: 90%; 
}

}

/* Smartphones (portrait) ----------- */
@media only screen and (max-width : 320px) {
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}

#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px red solid;
	width: 90%;
	height: 90%; 

}

}
 
Mi sa che per landscape e portrait nelle media queries devi aggiungere l'orientamento, cioè in questo modo:
Codice:
/* Smartphones (landscape) ----------- */
@media only screen and (min-width : 321px) and (orientation : landscape){
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}


#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px black solid;
	width: 90%;
	height: 90%; 
}

}

/* Smartphones (portrait) ----------- */
@media only screen and (max-width : 320px) and (orientation : portrait) {
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}

#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px red solid;
	width: 90%;
	height: 90%; 

}

}
Non so se funziona! fammi sapere :)
 
Mi sa che per landscape e portrait nelle media queries devi aggiungere l'orientamento, cioè in questo modo:
Codice:
/* Smartphones (landscape) ----------- */
@media only screen and (min-width : 321px) and (orientation : landscape){
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}


#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px black solid;
	width: 90%;
	height: 90%; 
}

}

/* Smartphones (portrait) ----------- */
@media only screen and (max-width : 320px) and (orientation : portrait) {
body{
	width:  100%;
	height: 100%;
	margin: 0;
	padding:0;
}

#canvasbox {
	position:absolute;
	margin:auto;
	top:0; left:0; bottom:0; right:0;	
	border: 2px red solid;
	width: 90%;
	height: 90%; 

}

}
Non so se funziona! fammi sapere :)
Grazie ho provato ma mi sparisce tutto in questo modo. Cmq ho anche un problema che il draw su touch non è in sincronia con il tap del dito sullo schermo comincia ad apparire la riga diverso tempo dopo. Cmq grazie.
 

Discussioni simili