Canvas API 参考
canvas 提供脚本控制的位图画布。本页集中列出常用 Canvas 2D API;
WebGL、WebGPU、离屏画布和完整接口请按具体需求查阅对应规范。
获取上下文
<canvas id="chart" width="640" height="320">
图表数据:第一项 40,第二项 75。
</canvas>
<script>
const canvas = document.querySelector('#chart');
const ctx = canvas.getContext('2d');
if (ctx) {
ctx.fillStyle = '#2563eb';
ctx.fillRect(40, 220, 120, 60);
ctx.fillRect(220, 120, 120, 160);
}
</script>
width、height 属性决定绘图缓冲区尺寸;只用 CSS 拉伸会缩放已有像素并可能模糊。
矩形与清除
| 成员 |
作用 |
注意 |
fillRect(x, y, w, h) |
绘制填充矩形 |
使用当前 fillStyle |
strokeRect(x, y, w, h) |
绘制矩形轮廓 |
使用当前描边样式 |
clearRect(x, y, w, h) |
清除矩形区域 |
清为透明黑,不是填背景色 |
路径与形状
| 成员 |
作用 |
注意 |
beginPath() |
开始新路径 |
避免意外连接旧子路径 |
closePath() |
闭合当前子路径 |
不会自动描边或填充 |
moveTo(x, y) |
移动画笔起点 |
不产生线段 |
lineTo(x, y) |
添加直线 |
最后调用 stroke() 或 fill() |
arc(...) |
添加圆弧 |
角度使用弧度 |
ellipse(...) |
添加椭圆弧 |
现代浏览器支持良好 |
arcTo(...) |
用切线连接圆弧 |
半径和控制点需合法 |
quadraticCurveTo(...) |
二次贝塞尔曲线 |
一个控制点 |
bezierCurveTo(...) |
三次贝塞尔曲线 |
两个控制点 |
rect(x, y, w, h) |
向路径添加矩形 |
与立即绘制方法不同 |
roundRect(...) |
添加圆角矩形 |
较新方法,检查目标支持 |
fill(path?, rule?) |
填充路径 |
填充规则常用 nonzero、evenodd |
stroke(path?) |
描边路径 |
描边居中落在路径两侧 |
clip(path?, rule?) |
设置裁剪区域 |
状态叠加,通常配合 save() |
isPointInPath(...) |
测试点是否在填充区 |
坐标和变换需保持一致 |
Path2D |
保存和复用路径 |
不为图形自动提供 DOM 语义 |
颜色与线条
| 属性或方法 |
作用 |
注意 |
fillStyle |
填充颜色、渐变或图案 |
接受 CSS 颜色字符串等 |
strokeStyle |
描边颜色、渐变或图案 |
保证实际背景上的对比度 |
globalAlpha |
全局透明度 |
范围 0 到 1 |
globalCompositeOperation |
像素合成模式 |
导出和叠加前实测结果 |
lineWidth |
线宽 |
坐标缩放会影响视觉宽度 |
lineCap / lineJoin |
端点和连接样式 |
常用 butt、round、miter |
miterLimit |
尖角限制 |
仅影响 miter 连接 |
setLineDash() |
设置虚线序列 |
getLineDash() 可读取副本 |
lineDashOffset |
虚线偏移 |
可用于动画,但应尊重减少动态偏好 |
createLinearGradient() |
线性渐变 |
返回对象后添加色标 |
createRadialGradient() |
径向渐变 |
检查半径合法性 |
createPattern() |
图片重复图案 |
图片加载完成后创建 |
文本
| 成员 |
作用 |
注意 |
font |
CSS 字体简写字符串 |
等待 Web 字体加载可避免度量变化 |
textAlign |
水平对齐 |
start、end 可适配文字方向 |
textBaseline |
基线方式 |
如 alphabetic、middle |
direction |
文本方向 |
与页面语言和双向文本协调 |
fillText() / strokeText() |
绘制文本 |
文字不会进入无障碍树 |
measureText() |
测量文本 |
返回 TextMetrics,不是 DOM 布局尺寸 |
图片与像素
| 成员 |
作用 |
安全或性能注意 |
drawImage() |
绘制图片、视频或其他画布 |
等待资源可用并校验尺寸 |
createImageData() |
创建空像素数据 |
大尺寸会消耗大量内存 |
getImageData() |
读取像素 |
跨源污染画布会抛出安全异常 |
putImageData() |
写入像素 |
不应用当前变换和合成方式 |
toDataURL() |
同步生成数据 URL |
大画布开销高,优先 toBlob() |
toBlob() |
异步导出图片 |
污染画布不可导出 |
变换与状态
| 成员 |
作用 |
注意 |
save() / restore() |
保存和恢复绘图状态 |
成对使用,避免状态泄漏 |
translate() |
平移坐标系 |
影响后续绘制 |
rotate() |
旋转坐标系 |
角度使用弧度 |
scale() |
缩放或翻转坐标系 |
也会影响线宽和文本 |
transform() |
乘入变换矩阵 |
多次调用会累积 |
setTransform() |
直接设置变换 |
可用于每帧重置 |
resetTransform() |
恢复单位矩阵 |
现代浏览器支持良好 |
动画与高分辨率
- 动画使用
requestAnimationFrame(),标签页不可见时暂停非必要工作。
- 根据
devicePixelRatio 放大缓冲区并缩放上下文,同时为最大尺寸设上限。
- 每帧只重绘必要区域,避免无界数组、超大图片和频繁像素读回。
- 动画不是计时器保证;使用时间戳计算进度,并提供暂停方式。
安全与无障碍
- 未通过 CORS 授权的跨源图片或视频会污染画布,阻止像素读取和导出。
- 不把任意 SVG、图片 URL 或用户脚本直接送入绘图流程;限制类型、来源和尺寸。
- Canvas 内文字和形状通常不进入无障碍树,应提供可见文本、数据表或等价控件。
- 像素命中区域不能成为唯一操作路径;使用真实按钮并支持键盘和触屏。
- 图表不能只靠颜色区分类别,应配合标签、图案或形状。
另见:颜色名、MDN Canvas API。