Canvas 星空动画实现

CanvasJavaScript动画粒子系统

用原生 Canvas API 实现可交互的粒子星空效果——数百个闪烁的星星、鼠标引力交互、流线拖尾效果。

粒子系统设计

每个星星是一个粒子对象,包含以下属性:

核心算法

动画循环

使用 requestAnimationFrame() 而非 setInterval()——前者由浏览器优化调度,与屏幕刷新率同步(60fps),动画更流畅且更省电。

每帧执行:清空画布 → 更新所有粒子状态 → 绘制连线 → 绘制粒子 → 重复。

闪烁效果

利用正弦波函数实现自然的明暗交替:alpha = 0.3 + 0.7 * Math.sin(time * speed + phase)。每颗星的 phase 值是随机的,所以它们不会同步闪烁,看起来更自然。

鼠标交互

鼠标在 Canvas 上移动时,距离鼠标 100px 范围内的星星会被吸引——向鼠标方向增加一个加速度向量。远离鼠标后,星星逐渐恢复原始速度。核心是距离计算和引力衰减:

force = (maxDistance - distance) / maxDistance * attractionStrength

连线效果

两颗星星距离小于 150px 时,在它们之间绘制半透明连线。距离越近,线条越亮。注意:如果粒子数量为 N,朴素的两两比较复杂度是 O(N^2)。优化方案:空间哈希网格,将 Canvas 划分为若干格子,只检查相邻格子内的粒子。

性能优化

心得:Canvas 动画的难点不在于单个效果,而在于多个效果叠加时的性能控制。200 个粒子 + 连线检测 + 鼠标交互,每帧的计算量要控制在 16ms 以内才能保持 60fps。

← 返回笔记列表