CSS 3D × Pointer Events × 零 Canvas · 零引擎
FPS --
指针 0
① 指针倾角 · 3D 翻牌
perspectivepreserve-3dbackface-visibilitypointermove
指针移动时卡牌实时 3D 跟随倾角;点击沿 Y 轴 180° 物理翻牌,露出身份。
狼人
阵营 · 狼人阵营
移动指针倾角 · 点击翻牌
rotateX 0° rotateY 0° 状态 卡背
③ 技能拖放 · 磁吸吸附
Pointer Events 拖拽elementFromPoint 碰撞touch-action:none
把角色牌拖到玩家槽位:命中槽位呼吸高亮→松手磁吸吸附并触发指令;拖到空白处弹簧回弹。模拟强盗偷牌/捣蛋鬼换牌链路。
夜晚行动 · 选择技能目标
🗡
强盗
偷一张牌
🔀
捣蛋鬼
交换两牌
🔮
预言家
查验身份
玩家 1
玩家 2
玩家 3
玩家 4
命中 - 指令 待命…
④ 多点触控 · 3D 立方体
多 pointerId 追踪双指捏合缩放双指旋转
单指拖动旋转立方体;双指捏合缩放、旋转(Pointer Events 天然同时支持鼠标与触屏)。
1
2
3
4
5
6
单指旋转 · 双指捏合缩放 / 旋转
指针 0 scale 1.00 rotZ 0°
⑤ 景深视差 · 纯 DOM 像素画
translateZ 分层指针视差box-shadow 像素画
整个场景按景深分层,指针移动时各层以不同速度错位——连月亮、山丘、像素爱心都是用 box-shadow 逐像素拼出的纯 DOM 画面,无任何图片。
层数 4 深度系数 1.6 / 1.1 / 0.55 / 0.25
⑥ 复杂 3D 场景 · 像素小镇
多层嵌套 preserve-3d轨道相机拖拽 / 滚轮 / 捏合动态光源
一座完全由 DOM 平面拼装的 3D 像素小镇:楼体、树木、路灯、云朵都是逐面 translateZ 组装的立体块, 窗户随机点亮并闪烁。拖拽旋转视角、滚轮 / 双指缩放,可开启自动巡航与昼夜切换。
拖拽旋转 · 滚轮 / 双指缩放
方位 -32° 仰角 52° 缩放 1.00× DOM 平面 0
⑦ 精灵图切帧 · GPU 纹理动画
steps() 离散切帧background-positiontransform: translate合成器线程
同一张精灵图(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
同一张图 · 两种切帧 · 零重绘
帧率 -- 精灵图 -- 切帧属性 background-position / transform
⑧ 能力边界 · 实测验证
压力测试GPU 合成何时该换 Canvas/引擎
✅ 这套栈能做
  • 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」的甜蜜点与拐点。