弹跳文字(逐字缩放回弹循环 CSS 源码)

CSSJS 许可:自研原创

弹跳文字组件源码:逐字从零缩放回弹入场,支持单次入场与无限循环两种模式与重播按钮,纯 CSS 关键帧实现,适合儿童主题、促销横幅与轻松活泼的标题场景。

效果演示(真实可交互)

下方「弹跳文字 POP!」的每个字会从 0 尺寸「嘣」地弹出,先冲过 1.18 倍再回落,配合逐字 0.05 秒错峰,像多米诺骨牌一样依次落地。下拉框可以切换「入场弹一次」与「无限弹跳」两种模式;点击「重新弹跳」按钮,单次模式下会从头再弹一遍,循环模式下会重置节奏重新起跳。

弹跳文字 POP!

完整代码

HTML 结构:一句标题交给 JS 拆字:

<h2 class="pt-line" id="ptLine">弹跳文字 POP!</h2>

核心 CSS:字默认隐形(opacity 0 / scale 0),容器加 .run 后逐字播放回弹关键帧,加 .loop 则无限循环:

.pt-line span { display: inline-block; opacity: 0; transform: scale(0); }
.pt-line.run span {
  animation: ptPop .6s cubic-bezier(.34, 1.56, .64, 1) both;
  animation-delay: var(--d, 0s);
}
.pt-line.loop span {
  opacity: 1;
  animation: ptPop .6s cubic-bezier(.34, 1.56, .64, 1) infinite;
  animation-delay: var(--d, 0s);
}
@keyframes ptPop {
  0%   { opacity: 0; transform: scale(0); }
  70%  { opacity: 1; transform: scale(1.18); }
  100% { opacity: 1; transform: scale(1); }
}

原生 JS:拆字 + 模式切换 + 重播(先移除类、强制回流、再添加,动画才会重新开始):

function replayPop() {
  line.classList.remove('run', 'loop');
  void line.offsetWidth;
  line.classList.add(mode === 'loop' ? 'loop' : 'run');
}

参数说明

参数默认值说明
弹出时长.6s一个字从 0 到落定的时间
过冲比例1.1870% 处的最大放大倍数,越大弹得越猛
错峰延迟 --di × 0.05s相邻字起跳的时间差
模式入场弹一次可切换无限循环
缓动cubic-bezier(.34, 1.56, .64, 1)回弹曲线,结尾带轻微过冲

兼容性与性能

常见问题

Q: 弹完一次后文字消失了? 检查容器是否保留了 .run 类:单次模式依赖 animation-fill-mode: both 保持结束态,移除类会让字回到隐形初始态。

Q: 想让每个字弹出力度不同? 给不同字写入不同的 --d 与缩放比例即可;例如偶数位用 scale(1.3),大小交错更有节奏。

Q: 循环模式很耗性能吗? 缩放与透明度都是合成属性,GPU 合成开销极小;真正的性能杀手是触发布局,本组件没有布局属性参与动画。

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(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核