什么是 Canvas

Canvas翻译过来就是"画布"的意思。在Web开发中,Canvas是HTML5新增的一个元素,专门用于在网页上绑制图形。

从字面意思理解

想象一下现实中的画布:一块白色的布,画家可以用画笔在上面创作。HTML5的Canvas也是类似的:

  • 画布 = <canvas>标签定义的矩形区域
  • 画笔 = JavaScript代码
  • 颜料 = 各种样式设置

技术定义

Canvas是一个可以使用脚本(通常是JavaScript)在其中绑制图形的HTML元素。它提供了一组API,让开发者能够:

  • 绑制形状(矩形、圆形、多边形)
  • 绑制文本
  • 处理图像
  • 创建动画
  • 处理像素数据

Canvas的本质

Canvas本质上是一个位图画布,这意味着:

const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')

// 绑制一个矩形
ctx.fillStyle = 'red'
ctx.fillRect(10, 10, 100, 50)

// 画完之后,Canvas只存储了像素数据
// 不再"记得"这里有一个矩形

这一点很重要:Canvas绑制的是像素,不是对象。绑制完成后,Canvas只知道每个像素的颜色,不知道"这里有个矩形"。

Canvas vs DOM元素

特性CanvasDOM元素
渲染方式位图渲染矢量渲染
事件处理需要计算坐标直接绑定事件
性能大量元素时更好元素多时性能下降
缩放会模糊保持清晰
内容操作需要重绘可以直接修改

为什么需要Canvas

在Canvas出现之前,网页上的图形主要依靠:

  1. 图片:需要提前制作,无法动态修改
  2. Flash:需要插件,移动端不支持
  3. CSS:只能实现简单形状

Canvas解决了这些问题:

<!-- 动态生成图表 -->
<canvas id="chart"></canvas>

<script>
const ctx = document.getElementById('chart').getContext('2d')
const data = [120, 200, 150, 80, 70, 110]

// 根据数据动态绑制柱状图
data.forEach((value, index) => {
  ctx.fillRect(index * 60 + 20, 300 - value, 40, value)
})
</script>

Canvas的发展历史

时间事件
2004年Apple在Safari中首次实现Canvas
2005年Canvas被纳入HTML5草案
2014年HTML5正式发布,Canvas成为标准
现在所有主流浏览器都支持

浏览器支持情况

现代浏览器对Canvas的支持非常好:

  • Chrome 4+
  • Firefox 2+
  • Safari 3.1+
  • Edge 12+
  • Opera 9+

IE9及以上支持Canvas,IE8及以下需要使用excanvas.js兼容库。

检测Canvas支持

可以通过以下代码检测浏览器是否支持Canvas:

function isCanvasSupported() {
  const canvas = document.createElement('canvas')
  return !!(canvas.getContext && canvas.getContext('2d'))
}

if (isCanvasSupported()) {
  console.log('浏览器支持Canvas')
} else {
  console.log('浏览器不支持Canvas')
}