一、Canvas 基础概念与核心对象
Canvas 是 HTML5 提供的绘图容器,通过 JavaScript 操作 CanvasRenderingContext2D 上下文实现图形绘制,常用于图表、游戏、图像编辑等场景。核心对象包括:
canvas元素:通过document.createElement('canvas')创建,需指定width和height属性(避免默认尺寸导致模糊)。- 绘图上下文:通过
canvas.getContext('2d')获取 2D 渲染上下文(最常用),或getContext('webgl')获取 3D 上下文。
二、2D 绘图核心 API(面试重点)
1. 基础绘制 API
- 线段与路径:
beginPath():开始新路径。moveTo(x, y):移动画笔到指定坐标。lineTo(x, y):从当前点绘制直线到指定坐标。closePath():闭合路径(连接起点和终点)。stroke():描边路径。fill():填充路径内部。
- 矩形绘制:
rect(x, y, width, height):绘制矩形路径。fillRect(x, y, width, height):直接填充矩形(不创建路径)。strokeRect(x, y, width, height):直接描边矩形。clearRect(x, y, width, height):清除矩形区域内容。
2. 文本绘制 API
fillText(text, x, y [, maxWidth]):填充文本。strokeText(text, x, y [, maxWidth]):描边文本。font:设置字体样式(如'20px Arial')。textAlign:文本对齐方式(left/center/right)。textBaseline:文本基线(top/middle/bottom)。
3. 图像操作 API
drawImage(image, dx, dy):绘制图像到画布(image可为img元素、Canvas 或视频)。drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight):裁剪并绘制图像。toDataURL(type, quality):将画布内容转为 Base64 格式(type如'image/png',quality控制 JPG 质量)。
4. 样式与变换 API
- 颜色与渐变:
fillStyle/strokeStyle:设置填充/描边颜色(支持#RGB、rgba()、渐变对象)。createLinearGradient(x1, y1, x2, y2):创建线性渐变。createRadialGradient(x1, y1, r1, x2, y2, r2):创建径向渐变。
- 阴影与透明度:
shadowColor/shadowBlur/shadowOffsetX/shadowOffsetY:设置阴影效果。globalAlpha:设置全局透明度(0-1)。
- 变换操作:
translate(x, y):移动坐标系原点。rotate(angle):旋转坐标系(角度需转弧度:angle * Math.PI / 180)。scale(sx, sy):缩放坐标系。save()/restore():保存/恢复绘图状态(避免变换影响后续绘制)。
三、高级功能与优化 API
- 像素操作(图像数据处理):
getImageData(x, y, width, height):获取矩形区域的像素数据(ImageData对象)。putImageData(imageData, dx, dy):将像素数据绘制到画布。ImageData.data:像素数组(RGBA 格式,每像素 4 个字节)。
- 合成与裁剪:
clip():将当前路径设为裁剪区域,后续绘制仅在区域内可见。globalCompositeOperation:设置图形合成模式(如'source-over'/'destination-in'等 12 种模式)。
- 性能优化:
requestAnimationFrame():结合 Canvas 实现平滑动画(替代setInterval)。- 分层绘制:使用多个 Canvas 元素叠加(如背景层、动画层、交互层),减少重绘范围。
- 缓存绘制:将复杂图形绘制到离屏 Canvas(
createOffscreenCanvas(),需浏览器支持)。
四、实战场景与常见问题
- 典型应用:
- 数据可视化(自定义图表,如折线图、雷达图)。
- 游戏开发(2D 游戏引擎,如《植物大战僵尸》网页版)。
- 图像编辑(截图、滤镜效果,如高斯模糊可通过
getImageData实现)。 - 文字渲染(如验证码、动态字体效果)。
- 面试高频问题:
- Canvas 与 SVG 的区别:Canvas 是像素级绘制(适合动画、游戏),SVG 是矢量图形(适合图标、复杂图形,可缩放不失真)。
- Canvas 如何优化性能:
- 减少频繁重绘(合并绘制操作,使用
requestAnimationFrame)。 - 避免大量像素操作(如复杂滤镜可离线处理)。
- 使用 Web Worker 分担计算密集型任务(如像素处理)。
- 减少频繁重绘(合并绘制操作,使用
- Canvas 如何实现动画:通过清除画布 + 重新绘制 +
requestAnimationFrame循环实现。
五、3D 绘图(WebGL)简介
虽然 Canvas 主要通过 2D 上下文使用,但 WebGL(基于 OpenGL ES 2.0)可实现 3D 绘图:
- 通过
canvas.getContext('webgl')获取上下文。 - 需手动编写着色器(Shader)代码(GLSL 语言)处理顶点和片元渲染。
- 常用于 3D 游戏、模型展示(如 Three.js 库封装了 WebGL 底层操作)。
总结
Canvas API 以 2D 绘图为核心,通过路径、文本、图像、像素操作等接口实现丰富的图形效果,适合性能要求高的动画和可视化场景。面试中需重点掌握基础绘制流程、样式变换、像素操作及性能优化策略,并理解 Canvas 与 SVG 的适用场景差异。