[关闭]
@xkk 2023-08-03T13:36:54.000000Z 字数 2396 阅读 16

Canvas

Canvas 学习笔记 by 小喾苦


基本用法

<canvas> 元素

  1. <canvas id="tutorial" width="150" height="150"></canvas>

<canvas> 看起来和 <img> 元素很相像,唯一的不同就是它并没有 src 和 alt 属性。实际上,<canvas> 标签只有两个属性—— widthheight。这些都是可选的,并且同样利用 DOM properties 来设置。当没有设置宽度和高度的时候,canvas 会初始化宽度为 300 像素和高度为 150 像素。该元素可以使用 CSS 来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果 CSS 的尺寸与初始画布的比例不一致,它会出现扭曲。

备注: 如果你绘制出来的图像是扭曲的,尝试用 width 和 height 属性为 <canvas> 明确规定宽高,而不是使用 CSS

替换内容

<canvas> 元素与<img>标签的不同之处在于,就像<video><audio>,或者 <picture>元素一样,很容易定义一些替代内容。由于某些较老的浏览器(尤其是 IE9 之前的 IE 浏览器)或者文本浏览器不支持 HTML 元素"canvas",在这些浏览器上你应该总是能展示替代内容。

  1. <canvas id="stockGraph" width="150" height="150">
  2. current stock price: $3.15 +0.15
  3. </canvas>
  4. <canvas id="clock" width="150" height="150">
  5. <img src="images/clock.png" width="150" height="150" alt="" />
  6. </canvas>

</canvas> 标签不可省

<img> 元素不同,<canvas> 元素需要结束标签 (</canvas>)。如果结束标签不存在,则文档的其余部分会被认为是替代内容,将不会显示出来。

如果不需要替代内容,一个简单的 <canvas id="foo" ...></canvas> 在所有支持 canvas 的浏览器中都是完全兼容的。

渲染上下文(The rendering context)

<canvas> 元素创造了一个固定大小的画布,它公开了一个或多个渲染上下文,其可以用来绘制和处理要展示的内容。我们将会将注意力放在 2D 渲染上下文中。其他种类的上下文也许提供了不同种类的渲染方式;比如, WebGL 使用了基于 OpenGL ES 的 3D 上下文 ("experimental-webgl") 。

canvas 起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。<canvas> 元素有一个叫做 getContext() 的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()接受一个参数,即上下文的类型。对于 2D 图像而言,如本教程,你可以使用 CanvasRenderingContext2D

  1. var canvas = document.getElementById("tutorial");
  2. var ctx = canvas.getContext("2d");

代码的第一行通过使用 document.getElementById() 方法来为 <canvas> 元素得到 DOM 对象。一旦有了元素对象,你可以通过使用它的 getContext() 方法来访问绘画上下文。

检查支持性

替换内容是用于在不支持 <canvas> 标签的浏览器中展示的。通过简单的测试 getContext() 方法的存在,脚本可以检查编程支持性。上面的代码片段现在变成了这个样子:

  1. var canvas = document.getElementById("tutorial");
  2. if (canvas.getContext) {
  3. var ctx = canvas.getContext("2d");
  4. // drawing code here
  5. } else {
  6. // canvas-unsupported code here
  7. }

一个模板骨架

这里的是一个最简单的模板,我们之后就可以把它作为之后的例子的起点。

备注: 为了简洁,我们在 HTML 中内嵌了 script 元素,但并不推荐这种做法。

HTMLPlayCopy to Clipboard

  1. <html>
  2. <head>
  3. <title>Canvas tutorial</title>
  4. <script type="text/javascript">
  5. function draw() {
  6. var canvas = document.getElementById("tutorial");
  7. if (canvas.getContext) {
  8. var ctx = canvas.getContext("2d");
  9. }
  10. }
  11. </script>
  12. <style type="text/css">
  13. canvas {
  14. border: 1px solid black;
  15. }
  16. </style>
  17. </head>
  18. <body onload="draw();">
  19. <canvas id="tutorial" width="150" height="150"></canvas>
  20. </body>
  21. </html>

上面的脚本中包含一个叫做 draw() 的函数,当页面加载结束的时候就会执行这个函数。通过使用在文档上加载事件来完成。只要页面加载结束,这个函数,或者像是这个的,同样可以使用 window.setTimeout() (en-US)window.setInterval() (en-US),或者其他任何事件处理程序来调用。

模板看起来会是这样。如这里所示,它最初是空白的。

上面的脚本中包含一个叫做 draw() 的函数,当页面加载结束的时候就会执行这个函数。通过使用在文档上加载事件来完成。只要页面加载结束,这个函数,或者像是这个的,同样可以使用 window.setTimeout() (en-US)window.setInterval() (en-US),或者其他任何事件处理程序来调用。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注