Written by Kasumi

JavaScriptでスクロールしたら要素をアニメーション表示する方法【Intersection Observer APIが便利】

JavaScriptを使い、スクロール中、任意の要素位置まできたらその要素を表示するアニメーションを実装したい。(脱jQuery)

本記事ではこのような悩みを解決。

Intersection Observer APICSSを使えば簡単に実装可能です。

実装方法について解説します。

Intersection Observer APIとは

Intersection Observer APIとは、ある指定した要素とビューポートの交差を監視するAPIです。

スクロールしたら要素を表示するメソッドとしてscrollメソッドが挙げられますが、Intersection Observer APIを使う事で都度関数を実行する事がなく、パフォーマンスが良いとされてます。

実装サンプル

See the Pen
Intersection Observer APIでスクロールしたら要素をアニメーション表示
by Kohei (@kouk05)
on CodePen.0

実装サンプルです。

スクロールしたら要素がふわっとアニメーションで表示されてるのがわかります。

実装手順は以下の通りです。

HTMLを準備

<p class="fadeIn">任意の要素位置まできたらフェードイン表示</p>

まずは任意の要素位置で表示したいHTMLタグにクラスを付与します。

本記事では例としてfadeInクラスを付与します。

Intersection Observerを実行

  // 交差を検知したい要素
  const fadeIn = document.querySelectorAll(".fadeIn");
  // IntersectionObserverのオプションを設定
  const options = {
    rootMargin: '0px',
    threshold: 1,
  };

  // IntersectionObserverを呼び出し
  const observer = new IntersectionObserver(showElement,options);

  // fadeInクラスが付与されてる要素にたどり着いたらIntersectionObserverを実行
  fadeIn.forEach((fadeIn) => {
    observer.observe(fadeIn);
  });

  // 要素が表示されたら実行する動作
  function showElement(entries) {
    entries.forEach((entry) => {
      if (entry.isIntersecting) {
        // 要素にactiveクラスを付与
        entry.target.classList.add("active");
      }
    });
  }

Intersection Observer APIを実行するコード例です。

まず最初に交差位置を検知したい要素(以下ターゲット)を変数指定。(今回の例ではfadeInクラス)

次にIntersection Observer APIを以下で呼び出します。

const observer = new IntersectionObserver(実行したい関数,オプション);
observer.observe(交差を検知したい要素);

Intersection Observerには以下オプションを設定できます。

rootMargin
ターゲットからの距離を指定。指定した距離から関数が実行されます。

threshold
ターゲットがどれくらいの割合で見えた場合に関数を実行。
全体を1として0~1で設定。例えば0.5を設定すると要素の半分が見えたところで関数が実行されます。

次にobserveメソッドを使ってIntersection Observerを実行する処理を記述します。

交差を検知する要素が複数ある場合はforEachを使って、要素数分observeメソッドを都度実行するようにします。

次に、ターゲットと交差したら実行したい関数を記述します。

今回のコード例では、ターゲットと交差したらその要素にactiveクラスを付与します。

isIntersectingプロパティを使う事で、ターゲットが交差したらという真偽値を判定する事が出来ます。

if文を使い、上記が真の時、actriveクラスを付与します。

CSSでアニメーションさせる

.fadeIn {
  opacity: 0;
}
.fadeIn.active {
  opacity: 1;
  animation: fadeIn 2s;
}
@keyframes fadeIn {
  0% {
    opacity: 0;
    transform: translateY(100px);
    transition-duration: 1s;
  }
  100% {
    opacity: 1;
    transform: translateY(0px);
    transition-duration: 1s;
  }

最後にCSSを記述します。

opacity: 0;で最初は要素を非表示(透過100%)にします。

activeクラスが付いたらopacity: 1;とし、任意のアニメーションが実行されるようanimationプロパティを付与。

以上で実装完了です。

まとめ

Intersection Observer APIを使い、JavaScriptでスクロールしたら要素をアニメーション表示する方法について解説しました。

目次

関連記事

JavaScript

【JavaScript初心者向け】配列要素を追加・上書き・削除する方法

2022.08.22
4052
JavaScript

JavaScriptでオブジェクトのプロパティに変数を追加する方法

2022.12.22
1714
JavaScript

JavaScriptで経過ミリ秒を取得。単位を秒・分に変換する方法

2023.01.19
5035
JavaScript

【jQuery不要】スムーススクロールをJavaScriptで実装する方法

2022.10.07
2465