CSSだけでスクロールアニメーションを実装!Scroll-driven Animationsの使い方を解説

Webサイトをスクロールすると、画像がふわっと表示されたり、文字が動いたりするアニメーションを見かけることがあります。

CSSの「Scroll-driven Animations」を使えば、JavaScriptを使わずにスクロールに連動したアニメーションを実装できます。

この記事では、Scroll-driven Animationsの基本的な仕組みから、利用が向いているケースまでわかりやすく解説します。

Scroll-driven Animationsとは?

Scroll-driven Animationsとは、スクロールの進行状況に合わせてCSSアニメーションを動かせる仕組みです。

2023年にGoogle Chrome 115でサポートされましたが、当初はAppleのSafariに対応しておらず、Webサイト制作で採用する際にはブラウザの対応状況に注意が必要でした。

しかし、2025年9月にはSafari 26が正式対応し、iPhoneやMacのSafariでも利用できるようになっています。

※ただし、Firefoxなどの非対応ブラウザもあるため、導入する際は対応状況を確認する必要があります。

Scroll-driven Animationsには2種類のタイムラインがある

Scroll-driven Animationsには、「Scroll Progress Timeline」と「View Progress Timeline」という2種類のタイムラインがあります。

Scroll Progress Timeline

スクロール領域の進行状況に応じてアニメーションを動かす仕組みです。
ページのスクロール位置に合わせて進捗バーを伸ばすような演出に使用できます。

View Progress Timeline

要素がスクロール領域内に現れてから通過するまでの進行状況に応じてアニメーションを動かす仕組みです。
画像やテキストが画面内に入るタイミングに合わせたフェードインなどに活用できます。

CSSでは、それぞれscroll()とview()を使って指定します。

参考:MDN「CSS scroll-driven animations」

Scroll-driven Animationsでできること

Scroll-driven Animationsを使うと、下記のようなさまざまな演出をCSSだけで実装できます。

スクロールに合わせて要素をフェードイン

画像やテキストが画面内に入るタイミングに合わせて、徐々に表示されるアニメーションです。

animation-timeline: view()を使用すると、要素がスクロール領域内を移動する進行状況に合わせて、透明度を変化させることができます。

企業サイトのサービス紹介や実績紹介など、コンテンツを順番に見せたい場面で活用できます。

スクロールの進行状況をプログレスバーで表示

ページをスクロールすると、画面上部のバーが徐々に伸びていくアニメーションです。

animation-timeline: scroll()を使用し、スクロール領域の進行状況に合わせてバーの長さを変化させることができます。

記事ページなどで、ユーザーがどこまで読み進めたのかを視覚的に伝えたい場合に適しています。

スクロールに合わせて画像を拡大・縮小

スクロールの進行状況に合わせて、画像を徐々に拡大・縮小するアニメーションです。

CSSのtransform: scale()と組み合わせることで、画像に奥行きや動きを加えられます。

例えば、ファーストビューから次のセクションへ移動する際に画像を縮小したり、コンテンツが表示されるタイミングで画像を拡大したりする演出に活用できます。

スクロールに合わせて要素を移動・回転

スクロール位置に応じて、要素を横に移動させたり、回転させたりすることもできます。

transform: translateX()やrotate()などを組み合わせることで、スクロールに連動した動きを表現できます。

例えば、スクロールに合わせて装飾要素を移動させたり、イラストを回転させたりする演出に活用できます。

Scroll-driven Animationsの基本的な実装方法

ここからは、実際のコードを使ってScroll-driven Animationsの実装方法を紹介します。

基本的には、CSSの@keyframesでアニメーションの動きを定義し、animation-timelineでスクロールとの連動方法を指定します。

基本の書き方

例えば、スクロールに合わせて要素をフェードインさせる場合は、次のように記述します。

.fade-in {
  animation: fade-in linear both;
  animation-timeline: view();
}

