CSS和canvas標籤設定畫布尺寸區別

admin發表於2018-07-14

很多朋友可能會遇到這樣的情況,在css中設定canvas的尺寸和在canvas標籤設定的值相同,但是表現的效果卻非常不相同。

通常會出現變形的情況,下面就介紹一下為什麼會出現此問題。

先看一段程式碼例項:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html> 
<html> 
<head> 
<style type="text/css">
#theCanvas{ 
  background-color:#63F; 
} 
</style> 
<script type="text/javascript"> 
var i = 1; 
var x = 1; 
var y = 100; 
function moveSin(){ 
  var oCanvas=document.getElementById("theCanvas"); 
  var content=oCanvas.getContext( "2d" ); 
  content.beginPath(); 
  content.moveTo(x,y); 
  i+=0.1; 
  x=i*10; 
  y=Math.sin(i)*10+100; 
  content.lineTo(x,y); 
  content.stroke(); 
  content.closePath(); 
} 
setInterval(moveSin,10);
window.onload=function(){
  moveSin();
} 
</script> 
</head> 
<body> 
<canvas id="theCanvas" width="400" height="400"></canvas> 
</body> 
</html>

上面的程式碼可以比較完美的顯示正弦曲線效果。修改一下程式碼,將canvas的尺寸在css中設定:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html> 
<html> 
<head> 
<style type="text/css">
#theCanvas{ 
  background-color:#63F; 
  width:400px;
  height:400px;
} 
</style> 
<script type="text/javascript"> 
var i = 1; 
var x = 1; 
var y = 100; 
function moveSin(){ 
  var oCanvas=document.getElementById("theCanvas"); 
  var content=oCanvas.getContext( "2d" ); 
  content.beginPath(); 
  content.moveTo(x,y); 
  i+=0.1; 
  x=i*10; 
  y=Math.sin(i)*10+100; 
  content.lineTo(x,y); 
  content.stroke(); 
  content.closePath(); 
} 
setInterval(moveSin,10);
window.onload=function(){
  moveSin();
} 
</script> 
</head> 
<body> 
<canvas id="theCanvas"></canvas> 
</body> 
</html>

程式碼顯示比較模糊,下面再通過一個更為簡單的程式碼來介紹一下兩種設定尺寸方式額區別。

首先要明確一點canvas是一個畫布,也就是影像圖形的繪製場所,它的預設尺寸是300 x 150。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
window.onload=function(){
  var canvas, context;
  canvas=document.getElementById("thecanvas");
 
  canvas.width=200;
  canvas.height=100;
  canvas.style.border="1px solid red";
 
  context = canvas.getContext("2d");
  context.strokeStyle="#99cc33";
  context.fillRect(90,40,20,20);
}
</script>
</head>
<body>
<canvas id="thecanvas"></canvas>
</body>
</html>

1.jpg

再來看使用css設定尺寸的效果,程式碼如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style>
canvas{
  width:100px;
  height:50px;
}
</style>
<script>
window.onload=function(){
  var canvas, context;
  canvas=document.getElementById("thecanvas");
 
  canvas.style.border="1px solid red";
 
  context=canvas.getContext("2d");
  context.strokeStyle="#99cc33";
  context.fillRect(90,40,20,20);
}
</script>
</head>
<body>
<canvas id="thecanvas"></canvas>
</body>
</html>

上面程式碼的顯示圖形如下:

2.jpg

上面的程式碼是將整個畫布縮小了一半,所有的內容都縮小了,其實上面的程式碼依然是在300x150尺寸的畫布上繪製的,然後css又將其尺寸縮小了一半,類似於對於img圖片的尺寸的縮放。再來看一下正常方式設定尺寸,程式碼如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
window.onload=function(){
  var canvas, context;
  canvas=document.getElementById("thecanvas");
 
  canvas.width=100;
  canvas.height=50;
  canvas.style.border="1px solid red";
 
  context = canvas.getContext("2d");
  context.strokeStyle="#99cc33";
  context.fillRect(90,40,20,20);
}
</script>
</head>
<body>
<canvas id="thecanvas"></canvas>
</body>
</html>

上面程式碼的顯示圖形如下:

3.jpg

由效果圖可以看出,只是畫布的尺寸發生了變化,但是畫布上面的圖形影像尺寸並沒有發生變化。

相關文章