指针移动时卡牌实时 3D 跟随倾角;点击沿 Y 轴 180° 物理翻牌,露出身份。
ONE
NIGHT
NIGHT
狼人
阵营 · 狼人阵营
移动指针倾角 · 点击翻牌
rotateX 0°
rotateY 0°
状态 卡背
水平拖拽旋转圆环,松手后惯性滑动并磁吸回正到最近卡位,正前方卡片点亮。
?
🦊
?
🐺
?
🦉
?
🐗
?
🐐
?
🦇
← 拖拽旋转 →
角度 0°
朝向 #1
把角色牌拖到玩家槽位:命中槽位呼吸高亮→松手磁吸吸附并触发指令;拖到空白处弹簧回弹。模拟强盗偷牌/捣蛋鬼换牌链路。
夜晚行动 · 选择技能目标
🗡
强盗
偷一张牌
🔀
捣蛋鬼
交换两牌
🔮
预言家
查验身份
玩家 1
玩家 2
玩家 3
玩家 4
命中 -
指令 待命…
单指拖动旋转立方体;双指捏合缩放、旋转(Pointer Events 天然同时支持鼠标与触屏)。
1
2
3
4
5
6
单指旋转 · 双指捏合缩放 / 旋转
指针 0
scale 1.00
rotZ 0°
整个场景按景深分层,指针移动时各层以不同速度错位——连月亮、山丘、像素爱心都是用 box-shadow 逐像素拼出的纯 DOM 画面,无任何图片。
层数 4
深度系数 1.6 / 1.1 / 0.55 / 0.25
一座完全由 DOM 平面拼装的 3D 像素小镇:楼体、树木、路灯、云朵都是逐面 translateZ 组装的立体块,
窗户随机点亮并闪烁。拖拽旋转视角、滚轮 / 双指缩放,可开启自动巡航与昼夜切换。
拖拽旋转 · 滚轮 / 双指缩放
方位 -32°
仰角 52°
缩放 1.00×
DOM 平面 0
同一张精灵图(4 帧行走循环,由位图字符串现场生成的 SVG data URI —— 依然零图片文件),
用两种属性切帧:A 动 background-position + steps(4)(Chromium 可被合成器接管);
B 动 transform: translate + steps(4)(所有浏览器都保证走合成器)。
帧间不重绘,只改 GPU 纹理坐标 —— 开 DevTools → Rendering → Paint flashing:
播放时精灵不闪绿;闪绿才说明每帧还在主线程重新栅格化。
A background-positionsteps(4) · 元素自身当取景窗
实测帧 0 / 4
B transform: translatesteps(4) · 整图在窗内平移
实测帧 0 / 4
精灵图 80×16 精灵像素(5 格 = 4 帧 + 首帧副本,末格防止末帧闪空)· 放大 4× 后显示为 320×64
两路动画都只在这张图上「开窗取景」,切帧过程不产生新像素 —— 这就是交给显卡的那部分
两路动画都只在这张图上「开窗取景」,切帧过程不产生新像素 —— 这就是交给显卡的那部分
同一张图 · 两种切帧 · 零重绘
帧率 --
精灵图 --
切帧属性 background-position / transform
✅ 这套栈能做
- CSS 3D 透视 / 翻面 / 层级(perspective、preserve-3d、backface-visibility)
- 全部指针交互:拖拽、多指、指针捕获、命中检测(Pointer Events)
- GPU 加速的 transform / opacity 动效,流畅动画
- 像素级画面:image-rendering、box-shadow 逐像素绘制
- 精灵图切帧动画:background-position / transform + steps() → GPU 纹理采样
- 完整语义化 DOM、无障碍、移动端适配
⛔ 该交给 Canvas / WebGL / 引擎
- 数千同屏节点的独立动画(DOM 节点树开销)
- 逐像素渲染:粒子、烟雾、后处理、光照
- 3D 网格 / 模型导入(CSS 3D 只能变换平面)
- 精确物理碰撞与刚体模拟
- 音视频实时合成
压力测试 · 全 DOM 翻转卡批量渲染
FPS --
点击上方按钮生成全 DOM 翻转卡,观察 FPS 变化——找到「纯 DOM」的甜蜜点与拐点。