用Canvas实现动态进度加载环需先平移原点至画布中心,用arc()分层绘制底环与前景弧,前者固定满圆、后者从顶部顺时针增长;通过requestAnimationFrame逐帧更新起止角度并配合缓动函数实现平滑动画,最后居中渲染百分比文字并支持响应式与高清屏适配。

用 Canvas 实现基于路径动画的动态进度加载环,核心在于用 arc() 绘制圆弧路径、stroke() 描边、配合 requestAnimationFrame 逐帧更新起止角度,同时确保动画起点在顶部、顺时针增长、视觉平滑——不依赖任何库,纯原生 JS 即可完成。
初始化画布与坐标系校准
Canvas 默认坐标原点在左上角,直接画圆会偏移。需先获取 2D 上下文,并将绘图原点平移到画布中心:
- 设
canvas宽高均为 200,则圆心cx = cy = 100 - 调用
ctx.translate(cx, cy),后续所有坐标以中心为 (0, 0) - 半径建议取 80(留出线宽空间),线宽设为 12,避免描边被裁切
- 设置
ctx.lineCap = 'round'让弧线两端呈圆形,更美观
分层绘制:底环 + 动态前景弧
进度环由静止背景和动态增长的彩色弧组成,两者都用 arc(),但参数不同:
- 底环:固定画满一圈,
ctx.arc(0, 0, radius, 0, Math.PI * 2),颜色设为浅灰(如#eee) - 前景弧:从顶部开始(-π/2 弧度),顺时针延伸,结束角 =
-Math.PI / 2 + (percent / 100) * Math.PI * 2 - 必须设
ctx.beginPath()再调用arc(),否则路径会累积导致异常
驱动平滑动画的关键逻辑
不用 setInterval,用 requestAnimationFrame 实现 60fps 流畅动画:
立即学习“前端免费学习笔记(深入)”;
- 定义当前进度
current = 0和目标值target = 75 - 每帧按步长(如 0.8)递增
current,直到 ≥target - 清空画布时注意:因已平移原点,应调用
ctx.clearRect(-cx, -cy, width, height) - 可加入缓动,例如
easeOutCubic(t) = 1 - Math.pow(1 - t, 3),让动画后半段减速,更自然
叠加百分比文字与响应式适配
文字需居中显示,且随进度同步更新:
- 用
ctx.font = 'bold 32px Arial'和ctx.textAlign = 'center' - 文字坐标设为
(0, 10)(y 值略大于 0 是因文字基线在底部) - 响应式处理:监听
window.resize,重设 canvas 宽高并重新缩放上下文(ctx.scale(scale, scale)),或直接重绘 - 若需适配高清屏,用
window.devicePixelRatio提升 canvas 绘制分辨率



















