タグアーカイブ コンテナクエリ

スクロール駆動アニメーションとスクロール状態、ビュー遷移の違いを整理

スクロール駆動アニメーションとスクロール状態、ビュー遷移の違いを整理

CSSのスクロール系アニメーションは混同しやすい概念が多い。スクロール駆動アニメーション、スクロールトリガーアニメーション、コンテナクエリのスクロール状態、そしてビュー遷移。いずれも「動き」を伴う機能だが、仕組みは大きく異なる。それぞれの動作を整理し、いつどの技術を使うべきかを明確にする。

CSS-Tricksの著者Geoff Graham氏も自身の記事で「言いたいことと意味することが違っていたり、必要な場面で別のものを選んでしまったりする」と述べており、開発者であれば誰もが直面する混乱だ。この記事では、4つの技術の本質的な違いをデモとともに確認していく。

スクロール駆動アニメーションとは

スクロール駆動アニメーションとは

スクロール駆動アニメーション(Scroll-Driven Animations)は、スクロールの進行状況とアニメーションの進行が直接連動する仕組みだ。ユーザーがスクロールバーを動かすとアニメーションが同じ比率で動き、スクロールを止めればアニメーションも止まる。逆方向にスクロールすれば、アニメーションも逆再生される。

これはつまり、スクロール位置がアニメーションのタイムラインを完全にコントロールすることを意味する。アニメーションの各フレームがスクロールの各ピクセルに紐づいているイメージだ。

スクロール駆動アニメーションの動作モデル
スクロール位置とアニメーション進行の関係
スクロール 0% → アニメーションも 0% 進行
スクロール 50% → アニメーションも 50% 進行
スクロール 100% → アニメーションも 100% 完了
双方向リンク:逆スクロールで逆再生

このデモで示すように、スクロール駆動アニメーションはスクロールという入力装置がそのままアニメーションの進行度を決める。ユーザーが任意の位置で停止できるし、前後にも動かせる。パララックス効果やプログレスバーなど、スクロールに完全に同期した視覚効果を作るのに向いている。

基本的なCSSの書き方

.element {
  animation: grow-progress linear forwards;
  animation-timeline: scroll();
}

animation-timeline: scroll() がキモだ。通常のアニメーションは時間ベースのタイムラインで動くが、これをscroll()にすることで、スクロール位置をタイムラインとして使えるようになる。これにより、スクロール量に応じて要素の透明度・サイズ・位置などを段階的に変化させられる。

スクロールトリガーアニメーションとは

スクロールトリガーアニメーションとは

スクロールトリガーアニメーション(Scroll-Triggered Animations)は、スクロール駆動と名前が似ているが、動作原理はまったく異なる。こちらはスクロール位置とアニメーション進行が連動しない。ある要素が特定のしきい値(トリガー活性化範囲)を越えた瞬間にアニメーションが発火し、最後まで一気に実行される。

スクロール駆動 vs スクロールトリガーの動作比較
スクロール駆動(Before)
スクロール量に比例 → 連続的に変化
※スクロール停止でアニメーションも停止
スクロールトリガー(After)
しきい値で発火 → 最後まで一気に実行
※発火後はスクロールに影響されない

トリガーは要素がスクロールポートに「入った」「出た」といったイベントだ。アニメーションが走り出してしまえば、その後のスクロール操作は関係ない。スクロール駆動アニメーションが「巻き戻せるビデオテープ」だとすれば、スクロールトリガーアニメーションは「一度押したら最後まで流れる再生ボタン」だ。

どんな場面で使うか

画面に要素が現れた瞬間にフェードインさせたり、スライドインさせたりするUI演出が代表的な用途だ。一度表示された後にスクロールで逆再生する必要がなければ、トリガー方式のほうがシンプルで意図が明確になる。逆にパララックスやプログレスインジケーターのように常時追従が必要な場合は、スクロール駆動を使う。

コンテナクエリのスクロール状態

コンテナクエリのスクロール状態

コンテナクエリのスクロール状態(Container Query Scroll State)は、CSS Conditional Rules Module Level 5のワーキングドラフトに含まれる比較的新しい概念だ。一言でいうと、コンテナが特定のスクロール条件に達したときにスタイルを更新する仕組みである。

スクロール駆動とスクロールトリガーの中間のような動きをする。スクロール位置に応じて何かが変わる点では駆動に近いが、アニメーションではなく「状態の切り替え」を扱う点が異なる。

