编排进阶:序列、依赖、二维交错
多段动画凑在一起,问题从「一段怎么动」变成「彼此何时动」。三种编排手法各有适用面:
序列把若干段首尾相接排在一条时间轴上,布局在排布时就一次算定;依赖不预先排布,而是用
每段的完成回调 (onComplete) 触发下一段,适合时长在运行时才确定的情形;二维交错给一组
网格元素同一段入场动画、各自一点递增的 delay,延迟来自该元素在某条空间轴上到发起点的距离。
序列 sequence:同一条时间轴上首尾相接
三段动画交给 timeline,at 省略时每段从上一段结束处起步 (A 完 → B 起 → C 起),
于是 A、B、C 依次推进。这与「三段同时播放」的区别在于:序列的总时长是三段之和,任意时刻只有一段在动。
下方泳道是引擎排定的 start / end 布局,红线为播放头;时间线本身是一个「值即全局时间」的主动画,
play / 反向 / seek 全部免费继承。
编排布局 (引擎算出的 start / end) + 播放头
依赖 dependency:用完成回调触发下一段
序列要求各段时长提前已知才能排布;若下一段的参数或时长需等上一段跑完才确定,就改用事件式串接:
给每段一个 onComplete,在其中启动后继段。下面 A 跑完触发 B、B 跑完触发 C,每次衔接还可插入
一段 delay 作为停顿。状态条实时反映各段处于 等待 / 运行 / 完成 哪个阶段。
二维交错 2D stagger:延迟来自空间距离
一维 stagger 的 delay 取决于元素到发起点的索引距离。推广到网格,只需把「距离」换成二维量:
按行 (行号)、按列 (列号)、对角 (行+列)、从中心扩散 (到中心格的棋盘距离)。选不同策略,同一组方块就以不同
的波形入场。每个方块的 delay 仍由 stagger 按它在所选轴上的位置算出。
timeline 默认衔接) 是把各段首尾相接,总时长为各段之和,任意时刻只有一段在推进。两者
都由一个主时钟分发全局时间,差别只在每段的 start 落在哪里。
stagger(each,{from}) 返回 (index,total)→delay,
delay 正比于该元素到发起点的距离除以最大距离 (再过可选 ease)。一维时距离是索引差;二维交错的做法
是先把网格每格映射到一条空间轴上的位置 (行号 / 列号 / 行+列 / 到中心的棋盘距离),再把这个位置当作
index 交给同一个 stagger。换轴即换波形,引擎本身不必改。
每段「跳一下 / 滑过去」的快慢由关键帧与编排里的基础 timeline / stagger 给出; 整条编排如何被一个游标驱动、可暂停可反向见播放控制。