最近在研究html5, 主要是随便画一些东西。结果一个问题纠结了好久,主要现象就是画出来的东西和我设置的坐标不符合,看起来总有点被放大模糊的感觉。最好总算找到了原因,是因为canvas的高宽设置问题。canvas有自己的width和height属性,设置其样式的高宽对绘图会产生副作用。
canvas的默认高宽在chrome里是300px * 150px, 这个可能因浏览器不同有区别。如果你只是设置了style的高宽,例如下面的代码:
var canvas = document.getElementById("myCanvas"); canvas.style.width = window.innerWidth + "px"; canvas.style.height = window.innerHeight + "px";
那只是改变了canvas的现实区域的大小,canvas的大小仍然是默认值300px * 150px,其最后结果就是一个小canvas被放大后显示在和你设置的高宽匹配的区域里。这当然不是我们期望的,正确的做法应该是直接设置canvas的高宽:
var canvas = document.getElementById("myCanvas"); canvas.width = window.innerWidth; canvas.height = window.innerHeight;
下面是个简单的例子,大家可以测试一下:
<!DOCTYPE html>
<meta charset="UTF-8"/>
<title>花花</title>
<canvas >
你的浏览器不支持
</canvas>
<script type="text/javascript">
//通过id获取元素
function _id(id) {
return document.getElementById(id);
};
var painter = {
cxt: null,
w: window.innerWidth,
h: window.innerHeight,
init: function() {
var content = _id("content");
//1.错误的设置方法
//content.style.width = this.w + "px";
//content.style.height = this.h + "px";
//2.正确的设置方法
content.width = this.w;
content.height = this.h;
this.cxt = content.getContext("2d");
},
drawRainbow: function() {
var centerX = this.w / 2;
var centerY = this.h / 2;
var radius = this.h / 2;
var startingAngle = 2 * Math.PI;
var endingAngle = 0 * Math.PI;
var counterclockwise = false;
this.cxt.fillStyle = "red";
this.cxt.beginPath();
this.cxt.arc(centerX, centerY, radius, startingAngle,
endingAngle, counterclockwise);
this.cxt.fill();
}
};
painter.init();
painter.drawRainbow();
</script>
错误设置时浏览器显示空白,正确设置时则显示一个刚好能填充页面的红色圆形。