1. 从零开始理解Canvas绘图基础
作为一名前端开发者,第一次接触Canvas时那种既兴奋又困惑的感觉我至今记忆犹新。Canvas本质上就是浏览器提供的一块可以自由绘制的画布,它不像SVG那样基于矢量图形,而是直接操作像素,这既是它的优势也是它的局限。
1.1 Canvas与SVG的核心区别
很多初学者容易混淆Canvas和SVG,其实它们是完全不同的两种技术路线。SVG是基于XML的矢量图形描述语言,而Canvas则是通过JavaScript API直接操作像素的位图绘制技术。简单来说:
- SVG:放大不会失真,适合静态图标和简单动画
- Canvas:性能更高,适合复杂动画和数据可视化
- SVG:每个图形都是DOM节点,可以添加事件
- Canvas:整个画布是一个整体,事件处理需要手动计算
1.2 Canvas的基本使用流程
使用Canvas绘图的基本流程可以概括为以下几步:
- 获取Canvas DOM元素
- 获取绘图上下文(2D或WebGL)
- 设置绘图样式(颜色、线宽等)
- 调用绘图指令
- 渲染到屏幕
javascript复制// 基本示例
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// 设置样式
ctx.fillStyle = 'blue';
ctx.strokeStyle = 'red';
ctx.lineWidth = 5;
// 绘制矩形
ctx.fillRect(10, 10, 100, 100);
ctx.strokeRect(10, 10, 100, 100);
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 圆环绘制的数学原理与实现
2.1 理解Canvas的坐标系系统
Canvas的坐标系原点(0,0)位于画布的左上角,x轴向右延伸,y轴向下延伸。这与我们常见的数学坐标系不同,需要特别注意。在绘制圆环时,我们通常需要先计算圆心位置:
javascript复制const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
2.2 弧度与角度的转换
Canvas的arc方法使用的是弧度而非角度,这是很多新手容易出错的地方。弧度与角度的转换公式如下:
code复制弧度 = 角度 × (π/180)
为了方便使用,我们可以封装一个转换函数:
javascript复制function degToRad(degrees) {
return degrees * (Math.PI / 180);
}
2.3 绘制圆环的核心算法
Canvas没有直接绘制圆环的API,我们需要通过"挖洞"的方式实现:
- 绘制一个完整的大圆(外圆)
- 在大圆内部绘制一个同心小圆(内圆),并设置逆时针方向
- 填充路径,形成圆环效果
javascript复制function drawRing(ctx, x, y, outerRadius, innerRadius, color) {
ctx.beginPath();
// 外圆 - 顺时针
ctx.arc(x, y, outerRadius, 0, Math.PI * 2, false);
// 内圆 - 逆时针
ctx.arc(x, y, innerRadius, 0, Math.PI * 2, true);
ctx.fillStyle = color;
ctx.fill();
}
3. 实战:创建一个动态进度环
3.1 基础进度环实现
让我们实现一个基础的进度环,它可以显示0-100%的进度:
javascript复制function drawProgressRing(ctx, x,
