CSS数字滚动动画核心是每位用0–9垂直列表+translateY偏移,通过@keyframes控制位移距离(如滚到7则移-7em),配合等宽字体、overflow:hidden和animation-fill-mode:forwards实现翻滚效果。

用 CSS 实现数字滚动动画(比如从 0 滚到 1234),核心思路是:**把数字的每一位做成一列“数字轮”,每个轮子包含 0–9 十个数字,通过 translateY 向上偏移,配合 @keyframes 控制滚动距离和时机,视觉上模拟数字翻滚效果。** 不需要 JS 也能做,但纯 CSS 适合固定起止值或简单场景;若需动态绑定数据,通常需 JS 配合生成样式或切换类名。
1. 构建数字轮结构(HTML + 基础样式)
每位数字用一个容器(如 .digit),内部是 0–9 的垂直排列列表(.digits),每个数字占相同高度(如 1em),容器设为 overflow: hidden,只显示当前“可见窗口”:
0123456789
0123456789
0123456789
关键 CSS:
立即学习“前端免费学习笔记(深入)”;
.digit { display: inline-block; height: 1em; line-height: 1em; overflow: hidden; }-
.digits { display: block; line-height: 1em; }—— 确保每个数字等高、无间隙 - 每个数字字符建议用等宽字体(如
font-family: monospace),避免宽度抖动
2. 用 translateY + keyframes 模拟滚动
假设单个数字高度为 1em,10 个数字总高 10em。要从 0 滚到 7,需向上移动 7em;从 3 滚到 9,移动 6em。可为每位定义独立动画,或统一用 animation-delay 错开节奏增强真实感:
@keyframes roll-0-to-7 {
0% { transform: translateY(0); }
100% { transform: translateY(-7em); }
}
- 动画时长建议 0.3–0.6s,缓动用
cubic-bezier(0.2, 0.6, 0.4, 1)更自然 - 为防动画重播闪烁,加
animation-fill-mode: forwards - 若要“滚动中暂停”,可用
animation-play-state: paused
3. 支持多位数联动(关键:按位计算偏移)
比如显示 2024:千位 2 → 移动 -2em,百位 0 → 0em,十位 2 → -2em,个位 4 → -4em。可为每位预设类名(如 .d0 到 .d9),再用 JS 动态添加对应类触发不同动画;或直接内联 style="animation: roll-0-to-2 0.4s ..."。
- 纯 CSS 方案:用 CSS 自定义属性(
--offset)配合calc()计算 translateY,但需现代浏览器支持 - 更稳妥做法:JS 解析目标数字,为每个
.digit设置style.transform = 'translateY(-${n}em)',再触发动画类
4. 优化细节提升真实感
真实数字滚轮常有轻微弹性、阴影或边缘遮罩。可叠加:
- 顶部/底部加半透明渐变遮罩(用
mask-image或伪元素 +linear-gradient) - 滚动时给
.digits加text-shadow: 0 1px 2px rgba(0,0,0,0.2)增强立体感 - 用
will-change: transform提升动画性能(尤其在移动端) - 避免小数:CSS 动画对 sub-pixel 渲染敏感,尽量用整数 em/rem 值










