1仕組みと動作原理
1つのマスタータイムラインを軸に構成:単一の playhead と相対位置パラメータおよびラベルを用い、複数段階のアニメーションを seek 可能な一体として編成する。
Prefer one timeline over many independent tweens — it gives a single playhead, relative positioning, and easy reversal.
スクロール駆動は ScrollTrigger の 4 つの要素(start/end/pin/scrub)を軸とし、スクラブされる tween にはスクロールと線形に対応させるため ease: none が必須であることを強調する。
start: "top top", // when trigger top hits viewport top
Lenis スムーススクロールと ScrollTrigger のジッター、ズレ、固定外れは同一の根本原因(2 つのアニメーションループが独立して tick すること)に起因しており、解決策は単一ループ化(ticker で Lenis を駆動し、Lenis のスクロールごとに ScrollTrigger を更新)である。
lenis.on("scroll", ScrollTrigger.update); // 1. update ScrollTrigger on every Lenis scroll
テキストリビールとレイアウト遷移には専用プリミティブを使用:SplitText(フォント読み込み待ち、行マスク用の overflow:hidden、DOM 復帰のための revert)と 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外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| 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推奨統制措置と判定根拠
- 网络端点: 外部ネットワークアクセスの申告: 実行時の外部通信はゼロ。納品テンプレート examples/standalone-template.html は cdnjs から gsap 3.13.0 を取得(成果物時点の参照であり、実行時の送信ではない)
- 本地工作目录: ファイル読み書きおよび成果物出力: 本スキルディレクトリ内へのディスク書き込みはゼロ。agent が直接書き出す成果物としての単一の自己完結型 .html またはユーザープロジェクト内の 1 モジュール
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…