1实现原理 · 为什么它能做到
以一条主时间线为组织原则:单 playhead 加相对定位与标签,把多段动效编排成一个可 seek 的整体
Prefer one timeline over many independent tweens — it gives a single playhead, relative positioning, and easy reversal.
滚动驱动靠 ScrollTrigger 的 start/end/pin/scrub 四要素,并强调 scrubbed tween 用 ease: none 才与滚动线性对应
start: "top top", // when trigger top hits viewport top
Lenis 平滑滚动与 ScrollTrigger 的抖动、漂移、断钉有同一根因(两个动画循环独立 tick),解法是一个循环:ticker 驱动 Lenis、每次 Lenis 滚动更新 ScrollTrigger
lenis.on("scroll", ScrollTrigger.update); // 1. update ScrollTrigger on every Lenis scroll
文本揭示与布局过渡各有专用原语:SplitText(先等字体加载、行掩膜需 overflow:hidden、revert 还原 DOM)与 Flip(先取 state,再立即改 DOM,最后动画差值)
Always split AFTER web fonts load (`document.fonts.ready.then(...)`) to prevent wrong line breaks.
SPA 与框架里必须做一次性清理:gsap.context() 或 useGSAP 的 ctx.revert() 杀掉 tween、ScrollTrigger 与内联样式,否则触发器泄漏、幽灵钉住堆叠
return () => ctx.revert(); // kills tweens, triggers, and reverts inline styles
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | gsap 及插件 ScrollTrigger / SplitText / Flip(正文口径:3.12+ 全部免费含商用) |
| network | 交付模板从 cdnjs 取 GSAP(产物期引用,浏览器打开时拉取;执行期本 skill 不请求) |
| package | lenis(平滑滚动,与 ScrollTrigger 单循环同步;Locomotive 走 scrollerProxy 变体) |
| package | @gsap/react(useGSAP)与 React 清理路径 |
| cli | npx / Playwright(宿主侧截图工具)与仓库根 scripts/ 助手(seek-shot.sh、contact-sheet.sh 依赖 ffmpeg) |
4风险提醒 风险提醒:绿色 · 放心使用
- 插件许可与版本声明无法在源码内核实(见 second_pass) — 3.12+ 全部免费含商用对商用决策有实质影响,但仓库内无依据文件;使用前应按 gsap 官方许可自行确认。
- 版本漂移敏感 — examples 模板钉 cdnjs 的 3.13.0,正文多处提到 3.12+ 与 3.13+ 的 API 差异(SplitText 类名、Flip absolute、ticker.lagSmoothing),跨版本行为变化会直接影响可运行性。
- Lenis 与 Locomotive 组合是高频故障面 — 即使有症状成因表,仍需正确区分 Lenis(走文档滚动,禁 scrollerProxy)与 Locomotive(必须 scrollerProxy 加 pinType);配错会出现钉住断裂、滚动反向等看似引擎 bug 的现场。
- Packaged helper 路径以仓库根为基准,且 references 尾部带 iart.ai utm 推广链 — 单装时 scripts/seek-shot.sh 不可用;references/scrolltrigger-lenis.md 末行为 iart.ai 推广段(含 utm_term=gsap-web)。
5第二遍独立确认
- [unlocatable] GSAP 3.12+ 全部插件免费含商用这一许可声明是否可在源码内核实 — SKILL.md 首段声明 As of GSAP 3.12+, every plugin (ScrollTrigger, SplitText, Flip, MotionPath, MorphSVG, Draggable, Observer) is 100% free, including for commercial use. 但仓库内只有自身 MIT LICENSE,没有上游许可文件或链接,属外部事实声明,源码内不可复核,按文档声明记录。
- [ok] Lenis 同步的乘 1000 单位换算与不要再开 rAF 是否前后一致 — SKILL.md 三段互相印证:接线代码 gsap.ticker.add((t) => lenis.raf(t * 1000))、Critical 段明写 ticker 传秒而 raf 要毫秒、Common bugs 段把 leftover requestAnimationFrame(raf) loop 列为抖动根因;references 的调试清单第 1、2 条同样指向这两点。
- [ok] examples 里的两个文件是否真的可直接用 — hero-timeline.js 头注释给出所需 markup 与 CSS 前提(.line 需 overflow:hidden),并内置 document.readyState 自动启动;standalone-template.html 除 cdnjs GSAP 外无外部依赖,自带 ?t=N 冻结与 window.__ready,与 SKILL.md 的输出契约逐条对应。
- [discrepancy] Packaged helper 的路径基准 — SKILL.md 写 scripts/seek-shot.sh anim.html 0 1.5 3,但 scripts/ 在仓库根而非本 skill 目录(目录内只有 examples/ 与 references/),单装形态下该相对路径不成立;好在 examples/standalone-template.html 自带 harness,可自给自足。
6结论
1c57c75354a29de0…b6dba3eb75