waapi について
FrameVideo向けに、ブラウザーのWeb Animations APIでシーク可能なコンポジションを作るスキルです。外部ライブラリを使わず、軽量なDOMアニメーションやキーフレーム生成に利用できます。
主な機能
- 01依存ライブラリ不要のキーフレームアニメーション
- 02DOMの変形と不透明度の動き
- 03ブラウザー標準のアニメーションエンジン
- 04構造化データからのアニメーション生成
- 05FrameVideo時刻へのシーク
活用シーン
- 01キーフレームによるDOM要素のアニメーション
- 02構造化データからの動きの生成
- 03ライブラリなしでシンプルなシーク可能なタイムラインを作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ chanjing-ai/ framevideo --skill waapiインストール後、Claude Code で/waapiを入力して読み込まれたか確認します。
詳細
FrameVideo 向け Web Animations API
使用する場面
次の場合は WAAPI を使用します。
- 依存関係のないアニメーション — 外部ライブラリは不要です
- 軽量な DOM の動き — シンプルな変形や不透明度の変更に適しています
- ブラウザーのネイティブなパフォーマンス — ブラウザーに最適化されたキーフレームエンジンを使用します
- 生成されるアニメーション — 構造化データからアニメーションを作成します
- バンドルサイズを最小限に抑えたい場合 — 数 KB も無駄にできない場合に適しています
使用しないでください
次の場合は WAAPI を避けてください。
- 複雑なタイムラインのシーケンス制御 —
gsapを使用します(タイムラインをより適切に制御できます) - デフォルトの選択肢 — 依存関係をなくすことが特に目的でなければ、
gsapを使用します - CSS のみで実現できる装飾 —
css-animationsを使用します(よりシンプルです) - 3D/WebGL —
threeを使用します - デザイナーによるエクスポート —
lottieを使用します
クイックスタート
FrameVideo での基本的な WAAPI アニメーション:
<div id="orb" class="clip orb" data-start="2" data-duration="3">Animate me</div>
<script>
const orb = document.getElementById("orb");
const animation = orb.animate(
[
{ transform: "translateX(-160px) scale(0.8)", opacity: 0 },
{ transform: "translateX(0) scale(1)", opacity: 1, offset: 0.35 },
{ transform: "translateX(120px) scale(1.08)", opacity: 1 },
],
{
duration: 3000,
delay: 2000,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both", // REQUIRED for FrameVideo
iterations: 1,
},
);
animation.pause(); // Pause immediately
</script>
重要なポイント:
- シークした状態を維持するには
fill: "both"を使用します - 作成後に
animation.pause()を呼び出します - 有限の
iterationsを使用します
契約
- コンポジションの初期化中に、アニメーションを同期的に作成します。
- 有限の
durationとiterationsを指定してelement.animate(...)を使用します。 - シークした状態を維持するため、
fill: "both"を使用します。 - 作成後にアニメーションを一時停止するか、アダプターによる最初のシーク時の一時停止に任せます。
- レンダリングに不可欠な状態には、コールバックやプロミスを使用しないでください。
アダプターは document.getAnimations() を呼び出し、各アニメーションの currentTime を FrameVideo のミリ秒単位の時間に設定してから、一時停止します。
基本パターン
<div id="orb" class="clip orb" data-start="2" data-duration="3" data-track-index="2"></div>
<script>
const orb = document.getElementById("orb");
const animation = orb.animate(
[
{ transform: "translate3d(-160px, 0, 0) scale(0.8)", opacity: 0 },
{ transform: "translate3d(0, 0, 0) scale(1)", opacity: 1, offset: 0.35 },
{ transform: "translate3d(120px, 0, 0) scale(1.08)", opacity: 1 },
],
{
duration: 3000,
delay: 2000,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both",
iterations: 1,
},
);
animation.pause();
</script>
スタッガーパターン
document.querySelectorAll(".token").forEach((token, index) => {
const animation = token.animate(
[
{ transform: "translateY(24px)", opacity: 0 },
{ transform: "translateY(0)", opacity: 1 },
],
{
duration: 620,
delay: index * 80,
easing: "cubic-bezier(0.2, 0, 0, 1)",
fill: "both",
iterations: 1,
},
);
animation.pause();
});
適切な用途
- CSS キーフレームでは柔軟性が足りず、GSAP を使うほどでもない場合の、軽量な DOM の動き。
- 構造化データから生成されるアニメーション。
- キーフレーム、遅延、オフセットで表現できるシンプルなタイムライン。
避けること
- 無限の
iterations。 animation.finishedに依存して、レンダリングに不可欠な DOM を変更すること。requestAnimationFrame、タイマー、performance.now()を使って別の時計を動かすこと。- 変形や不透明度で動きを表現できる場合に、レイアウトプロパティをアニメーションさせること。
- クリップのローカル開始時刻が自動的に設定されると想定すること。WAAPI アダプターはドキュメントレベルのアニメーション時間をシークします。クリップのオフセットは
delayでモデル化するか、表示状態を FrameVideo のタイミングで制御する要素上にアニメーションを作成してください。
検証
WAAPI コンポジションを編集した後:
npx framevideo lint # Check structure
npx framevideo validate # Check runtime errors
npx framevideo preview # Scrub timeline to verify seekability
手動確認:
- フィルモード — すべてのアニメーションで
fill: "both"を使用している - 一時停止状態 — 作成後にアニメーションが一時停止されている
- 有限の繰り返し回数 — 無限ループがない
- シーク可能性 — プレビューをスクラブすると、どのフレームでもアニメーションがその状態を維持する
- パフォーマンス — レイアウトプロパティより変形や不透明度を優先する
クレジットと参考資料
- FrameVideo アダプターのソース:
packages/core/src/runtime/adapters/waapi.ts。 - MDN Web Animations API ガイド:https://developer.mozilla.org/docs/Web/API/Web_Animations_API/Using_the_Web_Animations_API
- MDN
Animation.currentTime:https://developer.mozilla.org/en-US/docs/Web/API/Animation/currentTime
コメント
Markdown 対応