画面被布置成一间展厅:墙面上挂着一幅带画框的作品,框里是不断运转的螺旋粒子——数千个彩色光点从中心涌出,沿螺旋线一圈圈向外扩散,越靠外越暗淡。鼠标在画面上移动会带动整个旋涡倾斜,按住左键则让旋转反向。展厅还能一键切换全屏和去掉画框。技术上是 原生 Canvas 逐像素绘制,粒子数量按画布面积自动计算,上限一万二。
这个旋涡的三个特点
粒子数量自适应。脚本按画布像素总数除以一个常数决定粒子数,大屏自动变密、小屏自动变稀,不用手动配置。
光点是画出来的圆。没有用绘图 API 的圆形接口,而是在像素缓冲里按「到圆心距离小于半径」逐点填充,并且是叠加写入,所以重叠处会更亮。
透视只有一行。缩放系数等于焦距除以焦距加深度,粒子的屏幕位置和大小都由它决定,没有引入任何 3D 库。
螺旋是怎么长出来的
每个粒子生成时先随机一个角度和一个半径,落在以中心为圆心的圆面上;之后每帧角度匀速递增、半径缓慢变大,轨迹自然就是一条阿基米德螺线。关键在于角速度对所有粒子相同而半径各异,于是外圈的点走得更「慢」,视觉上形成了旋臂。按住鼠标时角速度取负,整个旋涡就反过来转——只改一个符号,不需要重建任何数据。
能改的地方
焦距及其上下限、粒子密度系数、旋转速度都在脚本顶部,集中且互不影响。粒子颜色在绘制处按索引取色,改成单色系会更接近星云,改成随机色则更热闹。展厅那套墙面、画框、地面都是纯 CSS 背景图,不需要的话可以整段删掉,只保留画布铺满页面。
常见问题
大屏上有点卡?
粒子数按面积计算,全屏高分屏会顶到上限。把密度系数调大(即每个粒子占更多像素)或直接下调上限,都能立刻缓解;也可以给画布设一个较小的固定尺寸再用 CSS 拉伸。
能去掉展厅只要旋涡吗?
可以。画布是独立元素,把外层的展厅结构和对应样式删掉,让画布铺满页面即可,粒子逻辑不受影响。
手机上能交互吗?
能。脚本内置了移动设备判断,检测到手机或平板时会改绑触摸事件并降低粒子数量。
适合用在哪
科技与音乐类站点的首屏背景、加载页的等待动画、活动页的氛围层,也适合当作「不用引擎写三维粒子」的参考。自适应密度、像素级画圆与螺旋推进的完整实现都在脚本里,下载后可查看。