.sticky-nav {
  container-type: scroll-state;
  position: sticky;
  top: 0;

  @container scroll-state(stuck: top) {
    background: orangered;
    border-radius: 0;
    flex-direction: row;
    width: 100%;

    a {
      text-decoration: none;
    }
  }
}
scroll-state の動作イメージ
通常時(sticky未発動)
ロゴ
メニュー 1(下線あり)
メニュー 2(下線あり)
縦並び・角丸・リンク下線あり
スクロールで上部固定時(stuck: top)
ロゴ
メニュー 1
メニュー 2
横並び・角丸ゼロ・背景色変更・リンク下線消去

この例では、position: stickyのナビゲーションがビューポート上部に張り付いた瞬間にレイアウトや配色が切り替わる。JavaScriptなしでスクロールに応じた状態管理をCSSだけで行える点が強力だ。ただし、2026年6月時点ではまだワーキングドラフト段階であり、ブラウザの対応状況を確認してから使う必要がある。

ビュー遷移(View Transitions)

ビュー遷移(View Transitions)

ビュー遷移は、ここまでの3つとは根本的に異なる。スクロールとは関係がない。CSSとJavaScriptが連携する完全なAPIで、ページ遷移や同一ページ内の状態変化をアニメーションさせる仕組みである。

同一ドキュメント遷移

同一ドキュメント遷移(Same-document transitions)は、ユーザー操作によって同一ページ上の要素がある状態から別の状態へ変化する際に使う。たとえばラジオボタンの選択状態が別の項目に移動するアニメーションや、グリッドビューからリストビューへの切り替えアニメーションなどが該当する。

クロスドキュメント遷移

クロスドキュメント遷移(Cross-document transitions)は、ページAからページBへ移動する際のアニメーションを実現する。デフォルトではクロスフェード(ページAが徐々に消え、ページBが徐々に現れる)で、実装も比較的簡単だ。複雑なエフェクトも可能で、たとえば円形のclip-pathで最初のページをワイプアウトしながら次のページを表示する、といった演出もできる。

クロスドキュメント遷移の流れ
遷移前(ページA)
🅰️ ページAのコンテンツ
遷移中(クロスフェード)
🅰️ 消えゆくページA → 🅱️ 現れつつあるページB
遷移後(ページB)
🅱️ ページBのコンテンツ

ビュー遷移の大きな利点は、MPA(マルチページアプリケーション)でもSPA(シングルページアプリケーション)のようなスムーズなページ遷移を実現できることだ。ChromeチームのBramus氏が多数の美しいデモを公開しており、実践的な実装例も増えている。

4つの技術をどう使い分けるか

4つの技術をどう使い分けるか

ここまでの整理を踏まえて、実務での使い分けを考える。選択の基準は「スクロールとアニメーションがどう関係するか」に尽きる。

4技術の目的別マッピング
パララックス・プログレスバー → スクロール駆動アニメーション
要素出現時のフェードイン → スクロールトリガーアニメーション
固定ヘッダーの状態切替 → コンテナクエリ スクロール状態
ページ遷移アニメーション → ビュー遷移

スクロール駆動はスクロール量に完全同期させたい場合、スクロールトリガーは「画面に入ったらポン」と動かしたい場合、スクロール状態は「ある条件下で見た目をパッと切り替えたい」場合、ビュー遷移は「ページ間や状態間をなめらかにつなぎたい」場合に選ぶ。

技術選定でよくある失敗は、スクロール駆動で十分な場面でトリガーを使ってしまったり、逆にトリガーで済む場面で複雑な駆動ロジックを書いてしまうことだ。要件に対してシンプルなほうを選ぶのが鉄則である。また、ビュー遷移をスクロール系の技術と混同しないことも重要だ。ビュー遷移はスクロールとは独立したレイヤーで動作するため、併用も可能だが別物として扱う必要がある。

この記事のポイント

  • スクロール駆動アニメーションはスクロール位置とアニメーション進行が双方向に連動する
  • スクロールトリガーアニメーションはしきい値で発火し、最後まで一気に実行される
  • コンテナクエリのスクロール状態は特定のスクロール条件でスタイルを切り替える(ドラフト段階)
  • ビュー遷移はスクロールとは無関係で、ページ遷移や状態変化をアニメーションさせるAPI
  • 実装前に「スクロールとどう関係するか」を明確にし、最もシンプルな技術を選ぶ