声波条加载动画(Sound Bars Loader 均衡器跳动)

CSSJS 许可:自研原创

声波条加载动画,9 根渐变音柱按不同节拍错落起伏,还原音乐均衡器跳动质感,支持三套配色、调速与暂停,纯 CSS 零依赖,适合音乐、语音、直播等场景。

效果演示(真实可交互)

九根音柱以各自错开的节奏上下起伏,高度变化仿佛真实的均衡器在跳动;青 / 暖 / 黑白三套配色覆盖不同气质,速度滑块 0.3× - 2.5× 实时改变跳动节奏。

正在播放加载声…

配色
速度 1.0×

完整代码

HTML 结构:

<div class="sb-eq">
  <i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i>
</div>

CSS 核心:

.sb-eq {
  --sb-dur: 1.2s;                       /* 一个起伏周期 */
  --sb-color: #35d0d8; --sb-color2: #6c8cff;
  display: flex; align-items: center; gap: 6px; height: 96px;
}
.sb-eq i {
  width: 10px; height: 24px; border-radius: 5px;
  background: linear-gradient(180deg, var(--sb-color), var(--sb-color2));
  animation: sb-wave var(--sb-dur) ease-in-out infinite;
}
/* 每根柱子错开不同相位,模拟真实音乐波形 */
.sb-eq i:nth-child(1) { animation-delay: calc(var(--sb-dur) * -0.9); }
.sb-eq i:nth-child(2) { animation-delay: calc(var(--sb-dur) * -0.62); }
.sb-eq i:nth-child(3) { animation-delay: calc(var(--sb-dur) * -0.35); }
.sb-eq i:nth-child(4) { animation-delay: calc(var(--sb-dur) * -0.72); }
.sb-eq i:nth-child(5) { animation-delay: calc(var(--sb-dur) * -0.2); }
.sb-eq i:nth-child(6) { animation-delay: calc(var(--sb-dur) * -0.5); }
.sb-eq i:nth-child(7) { animation-delay: calc(var(--sb-dur) * -0.8); }
.sb-eq i:nth-child(8) { animation-delay: calc(var(--sb-dur) * -0.42); }
.sb-eq i:nth-child(9) { animation-delay: calc(var(--sb-dur) * -0.66); }

/* 多段高度关键帧,让波形更像随机跳动的音乐节拍 */
@keyframes sb-wave {
  0%, 100% { height: 22px; }
  25%      { height: 88px; }
  50%      { height: 40px; }
  75%      { height: 64px; }
}

JS(调速): 统一改写 --sb-dur 即可让所有音柱同步变速,相位差保持不变。

参数说明

参数位置说明
起伏周期--sb-dur一根柱子完成一轮起伏的时长,默认 1.2s
音柱数量HTML 中 <i> 个数5-12 根视觉均佳,越多越密集
相位错开animation-delay用负延迟让动画”开局即错落”,避免首帧齐跳
高度波形sb-wave 关键帧可增删关键帧模拟不同”音乐风格”
音柱配色--sb-color / --sb-color2每根柱自上而下的渐变两色
音柱宽度width / gap宽度 6-14px、间距 4-8px 比例协调

兼容性与性能

常见问题

Q: 首帧所有柱子一起跳了一下? 这是因为延迟为 0 的柱子从关键帧起点开始;把所有柱子都改成负延迟(如 -0.1 × dur 到 -0.9 × dur 错开),首帧就不会齐跳。

Q: 想要左右对称的波形(中间高两边低)? 让中间的柱子延迟为 0,两侧柱子延迟对称分布(如左 0.2s、右 -0.2s),并统一关键帧峰值,即可形成对称波动。

Q: 柱子跳动很生硬怎么办? 把 animation-timing-function 改为 cubic-bezier(.34,1.56,.64,1) 或 ease-in-out,并在关键帧间增加更多过渡点。

Q: 能接真实音频频谱吗? 可以,用 Web Audio API 的 AnalyserNode.getByteFrequencyData() 拿频率数据,在 requestAnimationFrame 中逐帧设置每根柱子的 height,CSS 动画仅作为无音频时的降级方案。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布: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(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核