本文へスキップ

Intersection Observer APIを使ったスクロールアニメーション

Intersection Observer APIとは

Intersection Observerは「要素間交差の監視」です。任意の要素が、祖先要素やビューポートと交差する変化を非同期で監視します。

Googlebot(Googleのクローラー)もIntersection Observerに対応しています。Googleの公式ブログ⁠(新しいタブで開く)でも、Intersection Observerによる遅延読み込みをサポートしていることが紹介されています。

今までのフェードインアニメーション

ここでは、スクロールすると下からふわっと要素が表示される「フェードインアニメーション」を題材にします。

jQueryを使った方法

よく見かける、jQueryを使った方法です。スクロールのたびに要素の位置を計算します。

前提としてjQueryが必要なので、読み込む量が増える分、負荷がかかります。

押すと CodePen から読み込みます

プラグインを使った方法

inview.js⁠(新しいタブで開く)などを使った方法もあります。jQueryに加えてプラグインも読み込むので、前述のjQueryを使った方法以上に負荷がかかります。

Intersection Observer APIを使った方法

ここで登場するのが、Intersection Observer APIを使った方法です。下記のスクリプトを流用すれば、ターゲットをいくつ指定しても、すべてに適用されます。

要素が画面に入ったらactiveクラスを付けます。そのあとobserver.unobserve(entry.target);で監視の対象から外すので、アニメーションは1回だけ動きます。

押すと CodePen から読み込みます

JavaScriptJavaScript · 28行
document.addEventListener("DOMContentLoaded", () => {  handleScrollIn();});const handleScrollIn = () => {  const targets = document.querySelectorAll(".js-scrollIn");  const options = {    root: null,    rootMargin: "-20% 0px",    threshold: [0]  };  const callback = (entries, observer) => {    entries.forEach((entry) => {      if (entry.isIntersecting) {        entry.target.classList.add("active");        observer.unobserve(entry.target);      }    });  };  const observer = new IntersectionObserver(callback, options);  targets.forEach((target) => {    observer.observe(target);  });};

rootMargin: "-20% 0px"は、判定に使う範囲を画面の上下から20%ずつ内側に狭める指定です。要素が画面の端に入った瞬間ではなく、少し中まで入ってから動きます。

行きも帰りも動かす

スクロールの行きも帰りも動かしたい場合は、const callback = ~の箇所を下記のように変更します。observer.unobserve(entry.target);を消すと、一度動いたあとも監視が続きます。画面から出たときにactiveクラスを取り除くので、もう一度画面に入ると再び動きます。

JavaScriptJavaScript · 9行
const callback = (entries) => {  entries.forEach((entry) => {    if (entry.isIntersecting) {      entry.target.classList.add("active");    } else {      entry.target.classList.remove("active");    }  });};

ブラウザ対応状況

Intersection Observer APIは、Chrome、Edge、Firefox、Safariなどの主要なブラウザで使えます。

IntersectionObserver | Can I use... Support tables for HTML5, CSS3, etc⁠(新しいタブで開く)

まとめ

Internet Explorerのサポートが2022年6月に終了し、ポリフィルも不要になりました。スクロールに合わせた処理は、スクロールのたびに位置を計算する方法ではなく、Intersection Observer APIを使うと、パフォーマンスの面で有利です。

参考・引用