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】selectボックスで選択したoptionによってクラスを追加・削除する方法

2022.10.14
5362
JavaScript

JavaScriptでマウスが要素をhoverしたか判定する方法

2022.11.10
3270
JavaScript

JavaScriptで任意の入力フィールドにfocusを合わせる方法

2023.03.28
2390
JavaScript

Failed to execute ‘insertBefore’ on ‘Node’ The node before which the new node is to be inserted is not a child of this node.の原因・対処方法

2022.12.03
5081