共计 1939 个字符,预计需要花费 5 分钟才能阅读完成。
Canvas 是什么?
Canvas 是 HTML5 提供的一个绘图标签,可以把它想象成一块空白的画布。我们通过 JavaScript 在这个画布上绘制各种图形、动画甚至游戏。它特别适合需要动态生成图像的场景,比如数据可视化、小游戏开发等。

与 SVG 不同,Canvas 是位图绘制方式,一旦绘制完成就无法直接修改其中某个元素,需要重新绘制。这也是为什么它性能更好的原因。
基础准备
- 首先需要在 HTML 中创建一个 canvas 元素:
<canvas id="myCanvas" width="500" height="500"></canvas>
- 然后在 JavaScript 中获取这个元素并设置绘图上下文:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d'); // 2d 表示二维绘图
核心 API 入门
绘制基本图形
- 矩形:Canvas 提供了直接绘制矩形的方法
ctx.fillStyle = 'blue'; // 设置填充颜色
ctx.fillRect(50, 50, 100, 100); // 绘制填充矩形 (x, y, width, height)
ctx.strokeStyle = 'red'; // 设置描边颜色
ctx.strokeRect(200, 50, 100, 100); // 绘制描边矩形
- 圆形:需要通过路径来绘制
ctx.beginPath();
ctx.arc(150, 250, 50, 0, Math.PI * 2); // (x, y, 半径, 起始角度, 结束角度)
ctx.fillStyle = 'green';
ctx.fill(); // 填充圆形
ctx.beginPath();
ctx.arc(300, 250, 50, 0, Math.PI * 2);
ctx.strokeStyle = 'purple';
ctx.stroke(); // 描边圆形
绘制路径
路径是 Canvas 中非常重要的概念,可以绘制任意形状:
ctx.beginPath();
ctx.moveTo(50, 350); // 起点
ctx.lineTo(150, 400); // 第一条线
ctx.lineTo(50, 450); // 第二条线
ctx.closePath(); // 闭合路径
ctx.stroke(); // 描边
第一个动画示例
让我们创建一个简单的弹跳球动画:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// 球的初始位置和速度
let x = 100;
let y = 100;
let dx = 2;
let dy = 2;
const radius = 20;
function animate() {
// 清除画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制球
ctx.beginPath();
ctx.arc(x, y, radius, 0, Math.PI * 2);
ctx.fillStyle = 'orange';
ctx.fill();
// 更新位置
x += dx;
y += dy;
// 边界检测
if (x + radius > canvas.width || x - radius < 0) {dx = -dx;}
if (y + radius > canvas.height || y - radius < 0) {dy = -dy;}
// 循环动画
requestAnimationFrame(animate);
}
// 启动动画
animate();
性能优化技巧
- 避免频繁重绘:只重绘发生变化的部分,而不是整个画布
- 使用离屏 Canvas:对于复杂的静态图形,可以先在内存中绘制好
- 减少路径操作:合并相似的路径绘制操作
- 合理使用 requestAnimationFrame:这是浏览器提供的专门用于动画的 API
常见问题解答
Q: 为什么我的 Canvas 看起来模糊?
A: 可能是由于 CSS 设置的尺寸与 Canvas 的 width/height 属性不匹配。确保两者一致。
Q: 如何检测 Canvas 上的点击事件?
A: 需要自己计算鼠标坐标是否在绘制的图形内。对于简单图形,可以检查距离;复杂图形需要更复杂的算法。
挑战任务
尝试创建一个简单的绘图应用:
1. 允许用户用鼠标在 Canvas 上自由绘制
2. 提供颜色选择功能
3. 添加清除画布按钮
提示:你需要监听鼠标事件 (mousedown, mousemove, mouseup) 并记录绘制路径。
进阶方向
掌握了基础后,你可以尝试:
– 游戏开发(如贪吃蛇、俄罗斯方块)
– 数据可视化(图表、热力图)
– 图像处理(滤镜、像素操作)
– 物理引擎(碰撞检测、粒子系统)
Canvas 是一个强大的工具,随着 Web 技术的进步,它的应用场景越来越广泛。希望这篇入门指南能帮助你踏上 Canvas 开发之旅!
正文完
发表至: 未分类
近两天内