@keyframes fade-in {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframesでは、透明度を0から1へ変化させるアニメーションを定義しています。

animation-timeline: view()を指定することで、時間経過ではなく、要素がスクロール領域内を移動する進行状況に合わせてアニメーションが動きます。

なお、animation-timelineはanimationショートハンドによって初期値にリセットされるため、上記のようにanimationの後に記述する必要があります。

参考:MDN「animation-timeline」

スクロールに合わせてフェードインさせる

実際に要素をフェードインさせる場合は、animation-rangeを指定すると、アニメーションが始まる位置と終了する位置を調整できます。

<div class="fade-in">
  <p>スクロールに合わせて表示されるコンテンツ</p>
</div>
.fade-in {
  animation: fade-in linear both;
  animation-timeline: view();
  animation-range: entry 0% entry 100%;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

この例では、要素がスクロール領域に入り始めてから、完全に入るまでの間に透明度が0から1へ変化します。

animation-rangeを調整することで、フェードインが始まるタイミングや完了する位置を変更できます。

参考:MDN「animation-range」

スクロール進捗バーを作る

次に、ページのスクロール進行状況に合わせて伸びるプログレスバーを作成します。

<div class="progress-bar"></div>
.progress-bar {
  transform: scaleX(0);
  transform-origin: left;
  animation: progress linear both;
  animation-timeline: scroll(root block);
}

@keyframes progress {
  from {
    transform: scaleX(0);
  }

  to {
    transform: scaleX(1);
  }
}

scroll(root block)は、ルート要素の縦方向のスクロール進行状況を参照します。

ページの先頭ではバーの長さが0になり、ページの最下部に到達すると横幅いっぱいに伸びます。

このような演出は、記事ページや長いコンテンツを持つWebサイトで活用できます。

アニメーションの開始・終了位置を調整する

Scroll-driven Animationsでは、animation-rangeを使ってアニメーションの開始位置と終了位置を指定できます。

例えば、view()を使用する場合、次のような指定が可能です。

.fade-in {
  animation: fade-in linear both;
  animation-timeline: view();
  animation-range: entry 0% entry 100%;
}

entryは、要素がスクロール領域内に入ってくる区間を表します。一方、exitは要素がスクロール領域から出ていく区間を表します。

これらを組み合わせることで、要素が画面内に入るタイミングや、画面外へ移動するタイミングに合わせてアニメーションを制御できます。

Scroll-driven AnimationsとGSAPの違い

スクロールアニメーションを実装する方法としては、JavaScriptライブラリの「GSAP」もよく利用されています。

どちらもスクロールに連動したアニメーションを実装できますが、使用する技術や得意な表現が異なります。

比較項目 Scroll-driven Animations GSAP(ScrollTrigger)
使用技術 CSS JavaScript
ライブラリ 不要 GSAPが必要
基本的なスクロール連動 対応 対応
複雑なアニメーション制御 CSSで表現できる範囲に制約 柔軟に制御できる
ブラウザ対応 対応状況の確認が必要 GSAPの対応環境に依存
向いている用途 シンプルなスクロール連動演出 複雑な演出や細かな制御

Scroll-driven Animationsが向いているケース

Scroll-driven Animationsは、シンプルなスクロール連動アニメーションを実装したい場合に適しています。

外部ライブラリを追加する必要がないため、CSSで完結できる演出を取り入れたい場合に有効です。

GSAPが向いているケース

GSAPは、複数の要素を連動させたり、アニメーションのタイミングを細かく制御したりする場合に適しています。

特にScrollTriggerを使用すると、スクロール位置に合わせた複雑な演出や、複数のアニメーションを組み合わせた表現を実装できます。

また、スクロール以外のイベントと組み合わせたい場合にも柔軟に対応可能です。

GSAPについては、以下の記事でも詳しく解説しています。

CSSアニメーションが複雑なら「GSAP」がおすすめ!できることやメリットを解説

Re:ProS メディア

CSSアニメーションが複雑なら「GSAP」がおすすめ!できることやメリットを解説

Scroll-driven Animationsを使う際の注意点

Scroll-driven Animationsは便利な機能ですが、実際のWebサイトに導入する際には確認しておきたいポイントがあります。

ブラウザの対応状況を確認する

Scroll-driven Animationsは比較的新しいCSS機能のため、ブラウザやバージョンによって対応状況が異なります。

記事の冒頭でも記載したように、Firefoxを含めた複数のブラウザで動作させる場合は、公開時点の対応状況を確認することが重要です。

対応していないブラウザでもコンテンツが問題なく閲覧できるよう、アニメーションが動作しない場合の表示も考慮してください。

参考:Can I use「CSS animation-timeline」

アニメーションを使いすぎない

スクロールアニメーションは、Webサイトの印象を高めたり、コンテンツに注目してもらったりするために活用できます。

一方で、アニメーションが多すぎると、情報が伝わりにくくなったり、ユーザーの操作を妨げたりする可能性があります。

また、動きのある表現が苦手なユーザーにも配慮し、prefers-reduced-motionを利用してアニメーションを抑える設計も検討しましょう。

参考:MDN「prefers-reduced-motion」

表示速度やパフォーマンスに配慮する

CSSだけで実装できるからといって、必ずしもパフォーマンスへの影響がないわけではありません。

アニメーションさせるプロパティや要素の数によっては、描画処理に負荷がかかる場合があります。

そのため、基本的にはtransformやopacityなど、比較的効率よくアニメーションできるプロパティを活用することがおすすめです。

まとめ

Scroll-driven Animationsを使えば、JavaScriptを使わずにCSSだけでスクロールに連動したアニメーションを実装できます。

さまざまな演出に活用できるため、Webサイトの表現の幅を広げられる機能です。

一方で、複雑な演出や細かな制御が必要な場合には、GSAPなどのライブラリが適していることもあります。

実現したいデザインや対応ブラウザ、パフォーマンスなどを考慮しながら、適切な方法を選ぶことが大切です。

アニメーションを活用したWebサイト制作をご検討中の方へ

当メディアを運営する株式会社レクトでは、Webサイト制作・Webシステム開発を行っています。

スクロールアニメーションやインタラクティブな演出を取り入れたWebサイト制作についても、お気軽にご相談ください。

投稿者について

Yokoyama Nana

名古屋学芸大学 メディア造形学部 デザイン学科を卒業後、名古屋のIT企業にて6年間、Webデザイナーとして勤務。現在もWebデザイン業務に従事しています。機能的なデザインを作ること・デザインとコードをつなぐことが得意です!

この投稿者の記事を読む