canvas元素
<canvas id="canvas" width="150" height="150"></canvas>
canvas标签只有两个属性——width和height。这些都是可选的, 并且同样利用 DOM properties 来设置。当没有设置宽度和高度的时候, canvas会初始化宽度为300像素和高度
为150像素。该元素可以使用CSS来定义大小, 但在绘制时图像会伸缩以适应它的框架尺寸: 如果
CSS的尺寸与初始画图的比例不一致, 它会出现扭曲。
注意: 如果你绘制出来的图像是扭曲的, 尝试用
width和height属性为canvas明确规定宽高, 而不是使用CSS。
canvas元素可以像任何一个普通的图像一样(有margin, border, background等等属性)被设计。然而, 这些样式不会影响在canvas中的实际图像。当开始时没有为canvas规定样式规则, 其将会完全透明。
替换内容
canvas元素与img标签的不同之处在于, 像video, audio, 或者picture元素一样, 很
容易定义一些替代内容。由于某些较老的浏览器(尤其是IE9之前的IE浏览器)或者文本浏览器不
支持HTML元素canvas, 在这些浏览器上你应该总是能展示替换内容。
这非常简单, 我们只是在canvas标签中提供了替换内容。不支持canvas的浏览器将会忽略容器并在其中渲染后备内容。而支持canvas的浏览器将会忽略在容器中包含的内容, 并且只是正常渲染canvas。
举个例子, 我们可以提供为canvas内容的文字描述或者是提供动态生成内容相对应的静态图片, 如下所示:
<canvas id="stockGraph" width="150" height="150">
current stock price: $3.15 + 0.15
</canvas>
<canvas id="clock" width="150" height="150">
<img src="images/clock.png" width="150" height="150" alt="" />
</canvas>
标签不可省
与img元素不同, canvas元素需要结束标签()。如果结束标签不存在, 则文档的其余部分会被认为是替代内容, 将不会显示出来。
如果不需要替代内容, 一个简单的<canvas id="foo" ...></canvas>在所有支持canvas的浏览器中都是完全兼容的。
渲染上下文
canvas元素创造了一个固定大小的画布, 它公开了一个或多个渲染上下文, 其可以用来绘制和处理要展示的内容。我们将会将注意力放在2D渲染上下文中。其他种类的上下文也许提供了不同种类的渲染方式; 比如, WebGL使用了基于OpenGL ES的3D上下文("experimental-webgl")。
canvas起初是空白的。为了展示, 首先脚本需要找到渲染上下文, 然后再它的上面绘制。canvas元素有一个叫做getContext()的方法, 这个方法是用来获得渲染上下文和它的绘图功能。getContext()接受一个参数, 即上下文的类型。对于2D图像而言, 如本教程, 你可以使用CanvasRenderingContext2D。
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
代码的第一行通过使用document.getElementById()方法来为canvas元素得到DOM对象。一旦有了元素对象, 你可以通过使用它的getContext方法来访问绘图上下文。
检查支持性
替换内容是用于在不支持canvas标签的浏览器中展示的。通过简单的测试
getContext()方法的存在, 脚本可以检查编程支持性。上面的代码片段现在变成了这个样子。
var canvas = document.getElementById('canvas');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
// drawing code here
} else {
// canvas-unsupported code here
}
一个模板骨架
这是一个最简单的模板, 我们之后就可以把它作为之后的例子的起点。
注意: 为了简洁, 我们在
HTML中内嵌了script元素, 但并不推荐这种做法。
<html>
<head>
<title>Canvas tutorial</title>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('canvas');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
}
}
</script>
<style type="text/css">
canvas { border: 1px solid black; }
</style>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
上面的脚本中包含一个叫做draw()的函数, 当页面加载结束的时候就会执行这个函数。通过使用在文档上加载时间来完成。只要页面加载结束, 这个函数, 或者像是这个的, 同样可以使用window.setTimeout(), window.setInterval(), 或者其他任何事件处理程序来调用。
模板看起来会是这样。
一个简单例子
一开始, 让我们来看个简单的例子, 我们绘制了两个有趣的长方形, 其中一个有着alpha透明度。我们将在接下里的例子里深入探索一下这是如何工作的。
<html>
<head>
<script type="application/javascript">
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect (30, 30, 55, 50);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
例子看起来像是这样: