MOTION HUB

翻牌计数

Flip Counter
#flip-counter · 14/72
HOVER · 悬停交互

参数调改

PLAYGROUND
牌面宽度--card_w
44110
px
翻牌时长--dur_ms
2401400
ms
数字字号--font_px
2876
px
数字颜色--num_color
牌面底色--card_color
强调色--accent
翻牌缓动--ease

实现要点

NOTES
  1. 01

    翻牌的半面拼接原理:上下两个 overflow:hidden 的半窗各显示同一整字的半截(伪元素行高等于整卡高、下半窗内容 translateY(-50%) 对齐),旋转发生在叠在上面的翻板上,而不是静态窗——所以任意帧上下两半永远拼成一个完整数字。

  2. 02

    翻页分两段触发:上翻板(显示旧值)rotateX 0 → -90° 折下;animationend 后静态上半窗换成新值,下翻板(显示新值)从 rotateX 90° → 0° 展开,结束后静态下半窗换新值并移除翻板。两段都靠 animationend 串接,不猜时长。

  3. 03

    生成翻板后必须 void el.offsetHeight 强制 reflow 再加动画类,否则初始 rotateX 状态来不及渲染,翻板会瞬间跳到终态。

  4. 04

    perspective 放在翻牌容器上(子元素共享同一个灭点),翻板 backface-visibility: hidden 防止折过 90° 时露出镜像;翻动只动 transform(合成器路径),两块翻板的生命周期用完即删,DOM 不会累积。

  5. 05

    进位节奏:个位翻完 35% 时十位才开始翻,模拟机械翻页时钟的错峰;真实倒计时场景把 tick 换成 setInterval(1000) 驱动即可。

  6. 06

    无障碍:容器 role=status + aria-live=polite,数值变化通知读屏;reduced-motion 下隐藏翻板、新旧值直接切换(语义不变,只是没有翻转动画)。

源代码

SOURCE

加载源代码…