gsap について
HyperFramesのコンポジション向けにGSAPのアニメーション制作を案内するスキルです。トゥイーンやタイムライン、変換、イージング、レスポンシブ表現に加え、シーク可能な一時停止タイムラインなどの要件を扱います。
主な機能
- 01トゥイーンとタイムラインの作成
- 02変換エイリアスとCSSアニメーション
- 03イージング、スタッガー、関数値
- 04matchMediaによるレスポンシブ対応
- 05有限でシーク可能なタイムライン
活用シーン
- 01コンポジションの入場やトランジションの演出
- 02タイムラインラベルによる動きの構成
- 03メディアクエリに応じたアニメーション調整
- 04HyperFramesからシークできる演出の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ heygen-com/ hyperframes --skill gsapインストール後、Claude Code で/gsapを入力して読み込まれたか確認します。
同梱ファイルreferences/effects.mdscripts/extract-audio-data.py
詳細
GSAP
HyperFrames の規約
HyperFrames は gsap ランタイムアダプターを通じて GSAP を制御します。一時停止状態のタイムラインを同期的に作成し、正確な data-composition-id を付けて window.__timelines に登録し、HyperFrames にシークさせます。
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
tl.from(".title", { y: 48, opacity: 0, duration: 0.6, ease: "power3.out" }, 0);
tl.to(".accent", { scaleX: 1, duration: 0.5, ease: "power2.out" }, 0.25);
window.__timelines["main"] = tl; // key must equal data-composition-id on the composition root
</script>
- レジストリーキーは、コンポジションルートの
data-composition-idと一致させる必要があります。 - レンダリングに不可欠なモーションでは、
tl.play()を呼び出さないでください。 - 非同期コード、タイマー、イベントハンドラー内でタイムラインを作成しないでください。
- ループは有限にしてください。HyperFrames は有限の動画尺をレンダリングします。
基本的なトゥイーンメソッド
- gsap.to(targets, vars) — 現在の状態から
varsの状態までアニメーションさせます。最も一般的です。 - gsap.from(targets, vars) —
varsの状態から現在の状態までアニメーションさせます(登場時のアニメーション)。 - gsap.fromTo(targets, fromVars, toVars) — 開始状態と終了状態を明示します。
- gsap.set(targets, vars) — 即座に適用します(duration 0)。
プロパティ名には必ず camelCase を使用してください(例:backgroundColor、rotationX)。
よく使う変数
- duration — 秒数(デフォルトは 0.5)。
- delay — 開始までの秒数。
- ease —
"power1.out"(デフォルト)、"power3.inOut"、"back.out(1.7)"、"elastic.out(1, 0.3)"、"none"。 - stagger — 数値
0.1またはオブジェクト:{ amount: 0.3, from: "center" }、{ each: 0.1, from: "random" }。 - overwrite —
false(デフォルト)、true、または"auto"。 - repeat — 有限の数値。HyperFrames では
-1を指定しないでください。表示される尺に基づいて繰り返し回数を計算します。yoyo — 繰り返しごとに方向を切り替えます。 - onComplete、onStart、onUpdate — コールバック。
- immediateRender — from()/fromTo() のデフォルトは
trueです。同じプロパティと要素を対象とする後続のトゥイーンで上書きを避けるには、falseに設定してください。
トランスフォームと CSS
生の transform 文字列より、GSAP の トランスフォームエイリアスを優先してください。
| GSAP プロパティ | 相当するもの |
|---|---|
x、y、z | translateX/Y/Z (px) |
xPercent、yPercent | translateX/Y (%) |
scale、scaleX、scaleY | scale |
rotation | rotate (deg) |
rotationX、rotationY | 3D rotate |
skewX、skewY | skew |
transformOrigin | transform-origin |
- autoAlpha —
opacityよりこちらを優先してください。0 の場合、visibility: hiddenも設定されます。 - CSS 変数 —
"--hue": 180。 - svgOrigin (SVG のみ) — グローバルな SVG 座標空間の原点です。
transformOriginと組み合わせないでください。 - 方向付き回転 —
"360_cw"、"-170_short"、"90_ccw"。 - clearProps —
"all"またはカンマ区切りの値。完了時にインラインスタイルを削除します。 - 相対値 —
"+=20"、"-=10"、"*=2"。
関数ベースの値
gsap.to(".item", {
x: (i, target, targets) => i * 50,
stagger: 0.1,
});
イージング
組み込みのイージング:power1~power4、back、bounce、circ、elastic、expo、sine。それぞれに .in、.out、.inOut があります。
デフォルト
gsap.defaults({ duration: 0.6, ease: "power2.out" });
トゥイーンの制御
const tween = gsap.to(".box", { x: 100 });
tween.pause();
tween.play();
tween.reverse();
tween.kill();
tween.progress(0.5);
tween.time(0.2);
gsap.matchMedia()(レスポンシブ対応とアクセシビリティ)
メディアクエリーに一致した場合にのみセットアップを実行し、一致しなくなると自動的に元の状態に戻します。
let mm = gsap.matchMedia();
mm.add(
{
isDesktop: "(min-width: 800px)",
reduceMotion: "(prefers-reduced-motion: reduce)",
},
(context) => {
const { isDesktop, reduceMotion } = context.conditions;
gsap.to(".box", {
rotation: isDesktop ? 360 : 180,
duration: reduceMotion ? 0 : 2,
});
},
);
タイムライン
タイムラインの作成
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } });
tl.to(".a", { x: 100 }).to(".b", { y: 50 }).to(".c", { opacity: 0 });
位置パラメーター
3 番目の引数で配置を指定します。
- 絶対位置:
1— 1 秒時点 - 相対位置:
"+=0.5"— 終了後、"-=0.2"— 終了前 - ラベル:
"intro"、"intro+=0.3" - 位置合わせ:
"<"— 前のトゥイーンと同時に開始、">"— 前のトゥイーンの終了後に開始、"<0.2"— 前のトゥイーンの開始から 0.2 秒後
tl.to(".a", { x: 100 }, 0);
tl.to(".b", { y: 50 }, "<"); // same start as .a
tl.to(".c", { opacity: 0 }, "<0.2"); // 0.2s after .b starts
ラベル
tl.addLabel("intro", 0);
tl.to(".a", { x: 100 }, "intro");
tl.addLabel("outro", "+=0.5");
tl.play("outro");
tl.tweenFromTo("intro", "outro");
タイムラインのオプション
- paused: true — 一時停止状態で作成します。開始するには
.play()を呼び出します。 - repeat、yoyo — タイムライン全体に適用します。
- defaults — すべての子トゥイーンにマージされる変数です。
タイムラインのネスト
const master = gsap.timeline();
const child = gsap.timeline();
child.to(".a", { x: 100 }).to(".b", { y: 50 });
master.add(child, 0);
再生の制御
tl.play()、tl.pause()、tl.reverse()、tl.restart()、tl.time(2)、tl.progress(0.5)、tl.kill()。
パフォーマンス
トランスフォームと不透明度を優先する
x、y、scale、rotation、opacity のアニメーションはコンポジター上で処理されます。トランスフォームで同じ効果を実現できる場合は、width、height、top、left を避けてください。
will-change
will-change: transform;
実際にアニメーションする要素にのみ使用します。
頻繁な更新には gsap.quickTo()
let xTo = gsap.quickTo("#id", "x", { duration: 0.4, ease: "power3" }),
yTo = gsap.quickTo("#id", "y", { duration: 0.4, ease: "power3" });
container.addEventListener("mousemove", (e) => {
xTo(e.pageX);
yTo(e.pageY);
});
多数のトゥイーンには stagger を使用
個別のトゥイーンに手動で遅延を設定する代わりに、stagger を使用します。
クリーンアップ
画面外のアニメーションは一時停止または停止します。
参考資料(必要に応じて読み込み)
- references/effects.md — すぐに使えるエフェクト:タイプライター風テキスト、オーディオビジュアライザー。HyperFrames 用の既製エフェクトパターンが必要なときに読みます。
ベストプラクティス
- プロパティ名にはキャメルケースを使用し、transform のエイリアスと autoAlpha を優先します。
- delay を使った連結より、タイムラインを優先します。position パラメーターを使用します。
addLabel()でラベルを追加し、シーケンスを読みやすくします。- タイムラインのコンストラクターにデフォルト値を渡します。
- 再生を制御する場合は、トゥイーンまたはタイムラインの戻り値を保存します。
してはいけないこと
- transform で対応できる場合に、レイアウトプロパティ(width/height/top/left)をアニメーションさせないでください。
- 同じ SVG 要素で svgOrigin と transformOrigin の両方を使用しないでください。
- タイムラインで順序を指定できる場合に、delay を使ってアニメーションを連結しないでください。
- DOM が存在する前にトゥイーンを作成しないでください。
- クリーンアップを省略しないでください。不要になったトゥイーンは必ず停止してください。
- HyperFrames のコンポジションで無限の repeat 値を使用しないでください。表示時間から計算した有限の繰り返し回数を使用します。
クレジットと参考資料
- HyperFrames アダプターのソース:
packages/core/src/runtime/adapters/gsap.ts。 - GSAP のドキュメント:https://gsap.com/docs/v3/
- GSAP タイムラインの一時停止とシークの動作:https://gsap.com/docs/v3/GSAP/Timeline/pause%28%29/