【JavaScript】IntersectionObserverでスクロール時に要素をふわっと表示させる方法

【JavaScript】IntersectionObserverでスクロール時に要素をふわっと表示させる方法 JavaScript

スクロールして画面内に入った要素が「ふわっ」と表示される演出は、今や多くのWebサイトで使われています。このような効果は、従来jQueryのscrollイベントで実装されてきましたが、現在はブラウザネイティブのIntersectionObserverを使うことで、より軽量かつ高パフォーマンスで実現できます。

この記事では、IntersectionObserverを使ってスクロール時に要素をふわっと表示する方法を紹介します。

スポンサーリンク

IntersectionObserverとは?

IntersectionObserverは、指定した要素がビューポート内に入ったかどうかを検出するAPIです。従来のようにスクロールイベントを多用することなく、効率的にDOMの表示状態を監視できます。

HTMLの準備

対象となる要素にクラスを指定しておきます。

<div class="fade-in">コンテンツ1</div>
<div class="fade-in">コンテンツ2</div>
<div class="fade-in">コンテンツ3</div>

CSSでアニメーション定義

初期状態を非表示にし、activeクラスが付いたときにフェードインします。

.fade-in {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.fade-in.active {
  opacity: 1;
  transform: translateY(0);
}

JavaScriptでIntersectionObserverを設定

JavaScriptで対象要素を監視し、画面に表示されたときにactiveクラスを付与します。

document.addEventListener('DOMContentLoaded', function () {
  const targets = document.querySelectorAll('.fade-in');

  const observer = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        entry.target.classList.add('active');
        observer.unobserve(entry.target); // 一度表示されたら監視を解除
      }
    });
  }, {
    threshold: 0.1, // 10%表示されたら発火
  });

  targets.forEach(target => {
    observer.observe(target);
  });
});

実装のポイント

  • thresholdで表示判定のしきい値(要素のどのくらいが見えたら反応するか)を設定できます。
  • 一度表示されたらunobserve()で監視を解除することでパフォーマンス向上に繋がります。
  • アニメーションの細かい設定はCSSで制御可能です。

複数要素にスクロールイベントを設定する方法

IntersectionObserverを使って複数要素にスクロールイベントを設定する方法については、以下の記事でも紹介しているのでぜひ参考にしてみてください。

無効なURLです

よくある質問(FAQ)

Q. スクロールで要素が見えたら表示アニメーションを開始するには?
A. IntersectionObserverで要素が画面内に入ったときにCSSクラスを追加し、CSSでopacityやtransformのtransitionアニメーションを定義します。コールバック内でunobserveすると一度だけアニメーションします。
Q. 複数の要素を時間差でアニメーションするには?
A. querySelectorAll()で複数要素を取得し、forEachのインデックス×遅延時間をCSSのanimation-delayに設定します。IntersectionObserverと組み合わせてスクロール時に順番にフェードインする実装が一般的です。
Q. アニメーションがチラつく(FOUC)場合の対処法は?
A. 初期状態でopacity: 0とtransition設定済みのクラスを要素に付けておき、IntersectionObserverでvisibleクラスを追加してopacity: 1にします。JavaScriptが実行前に見えることを防げます。

まとめ

IntersectionObserverを使えば、モダンでパフォーマンスの良いフェードイン演出が簡単に実装できます。ユーザー体験の向上や、視覚的なアクセントとしてぜひ活用してみてください。