波浪文字(逐字起伏振幅可控 CSS 源码)
波浪文字组件源码:逐字拆分后按延迟错峰起伏,振幅与速度可调,支持输入自定义文本重新生成,纯 CSS 关键帧实现,适合海报标题、Banner 与节日氛围文案。
效果演示(真实可交互)
下方「粤喵波浪文字 WAVE」的每个字都在做上下起伏,相邻字符依次错开半拍,形成海浪推进的视觉效果。拖动「振幅」滑块可以把波浪从 4px 微澜调到 36px 巨浪;拖动「速度」滑块可以控制起伏快慢;在文本输入框里输入任意内容并点击「生成」,文字会即时重新拆分、按新内容起浪。
粤喵波浪文字 WAVE
完整代码
HTML 结构:JS 把一句话拆成单个字符的 <span>,并给每个字符写入错峰延迟:
<h2 class="wv-line" id="wvLine"></h2>
核心 CSS:每个字符是一个行内块,套用同一个上下位移关键帧,--wv-d 是错峰延迟,--wv-amp 是振幅:
.wv-line span {
display: inline-block;
animation: wvWave var(--wv-dur, 1.8s) ease-in-out infinite;
animation-delay: var(--wv-d, 0s);
}
@keyframes wvWave {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(calc(var(--wv-amp, 14px) * -1)); }
}
原生 JS:拆分字符并写入延迟,滑块实时修改 CSS 变量:
function split(text) {
line.textContent = '';
[...text].forEach((ch, i) => {
const s = document.createElement('span');
s.textContent = ch === ' ' ? '\u00A0' : ch;
s.style.setProperty('--wv-d', i * 0.06 + 's');
line.appendChild(s);
});
}
amp.addEventListener('input', () => {
stage.style.setProperty('--wv-amp', amp.value + 'px');
});
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
振幅 --wv-amp | 14px | 每个字起伏的最大位移,滑块 4–36px |
周期 --wv-dur | 1.8s | 一次起伏的时长,滑块 0.6–3.2s |
错峰延迟 --wv-d | i × 0.06s | 相邻字符的时间差,越大波浪越平缓 |
| 文本内容 | 粤喵波浪文字 WAVE | 输入框任意修改后重新生成 |
兼容性与性能
- 关键帧里使用
calc(var(--amp) * -1),现代浏览器均可解析;老浏览器会退回无位移的静态文字 - 动画只作用于
transform,属于合成属性,几十个字符同时起伏也没有卡顿 - 空格会被替换为
\u00A0不换行空格,保证英文单词不被拆断换行 - 中文、英文、数字混排均可,emoji 也能参与起伏
常见问题
Q: 波浪看起来是「抖动」而不是「推进」? 错峰延迟 --wv-d 太小或周期太长都会让相邻字趋同。把延迟系数从 0.06s 提到 0.1s,并让周期保持在 2s 以内。
Q: 想只让部分字起伏? 拆分逻辑里给不需要起伏的字符跳过 animation 即可,或对整词用 <span class="wv-static"> 包裹。
Q: 页面加载时希望先静止后起浪? 给关键帧加上 0% 保持静止段(如 0%, 30% 位移为 0),再配合动画延迟即可。
Q: 可以商用吗? 可以,粤喵自研原创组件,免费商用无需署名。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布: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(缓动曲线)等属性即可,代码中有注释说明。