Intersection Observer APIとは
Intersection Observerは「要素間交差の監視」です。任意の要素が、祖先要素やビューポートと交差する変化を非同期で監視します。
Googlebot(Googleのクローラー)もIntersection Observerに対応しています。Googleの公式ブログ(新しいタブで開く)でも、Intersection Observerによる遅延読み込みをサポートしていることが紹介されています。
今までのフェードインアニメーション
ここでは、スクロールすると下からふわっと要素が表示される「フェードインアニメーション」を題材にします。
jQueryを使った方法
よく見かける、jQueryを使った方法です。スクロールのたびに要素の位置を計算します。
前提としてjQueryが必要なので、読み込む量が増える分、負荷がかかります。
プラグインを使った方法
inview.js(新しいタブで開く)などを使った方法もあります。jQueryに加えてプラグインも読み込むので、前述のjQueryを使った方法以上に負荷がかかります。
Intersection Observer APIを使った方法
ここで登場するのが、Intersection Observer APIを使った方法です。下記のスクリプトを流用すれば、ターゲットをいくつ指定しても、すべてに適用されます。
要素が画面に入ったらactiveクラスを付けます。そのあとobserver.unobserve(entry.target);で監視の対象から外すので、アニメーションは1回だけ動きます。
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クラスを取り除くので、もう一度画面に入ると再び動きます。
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を使うと、パフォーマンスの面で有利です。
参考・引用
- 交差オブザーバー API - Web API | MDN(新しいタブで開く)
- The new evergreen Googlebot | Google Search Central Blog(新しいタブで開く)