375px 微信视口 · 主时间轴 22.3s ·
滚到 P.04 点一下画面
然而
但是
于是
所以
然而
但是
于是
所以
然而
但是
于是
所以
ZINE / 长卷 SVG 解剖
750 × 7000
ISSUE 001
SMIL · 22.3s
它是怎么动起来的
一份关于长卷 SVG 的技术小报
复刻《Claude by Claude》,并拆开它的制作链路
(620, 505)
750px
NEXT TOKEN #1
P.01
§ 01 · 它不是什么
750 × 7000
不是视频
不是 GIF
不是图片
是一段 SVG。
01
viewBox
<svg viewBox="0 0 750 11980">
287KB 源码 · 532 个 text · 0 张位图
NEXT TOKEN #2
P.02
§ 02 · 复刻 · 终端幕
750 × 7000
TERM
sample P.02
ASSISTANT:
你
好
。
typewriter 0.3s/字
begin=0s · repeatCount=indefinite
NEXT TOKEN #3
P.03
§ 03 · 复刻 · 交互幕
750 × 7000
(180,2290)
(400,2230)
(620,2330)
(300,2470)
[ 点一下,看它们在看谁 ]
begin=click × 5 · fill=freeze · restart=always
NEXT TOKEN #4
P.04
§ 04 · 转折
750 × 7000
?
可是,怎么做的?
下面六屏,一层层拆给你看
NEXT TOKEN #5
P.05
§ 05 · 原理 ① 三段输入,一次编译
750 × 7000
01
skeleton.svg
静态骨架
02
timeline.json
人写的时码
03
timeline_compile
脚本编译
OUT
17 animate
zine.svg
NEXT TOKEN #6
P.06
§ 06 · 原理 ② 人不手写 keyTimes
750 × 7000
CALC
T = 22.3s
cue: at 3.4s dur 1.6s T 22.3s
a = 3.4 / 22.3
= 0.1525
b = 5.0 / 22.3
= 0.2242
keyTimes="0;0.1525;0.2242;1"
四段式:0→a 隐 · a→b 渐变 · b→1 保持
NEXT TOKEN #7
P.07
§ 07 · 原理 ③ 编译 = 把时码写进骨架
750 × 7000
BEFORE
<g data-cue="hero">
<text>…</text>
</g>
AFTER
+animate
<g data-cue="hero">
<animate/>
<text>…</text>
</g>
元素上打个 data-cue,脚本就能找到它
NEXT TOKEN #8
P.08
§ 08 · 原理 ④ 点击靠嵌套层 + 透明热区
750 × 7000
visibility:hidden 的元素收不到点击 ——
所以要把 N 个元素嵌成 N 层,热区放最内层
Layer 1 keyTimes 0;0;1
Layer 2 keyTimes 0;0.0229;1
Layer 3 keyTimes 0;0.0457;1
pointer-events="all"
(240, 5920)
(470, 5940)
↑ 点击后事件沿冒泡穿过每一层
各层 animate 同时 begin,靠递增的 keyTimes 错开先后
—— stagger 是结构造的,不是动画属性
NEXT TOKEN #9
P.09
§ 09 · 原理 ⑤ 体检 · 预览 · 发布
750 × 7000
values 与 keyTimes 段数一致
keyTimes 单调递增,首 0 尾 1
热区在 click 动画的子树内
无 script / 外链 / 非系统字体
PASS · validate_svg.py
0 error / 0 warn
375px 预览 → 手机真机确认 → 粘贴公众号
wechat-animating
NEXT TOKEN #10
P.10
v2 视觉重写补上的
· 色板 5 → 9 色(5 档纸灰)
· 密集小字 17/22 为主(样本 22px×220)
· 纸纹噪点 / 斜线网纹 / 半调网点
· 刻度尺 / 进度块 / 角标 / 伪 UI 标签
· 手绘箭头 / 手绘圈选 / 印章 / 坐标标注
· 12 个水印词 + 9 节点铺底
P.09 重画:两节点连线有起止语义(呼应 P.04),气泡沿虚线轨迹从热区上升。 63 条 animate · 0 error / 1 warn(17px 微标签为设计选择)。