用canvas路径动画实现电路板流光效果,核心是通过插值计算光点沿预设折线路径的实时坐标,分层渲染光核、光晕与阴影,并用requestanimationframe驱动时间进度实现匀速流动。

用 Canvas 路径动画实现电路板流光效果,核心是模拟电流沿导线“流动”的视觉感:不是整条线一次性亮起,而是光点(或光带)沿着预设路径匀速移动。关键不在炫技,而在路径定义、光效渲染和帧节奏的配合。
1. 构建电路路径:用 moveTo/lineTo 描绘导线轮廓
电路板导线不是随机线条,而是有明确起点、拐点、终点的折线或贝塞尔曲线。用 beginPath() + moveTo() + lineTo()(或 bezierCurveTo())定义每一段导线路径,并保存为对象数组,方便后续复用:
const traces = [
{ points: [{x:50,y:100}, {x:200,y:100}, {x:200,y:180}] }, // 水平→垂直
{ points: [{x:300,y:120}, {x:300,y:200}, {x:420,y:200}] },
{ points: [{x:150,y:250}, {x:150,y:320}, {x:280,y:320}, {x:280,y:280}] }
];
注意:路径坐标应基于电路板设计图缩放对齐,避免后期变形;每段导线独立保存,便于单独控制流光方向与速度。
2. 实现“流动”:用插值计算光点当前位置
流光本质是光斑(如圆形高亮)沿路径匀速前进。不直接 draw 整条线,而是对当前路径做线性插值(lerp)——根据动画进度 t ∈ [0,1],算出光点在该路径上的实时坐标:
- 对两点线段:
x = x0 + (x1−x0)*t,y = y0 + (y1−y0)*t - 对多点折线:先确定
t落在哪一段(按各段长度加权),再对该段插值 - 推荐封装一个
getPointOnTrace(trace, t)函数,返回{x, y, angle}(angle 可用于光晕朝向)
3. 渲染光效:叠加渐变圆+模糊阴影增强真实感
单个光点太生硬。实际电路流光有“头亮尾衰”的拖尾感。建议分三层绘制:
- 光核:小圆(半径 3–5px),径向渐变(白→透明),模拟高亮焦点
- 光晕:稍大圆(半径 12–20px),透明度更低的径向渐变,边缘柔和
-
投影:用
shadowBlur+shadowColor添加微弱蓝紫色阴影,强化立体感
示例代码片段:
ctx.shadowBlur = 15; ctx.shadowColor = 'rgba(100, 180, 255, 0.6)'; ctx.beginPath(); const grad = ctx.createRadialGradient(x, y, 0, x, y, 15); grad.addColorStop(0, '#fff'); grad.addColorStop(1, 'transparent'); ctx.fillStyle = grad; ctx.arc(x, y, 15, 0, Math.PI * 2); ctx.fill();
4. 控制动画节奏:requestAnimationFrame + 时间驱动进度
避免用 setInterval,用 requestAnimationFrame 驱动。每次帧中更新所有流光路径的进度 t,并重绘:
- 每个流光路径维护自己的
progress(0→1 循环)和speed(如 0.003/帧) - 帧中:progress = (progress + speed) % 1
- 为错落感,可给不同路径设置不同初始偏移(
startOffset)或速度微调(±10%) - 清空画布用
clearRect(),不要用ctx.clearRect(0,0,w,h)全刷——若背景复杂,只擦除光效区域更高效
不复杂但容易忽略:流光方向要符合电路逻辑(如从芯片引脚出发→走向电阻→连到LED),路径数据最好从 SVG 导出或用工具生成,避免手写坐标出错。完成基础后,可叠加交互——鼠标悬停某芯片时,触发关联路径加速流光,增强可玩性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











