スクロールで要素フェードイン(CSS のみ)

アニメーション Medium #css #scroll-driven #view-timeline #reveal

JavaScript なし・Intersection Observer 不要で、要素がビューポートに入ったタイミングに応じてフェードイン演出を実装。animation-range で開始タイミング調整可能。

▶ プレビュー

解説

スクロールで要素フェードイン(CSS のみ)は、アニメーションカテゴリの「scroll-driven」に分類される実装パターンです。CSS のみで構成され、難易度は中級レベル。

animation-timeline: view() は、各要素が「ビューポートに入っている量」をタイムラインとして CSS アニメーションに紐付けられる機能です。Intersection Observer を JavaScript で書くより遥かにシンプルに、よくある「スクロールで要素がフワッと登場」演出を実装できます。

このサンプルでは、複数のカードを下から順番にフェードインさせています。animation-range: entry 0% cover 30% で「要素の上端がビューポートに入った瞬間から、要素の上端が画面中央 30% 地点に来るまで」にアニメーションを完了させる、繊細な制御をしています。

仕組み

下記コードタブから HTML / CSS をそれぞれ確認・コピーできます。プレビュー領域では実際の動作をその場で確認可能です。

CSS プロパティだけで完結しているため、フレームワーク非依存・軽量に組み込めます。React / Vue / Astro / 静的 HTML どれにも持ち込み可能です。

注意点 / カスタマイズ時のポイント

Chrome / Edge / Opera 対応。Safari / Firefox は未対応のため、フォールバック実装が必要な場合は Intersection Observer の JS 版を併用してください。

animation-rangeentry / cover / exit の使い分けは慣れが必要です。entry = 要素がビューに入る瞬間、cover = ビュー内を移動中、exit = 出ていく瞬間と覚えるとよいです。

よくある質問

1 度だけ再生して、戻ったら再アニメーションさせたくない
view() を使う限り、毎回スクロール量に応じてプレイバックされます。1 度だけにしたい場合は、animation-fill-mode: forwards + 1 回再生後にクラスを付与する JS が必要です。
Safari でフォールバック実装したい
@supports not (animation-timeline: view()) で分岐し、Intersection Observer で is-in クラスを付ける処理を書いてください。
このスニペットは商用利用できますか?
はい。moatway がオリジナルで制作したスニペットは商用・個人問わず自由にご利用いただけます。クレジット表記も不要です。
そのまま貼り付ければ動きますか?
はい。HTML / CSS / JS タブのコードをそれぞれ自分のファイルにコピーして貼り付ければ動きます。クラス名が他の CSS と衝突しないよう、必要に応じてリネームしてください。
ブラウザ対応は?
最新 2 世代の Chrome / Safari / Firefox / Edge で動作確認しています。Internet Explorer はサポート対象外です。
Tailwind CSS でも実装できますか?
可能です。クラスベースのスタイルを Tailwind のユーティリティクラスに置き換えれば同じ動作になります。アニメーション・疑似要素については @apply や arbitrary values が必要な場合があります。
inspired by 2026 modern CSS / Web APIs / 追加日:2026-05-13
← すべてのスニペットへ戻る