はじめに:なぜ今この4つの手法を理解すべきか
ウェブインタラクションは年々高度化しています。ユーザーがスクロールするたびに要素が滑らかに反応し、ページ遷移も自然なエフェクトでつなぎたい——そんな要求を、CSSだけでも十分に実現できる時代が来ました。
しかし、Scroll-Driven Animation、Scroll-Triggered Animation、Container Query Scroll State、View Transition——名前だけ聞くと混乱しますよね。この記事では、それぞれの概念を明確に区別し、実際のコードとともに違いを理解できるように解説します。
本記事は CSS-Tricksの元記事 を参考に、日本の開発者向けに再構成しています。

本論1:4つの手法の核となる違い
1. Scroll-Driven Animations(スクロールドリブンアニメーション)
最も直感的な概念です。スクロールの進行度とアニメーションの進行度が1:1で連動します。前にスクロールすればアニメーションも前に進み、戻せば逆再生。止めればその場で停止します。
/* 要素がスクロールに応じて透明度0→1に変化 */
.element {
animation: fade-in linear forwards;
animation-timeline: scroll();
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
実務のポイント: animation-timeline: scroll() はデフォルトでルートスクロールコンテナを基準にします。特定の要素内のスクロールに反応させたい場合は scroll(block nearest) などのオプションを指定してください。
2. Scroll-Triggered Animations(スクロールトリガーアニメーション)
こちらはスクロール位置が特定の閾値を超えたら、アニメーションが最初から最後まで一度だけ実行されます。スクロールの進行度とは無関係に、トリガーされればフルアニメーションが動きます。
/* Intersection Observer を利用した従来の方法 */
@keyframes slide-up {
from { transform: translateY(50px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.triggered {
animation: slide-up 0.6s ease-out forwards;
/* アニメーションは一度だけ実行 */
}
補足: 純粋なCSSだけでscroll-triggeredを完全にサポートする仕様はまだありません。通常はIntersection Observer APIと組み合わせるか、
animation-play-stateをトグルする方法で実装します。ただし最新のCSS仕様で議論が進んでいるので、今後の動向に注目です。
3. Container Query Scroll State(コンテナクエリスクロール状態)
これはまだワーキングドラフト(Working Draft)段階ですが、非常に興味深い概念です。コンテナが特定のスクロール状態(例:sticky状態に達した)にあるときにスタイルを変更できます。
.sticky-nav {
container-type: scroll-state;
position: sticky;
top: 0;
}
/* コンテナがtopに貼り付いたときのスタイル */
@container scroll-state(stuck: top) {
.sticky-nav {
background: orangered;
border-radius: 0;
flex-direction: row;
width: 100%;
}
.sticky-nav a {
text-decoration: none;
}
}
注意点: 現時点ではブラウザのサポートは皆無です。Chrome Canaryでフラグを有効にしてテストできますが、プロダクション投入はまだ早いでしょう。ただし概念を先取りしておけば、標準化されたときにすぐ活用できます。
4. View Transition(ビュートランジション)
これはスクロールとはまったく別のAPIです。同一ドキュメント内の状態変化(例:ラジオボタンのチェック切り替え)や、ドキュメント間の移動(ページA→ページB)にスムーズなトランジション効果を与えます。
// 同一ドキュメント遷移:ラジオボタンの状態変更時
const radio = document.querySelector('input[type="radio"]');
radio.addEventListener('change', (e) => {
if (!document.startViewTransition) {
// フォールバック:直接更新
updateUI(e.target.value);
return;
}
// View Transition APIでラップ
const transition = document.startViewTransition(() => {
updateUI(e.target.value);
});
});
/* クロスドキュメントの基本設定(ページ間クロスフェード) */
@view-transition {
navigation: auto;
}
実務のポイント: クロスドキュメントのView Transitionは現在Chrome 111+でサポートされています。SafariとFirefoxは未サポートのため、プログレッシブエンハンスメント(段階的機能拡張)の戦略を取るのが無難です。

本論2:比較表で一目瞭然
| タイプ | 動作方式 | スクロール進行度との関係 | 主なユースケース | ブラウザサポート状況 |
|---|---|---|---|---|
| Scroll-Driven Animations | スクロール方向と速度に直接連動 | 1:1マッピング | パララックス、進捗バー、スクロールベースのグラフ | Chrome 115+, Firefox? (実験的) |
| Scroll-Triggered Animations | 要素がビューポートに入ったら一度だけ実行 | 無関係 | フェードイン、スライドアップ、リスト出現効果 | Intersection Observer が必要(汎用) |
| Container Query Scroll State | コンテナが特定のスクロール条件(stuck)に達したらスタイル変更 | 条件付き | Stickyナビゲーションのスタイル変更、固定ヘッダー効果 | ドラフト段階 (Chrome Canary) |
| View Transition | 状態変化またはページ移動時にスムーズな遷移 | 無関係 | SPA遷移、ダークモードトグル、リストフィルタリング | Chrome 111+, Safari? (部分対応) |
日本市場での適用コンテクスト
日本のウェブサービス(ECサイト、ニュースメディア、コミュニティ)では、ユーザー体験(UX)向上のためにスクロールベースのアニメーション導入が進んでいます。特に:
- Scroll-Driven Animations: 商品一覧でスクロールに応じてフィルターが強調される演出
- View Transition: React/VueベースのSPAで、ページ遷移時のチラつきを抑えたスムーズな切り替え
ただし、日本ではまだIE11や古いブラウザを考慮するケース(特に政府系・金融系)も少なくありません。プログレッシブエンハンスメントを徹底し、@supports で機能の有無をチェックしてから適用するのが安全です。
@supports (animation-timeline: scroll()) {
/* 最新ブラウザのみ適用 */
.progress-bar {
animation: grow linear forwards;
animation-timeline: scroll();
}
}
/* フォールバック:基本スタイル */
.progress-bar {
width: 0%;
transition: width 0.3s ease;
}
この技術の限界または注意点
- ブラウザ互換性: 特にContainer Query Scroll Stateは実験段階です。プロダクションに即導入するのではなく、プロトタイプやサイドプロジェクトで試すことをおすすめします。
- パフォーマンス: 過剰なスクロールアニメーションはメインスレッドに負荷をかけます。
will-changeを適切に使い、レイアウト変更を最小限にしましょう。 - アクセシビリティ: ユーザーがモーション軽減(Reduce Motion)を設定している場合があります。必ず
prefers-reduced-motionメディアクエリを考慮してください。
@media (prefers-reduced-motion: reduce) {
.element {
animation: none !important;
}
}
次のステップとしての学習方向
- Scroll-Driven Animations をさらに深掘りしたい方は MDNのanimation-timelineドキュメント をご覧ください。
- View Transition API を実際のプロジェクトで使う方法は Chrome Developersガイド が詳しいです。
- 合わせて読みたい記事:

まとめ:実務適用のアドバイスと結び
今回、4つのCSSアニメーション手法の違いと、それぞれの実務での活用方法を見てきました。重要なのは目的に合った道具を選ぶことです。
- スクロール進行度に応じて要素を精密に動かしたい → Scroll-Driven Animations
- 要素が出現するときに一度だけアニメーションを付けたい → Scroll-Triggered Animations (Intersection Observer)
- ナビゲーションバーが固定されたときにスタイルを変えたい → Container Query Scroll State (将来技術)
- ページ遷移を滑らかにしたい → View Transition API
すべての技術が完全にサポートされているわけではありませんが、先取りして学んでおくことは、標準化されたときの大きなアドバンテージになります。特に日本市場ではユーザー体験の向上がますます重要視されているため、これらの手法をプロジェクトに少しずつ取り入れてみることをおすすめします。
質問や実際の適用事例があれば、コメントで共有してください!一緒に学び合える開発者コミュニティを育てていきましょう。