scroll-animations について
フロントエンドのデザイナーや開発者向けに、Disney の 12 のアニメーション原則をスクロール連動の動きに応用するスキルです。発火タイミング、パララックス、実装パターン、動きを抑える設定への代替案を扱います。
主な機能
- 01スクロール動作へのアニメーション原則の応用
- 02スクロール発火タイミングの指針
- 03Intersection Observer のパターン
- 04CSS スクロール連動アニメーション
- 05動きを抑える設定への代替案
活用シーン
- 01スクロールに応じたコンテンツ表示
- 02パララックスや固定ヘッダーの動作追加
- 03スクロール進捗バーのアニメーション
- 04動きを抑える設定への対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dylantarre/ animation-principles --skill scroll-animationsインストール後、Claude Code で/scroll-animationsを入力して読み込まれたか確認します。
詳細
スクロールアニメーション
スクロールをトリガーとする動きに、ディズニーの12の原則を適用します。
原則の適用
スクワッシュ&ストレッチ:高速スクロール中は要素をわずかに圧縮し、スクロールが止まったら元の状態に落ち着かせます。
予備動作:コンテンツは完全に表示される前に、わずかに見えるようにします。表示率が10~20%になった時点でアニメーションを開始します。
演出:コンテンツは読み進める順序で表示します。上から下へ、左から右へと進行させます。
ストレート・アヘッドとポーズ・トゥ・ポーズ:「非表示」と「表示」の状態を明確に定義します。スクロール位置に応じて、その間を補間します。
フォロースルーとオーバーラッピング:表示を段階的にずらします。最初の要素はビューポートの20%で、次の要素は25%でトリガーする、といった具合です。
スローイン・スローアウト:スクロールによってトリガーされる表示には、イーズアウトを使用します。コンテンツが所定の位置に落ち着きます。
弧:視差効果のある要素は、スクロールに応じて曲線を描くように動きます。縦スクロールに合わせて、わずかな横方向のずれを加えます。
副次動作:フェード、スライド、スケールを組み合わせることで、より豊かな表示を実現できます。
タイミング:
- 表示アニメーション:400~600ms(スクロールを続けられるようにします)
- 視差効果:リアルタイム、1:1または分数比
- スティッキー遷移:200~300ms
誇張:スクロールでは控えめにします。ペースはユーザーが操作します。スクロール速度そのものを誇張として活用します。
立体感のある描画:要素が突然ジャンプしたり、瞬間移動したりしてはいけません。すべてのスクロール位置で滑らかに補間します。
魅力:スクロールアニメーションは探索を促すものであり、妨げるものであってはなりません。
タイミングの推奨値
| スクロールアニメーション | 期間 | トリガー位置 | イージング |
|---|---|---|---|
| フェードイン | 500ms | 20%表示 | ease-out |
| 上方向スライド | 600ms | 15%表示 | ease-out |
| 視差効果 | リアルタイム | 継続 | linear |
| スティッキーヘッダー | 200ms | しきい値 | ease-out |
| プログレスバー | リアルタイム | 継続 | linear |
| セクション表示 | 600ms | 25%表示 | ease-out |
実装パターン
/* Scroll-triggered reveal */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 500ms ease-out, transform 600ms ease-out;
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* CSS-only parallax */
.parallax-container {
perspective: 1px;
overflow-y: auto;
}
.parallax-slow {
transform: translateZ(-1px) scale(2);
}
Intersection Observer パターン
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
},
{ threshold: 0.2, rootMargin: '0px 0px -10% 0px' }
);
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
スクロール連動アニメーション(CSS)
@keyframes reveal {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
.scroll-reveal {
animation: reveal linear both;
animation-timeline: view();
animation-range: entry 0% entry 50%;
}
主なルール
- スクロールを妨げたり、スクロールの動作を乗っ取ったりしないでください
- アニメーションは、正確なスクロール位置を要求せず、ビューポート内で完了するようにしてください
- アニメーションが画面全体に表示される前に完了するよう、早めに(10~20%表示で)トリガーしてください
prefers-reduced-motionの代替動作を用意してください。即時表示にし、視差効果は使いません- モバイルでテストしてください。スクロールアニメーションは60fpsで滑らかに動作する必要があります