css可原生实现数字翻牌滚动效果:通过transform-style: preserve-3d创建3d空间,front/back双面定位叠加,配合@keyframes flip定义rotatex翻转动画,结合perspective与backface-visibility实现逼真3d翻牌,js仅用于触发动画和更新数值。

用 CSS 动画实现数字翻牌滚动(类似倒计时、分数变化的 3D 翻转效果),核心是利用 transform: rotateX() 配合前后两个数字面(front/back)的切换,再通过动画控制翻转时机。HTML5 本身不提供动画能力,但结合现代 CSS(尤其是 @keyframes 和 transform-style: preserve-3d)完全可原生实现,无需 JS 或 Canvas。
结构:双面翻牌容器
每个数字位需一个独立容器,内部包含 front 和 back 两个子元素,分别显示「当前值」和「目标值」:
<div class="digit"> <div class="face front">3</div> <div class="face back">7</div> </div>
关键点:
- 父容器设
transform-style: preserve-3d,让子元素在 3D 空间中保持透视关系 - 两个
.face绝对定位重叠,front 正面朝上,back 绕 X 轴旋转 180° 后也正面朝上(即初始时 back 是“背对镜头”的,但内容已翻转好) - front 初始
transform: rotateX(0deg),back 初始transform: rotateX(180deg)
动画:触发一次 180° 翻转
定义一个翻牌动画,让 front 向上翻、back 向下翻,形成连贯翻转效果:
@keyframes flip {
0% { transform: rotateX(0deg); }
50% { transform: rotateX(90deg); }
100% { transform: rotateX(180deg); }
}
然后分别给 front 和 back 应用该动画,并设置不同方向与延迟:
- front:从
rotateX(0)→rotateX(180),持续 0.6s,animation-timing-function: ease-in-out - back:从
rotateX(180)→rotateX(360)(等价于 0),同样 0.6s,但加animation-delay: -0.3s实现错峰翻转,视觉更自然
注意:back 的 360° 是为了让它在翻完后回到“正面朝上”状态,为下次翻牌准备。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
样式:添加透视与视觉细节
没有透视,3D 效果会扁平失真。必须在翻牌容器的父级(如 body 或 .digits)设置:
.digits {
perspective: 400px;
}
.digit {
width: 60px; height: 80px;
transform-style: preserve-3d;
display: inline-block;
margin: 0 4px;
}
.face 公共样式:
.face {
position: absolute;
width: 100%; height: 100%;
backface-visibility: hidden; /* 隐藏背面(避免看到反字)*/
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
font-weight: bold;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
color: #333;
}
front 不额外旋转;back 加 transform: rotateX(180deg) 让文字正向显示。
动态更新:配合 JS 触发新翻牌
纯 CSS 无法自动响应数字变化,需 JS 控制类名切换来触发动画。推荐做法:
- 每次更新数字时,先将目标数字写入
.back的文本内容 - 给
.digit添加临时类名(如is-flipping) - 在 CSS 中定义:
.digit.is-flipping .front { animation: flip 0.6s ease-in-out; }和.digit.is-flipping .back { animation: flip 0.6s ease-in-out -0.3s; } - 动画结束后,用
animationend事件移除类名,并把 back 的数字同步到 front,重置 back 为下一个目标值
这样就能链式触发多位数字依次翻牌,模拟真实计数器效果。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










