贪吃蛇加载动画(Snake Loader 网格游走)

CSSJS 许可:自研原创

贪吃蛇加载动画,蛇头带着身体在 7×5 网格边框上循环游走,头部高亮发光、身体渐隐,由 JS 定时器驱动,支持三套配色、调速与暂停,复古又有趣的等待动画。

效果演示(真实可交互)

深色面板上,一条四节长的贪吃蛇沿网格四周顺时针巡逻,蛇头白色发光、身体依次跟随,复古像素风十足。绿 / 粉 / 金三套配色,速度 0.3× - 2.5× 实时改变游走频率。

蛇蛇正在巡逻…

配色
速度 1.0×

完整代码

HTML 结构:

<div class="sn-panel">
  <div class="sn-grid"></div>   <!-- 网格由 JS 生成 7×5 个格子 -->
</div>

CSS 核心:

.sn-grid { display: grid; grid-template-columns: repeat(7, 1fr);
           grid-template-rows: repeat(5, 1fr); gap: 3px; }
.sn-grid i { border-radius: 4px; background: rgba(120,136,200,.14); }
.sn-grid i.on  { background: #34c48b; box-shadow: 0 0 8px rgba(52,196,139,.7); }
.sn-grid i.head { background: #fff; box-shadow: 0 0 12px #34c48b; }

JS 核心(蛇沿外围路径游走):

const COLS = 7, ROWS = 5, LEN = 4;

// 1. 生成顺时针外围路径坐标
const path = [];
for (let c = 0; c < COLS; c++) path.push([0, c]);                 // 顶边
for (let r = 1; r < ROWS; r++) path.push([r, COLS - 1]);           // 右边
for (let c = COLS - 2; c >= 0; c--) path.push([ROWS - 1, c]);     // 底边
for (let r = ROWS - 2; r >= 1; r--) path.push([r, 0]);            // 左边

// 2. 每个 tick 蛇头前进一格,身体跟随头部的历史位置
let head = 0;
timer = setInterval(() => {
  head = (head + 1) % path.length;
  render();   // 根据 head 往前数 LEN 格绘制蛇身
}, 300 / speed);

// 3. 渲染:蛇头亮白,身体依次变暗
function render() {
  cells.forEach((el) => el.classList.remove('on', 'head'));
  for (let k = 0; k < LEN; k++) {
    const p = path[(head - k + path.length * 10) % path.length];
    const el = cells[idx(p[0], p[1])];
    el.classList.add('on');
    if (k === 0) el.classList.add('head');
  }
}

参数说明

参数位置说明
网格尺寸COLS / ROWS7×5 适合方形面板;改大则路径更长
蛇身长度LEN4 节视觉清晰;最长不要超过路径的一半
游走间隔300 / speed毫秒,数字越小蛇跑得越快
路径方向path 数组构造顺序改遍历顺序即可逆时针
蛇身颜色.on 的 background三套主题由 --sn-color 切换
发光强度box-shadow头部亮白 + 大光晕,聚焦视觉中心

兼容性与性能

常见问题

Q: 想让蛇走螺旋路径而不是只走边框? 在 path 构造时按螺旋顺序填充坐标:先外圈一圈,再向内一圈,直到中心,蛇就会一圈圈”收拢”游走。

Q: 暂停后重新开始,蛇会跳位吗? 不会,head 状态保留在 JS 变量中;暂停只清定时器,恢复时从原位置继续,渲染逻辑与之前完全一致。

Q: 格子太小/太大怎么调? 改 .sn-panel 的宽高与 gap,格子由 1fr 自动等分;面板宽高比建议与 COLS:ROWS 保持一致,格子才接近正方形。

Q: 定时器在后台标签页会被节流,蛇变慢了? 浏览器会把后台 setInterval 降到每秒 1 次。若必须后台匀速,可用 requestAnimationFrame 累加时间戳的方式替代定时器,前台体验完全一致。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核