● one master, a whole skeleton
Bruce 没有被重画。主图在构建时被切成部件,挂上一棵骨骼树;耳朵、护目镜、徽章和舌头是弹簧骨骼,跟着头和身体自己甩起来。整段表演以 240 Hz 模拟,再烘焙成 CSS 关键帧:交付的只是一个 SVG 文件。
<img src="svg/….svg">,不是为预览另写的版本。01 gallery
点任何一格,把它放到上面的舞台里:拖时间轴、放慢到四分之一、打开骨骼。只有进入视野的格子在播放。
02 one file adapts
动画是 CSS 写的,所以文件能读到系统设置;URL 片段则让宿主强制指定。不需要另备一套深色文件或静止帧。
循环播放。系统打开「减少动态效果」时,自动冻结在静止帧。
<img src="svg/celebrate.svg">
最有表现力的一帧,用作缩略图和静态配图。不认识 CSS 动画的渲染器看到的也是这一帧。
<img src="svg/celebrate.svg#still">
主图是藏青色剪影,深色底上会消失。冰蓝描边跟着骨骼一起动;跟随系统时自动出现,也可以强制。
<img src="svg/celebrate.svg#dark">
播一遍停住。
<img src="svg/celebrate.svg#once">
片段可以组合:#dark-still、#light-still、#dark-once、#light-once,#light 则强制不加描边。
03 sizes
64 像素以上表情完整可读;44 像素以下文件自己隐藏细碎特效,只留下主体的表演。16–20 像素的工具栏位置请继续使用单色的 brand/bruce-agent.svg。
04 in the product
等待、祝贺、出错和内容插画,各取一个放在它该出现的位置。
05 how it is made
构建时读取 brand/bruce-head.svg,用裁切区域把它切成身体、头、两节耳朵、下颌、眼、护目镜和徽章,挂到一棵骨骼树上。静止时画出来的就是主图。
关键姿态加缓动写出预备、过冲和挤压拉伸;耳朵、护目镜、徽章、舌头是弹簧骨骼,由父骨骼的运动推着走,拖尾和回弹不用手调。
每条通道拟合成分段曲线,用最短路径选出字节数最少的一组关键帧;误差不超过 0.8 个画布单位(512 像素下约 0.27 像素)。重复的节拍只烘焙一次,作为子循环播放。
结构测试逐条检查浏览器会静默丢弃的错误;再用 Chrome 和 WKWebView 加载 svg/ 里的成品,按时刻取帧比较。
| 检查 | 结果 |
|---|---|
结构测试(node --test) | 148 项通过:关键帧、缓动、id、引用、循环闭合、画布边界、体积 |
| 静止姿态对主图(Chrome,1024 px) | 465 个像素的差异超过 12%,占全图 0.044% |
| 循环首尾帧(Chrome,交付文件) | 24 个表情全部闭合,最大差异 0 个像素 |
| Chrome 对 WKWebView | 每帧最多 9 / 40000 像素不同(0.02%) |
<img> 内的行为 | 两个内核里都在播放;#still 冻结、#dark 加描边;系统「减少动态效果」打开时冻结在静止帧 |