【CSS】スクロール駆動アニメーション
2026.10.20 Posted by Coding_team

こんにちは、クリエイターブログです。今回はCSSだけで作れるスクロール駆動アニメーションを紹介したいと思います。
ページをスクロールしていくと画像や要素がふわっと浮かび上がってきたりエフェクトを付けたりするものです。
これまではJavaScriptやプラグインを使って実装するのが一般的でしたが、今回はなんとCSSだけで実装しています。
はじめに
良くあるスクロールに連動したエフェクトを3つほど用意しました。
大まかな仕様としては以下のようなものを想定しました。
- 要素が画面内に入ってきたらフェードインしながら表示
- 動きは「下から」「左から」「右から」の3パターンを用意
- JavaScriptは一切使わずCSSのみで実装
では実際に実装して解説していきます。
実装
DEMOを作成しましたのでまずは以下から動作確認をしてみてください。
html
まずはhtmlですが、アニメーションさせたい要素に用意したclassを付けるだけです。特に難しいことはないかと思います。
|
1 2 3 4 5 6 7 |
<ul class="list"> <li class="scroll-up"><img src="img/img01.jpg" alt=""></li> <li class="scroll-left"><img src="img/img02.jpg" alt=""></li> <li class="scroll-right"><img src="img/img03.jpg" alt=""></li> <li class="scroll-up"><img src="img/img04.jpg" alt=""></li> <li class="scroll-left"><img src="img/img05.jpg" alt=""></li> </ul> |
CSS
CSSではアニメーション部分を設定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* 下から */ .scroll-up { animation: scroll-up linear both; /* アニメーション名と動き方を指定 */ animation-timeline: view(); /* 要素が画面に表示される進み具合に連動させる */ animation-range: entry 0% cover 30%; /* アニメーションさせる範囲を指定 */ } @keyframes scroll-up { from { opacity: 0; transform: translateY(100px); /* 100px下の位置から */ } to { opacity: 1; transform: translateY(0); /* 元の位置へ */ } } /* 左から */ .scroll-left { animation: scroll-left linear both; animation-timeline: view(); animation-range: entry 0% cover 30%; } @keyframes scroll-left { from { opacity: 0; transform: translateX(-100px); /* 100px左の位置から */ } to { opacity: 1; transform: translateX(0); } } /* 右から */ .scroll-right { animation: scroll-right linear both; animation-timeline: view(); animation-range: entry 0% cover 30%; } @keyframes scroll-right { from { opacity: 0; transform: translateX(100px); /* 100px右の位置から */ } to { opacity: 1; transform: translateX(0); } } |
ポイントとなるのは以下の2つのプロパティです。
animation-timeline: view();
通常のアニメーションは「時間」で進みますが、これを指定すると「要素が画面にどれだけ入ってきたか」でアニメーションが進むようになります。スクロールを戻すとアニメーションも巻き戻るのが特徴です。
animation-range: entry 0% cover 30%;
アニメーションの開始位置と終了位置を指定します。今回は「要素が画面に入り始めた瞬間(entry 0%)」に開始し、「要素が画面の30%ほど進んだところ(cover 30%)」で完了するようにしています。
@keyframes の中身はいつも通りのアニメーションの書き方なので、移動距離や透明度などは自由に変更できます。
実際の記述量としてはこれだけです。JavaScriptが得意でない方も簡単に実装できるかと思います。
注意点
非常に便利なスクロール駆動アニメーションですが、比較的新しい機能のためブラウザの対応状況には注意が必要です。
ChromeやEdgeは対応済みで、Safariも最近のバージョンで対応しましたが、Firefoxは執筆時点では標準では未対応となっています。最新の対応状況は以下で確認してください。
→Can I use – animation-timeline
未対応のブラウザでは animation-timeline が無視され、通常のアニメーションとして一瞬で再生されてしまいます。今回の場合は見た目上おかしくはなりませんが、気になる場合は @supports で対応ブラウザだけに適用しておくと安心です。
|
1 2 3 4 5 6 7 |
@supports (animation-timeline: view()) { .scroll-up { animation: scroll-up linear both; animation-timeline: view(); animation-range: entry 0% cover 30%; } } |
こうしておけば、未対応のブラウザでは最初から普通に表示されるだけになります。
また、OSの設定で「視差効果を減らす」をオンにしているユーザーもいるので、prefers-reduced-motion でアニメーションを止めてあげるのもおすすめです。
|
1 2 3 4 5 6 7 |
@media (prefers-reduced-motion: reduce) { .scroll-up, .scroll-left, .scroll-right { animation: none; } } |
おわりに
今回はCSSだけで作れるスクロール駆動アニメーションを紹介しましたが、ここ近年CSSで出来ることが増えすぎて驚くことが多いです。
これまでJavaScriptで書いていた表現がCSSだけで実現できるようになると、読み込むファイルも減り、管理もしやすくなりますね。
ブラウザの対応状況には注意しつつ、まずは装飾的な演出から取り入れてみてはいかがでしょうか。
以上クリエイターブログでした。
関連記事こちらの記事も合わせてどうぞ。
静的サイトと動的サイトの違いとは?特徴・メリットと自社に合う選び方
2026.09.09
Webサイトを更新したのに反映されない?原因と解決策を立場別に解説
2026.02.09
2026.01.23





