前端开发
多步 GSAP 动画需要排序或编排时,用 timeline…
需要把多个 GSAP tween 按顺序、并行或相对时间编排,并控制整体播放、标签和嵌套时适用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
多步 GSAP 动画需要排序或编排时,用特定
解决思路
- 创建时间线:调用 `gsap.timeline()` 得到 `tl`,然后用 `tl.to(".a", { x: 100, duration: 1 }).to(".b", { y: 50, duration: 0.5 }).to(".c", { opacity: 0, duration: 0.3 })` 把多个 tween 串联。
- 默认行为:tween 会被追加(appended),一个接一个执行;用位置参数可放置到特定时间或相对其他 tween。
- 使用位置参数:第三参数(或 vars 中的 position 属性)控制放置。
- 绝对位置:传 `1` 表示从 1 秒开始;示例 `tl.to(".a", { x: 100 }, 0);`。
- 相对位置(默认):用 `"+=0.5"` 表示上一个结束后 0.5 秒;用 `"-=0.2"` 表示上一个结束前 0.2 秒。
- 相对位置示例:`tl.to(".b", { y: 50 }, "+=0.5");`。
- 标签位置:用 `"labelName"` 让 tween 在该标签处开始;用 `"labelName+=0.3"` 让 tween 在标签后 0.3 秒开始。
- 放置参数:用 `"<"` 表示与最近添加的动画同时开始;用 `">"` 表示在最近添加的动画结束时开始(默认);用 `"<0.2"` 表示在最近添加的动画开始后 0.2 秒开始。
- 放置参数示例:`tl.to(".c", { opacity: 0 }, "<");`、`tl.to(".d", { scale: 2 }, "<0.2");`。
- 设置 timeline defaults:传入 `{ defaults: { duration: 0.5, ease: "power2.out" } }`,让所有子 tween 继承 duration、ease 等。
- defaults 示例:`const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } }); tl.to(".a", { x: 100 }).to(".b", { y: 50 }); // 两者都使用 0.5s 和 power2.out`。
- 构造器选项 `paused: true`:创建暂停的 timeline;调用 `.play()` 启动。
- 构造器选项 `repeat`、`yoyo`:与 tween 相同,作用于整个 timeline。
- 构造器选项 `onComplete`、`onStart`、`onUpdate`:设置 timeline 级回调。
- 构造器选项 `defaults`:将 vars 合并到每个子 tween。
- 标签:用 `tl.addLabel("intro", 0)` 添加标签;在 tween 位置参数中使用 `"intro"`。
- 标签:用 `tl.addLabel("outro", "+=0.5")` 添加相对标签;在 tween 位置参数中使用 `"outro"`。
- 标签播放:用 `tl.play("outro")` 从 "outro" 开始播放。
- `tl.tweenFromTo("intro", "outro")`:暂停 timeline,并返回一个新 Tween,让 timeline 的 playhead 从 "intro" 到 "outro" 无缓动地动画。
- 嵌套 timeline:创建 `master` 和 `child` timeline;在 `child` 中串联 tween,例如 `child.to(".a", { x: 100 }).to(".b", { y: 50 });`。
- 嵌套 timeline:用 `master.add(child, 0)` 把 child 加到 master 的 0 秒处。
- 嵌套 timeline 后续:用 `master.to(".c", { opacity: 0 }, "+=0.2")` 继续在 master 上添加 tween。
- 控制播放:用 `tl.play()` / `tl.pause()` 播放或暂停。
- 控制播放:用 `tl.reverse()` 反向;或先 `tl.progress(1)` 再 `tl.reverse()`。
- 控制播放:用 `tl.restart()` 从头开始。
- 控制播放:用 `tl.time(2)` 定位到 2 秒。
- 控制播放:用 `tl.progress(0.5)` 定位到 50%。
- 控制播放:用 `tl.kill()` 杀死 timeline,并默认杀死其子项。
- 最佳实践:优先用 timeline 进行排序。
- 最佳实践:使用位置参数(第三参数)把 tween 放到特定时间或相对标签的位置。
- 最佳实践:用 `addLabel()` 添加标签,使排序可读、可维护。
- 最佳实践:把 `defaults` 传入 timeline 构造器,让子 tween 继承 duration、ease 等。
- 最佳实践:把 ScrollTrigger 放在 timeline(或顶层 tween)上,不要放在 timeline 内部的 tween 上。
- 不要:当 timeline 可以排序时,不要用 `delay` 串联动画;多步动画优先用 `gsap.timeline()` 和位置参数。
- 不要:当许多子 tween 共享相同 duration 或 ease 时,不要忘记传入 `defaults`,例如 `{ duration: 0.5, ease: "power2.out" }`。
- 不要:不要忘记 timeline 构造器上的 `duration` 与 tween duration 不同;timeline 的 duration 由其子项决定。
- 不要:不要嵌套包含 ScrollTrigger 的动画;ScrollTrigger 只应放在顶层 Tween/Timeline 上。
适用边界 · 注意事项
- 单一 tween 和 eases 需求:改用 gsap-core。
- 滚动驱动的 timeline:改用 gsap-scrolltrigger。
- React 集成:改用 gsap-react。