【インターセクションオブザーバー】

Intersection Observer とは?

最終更新:
💡 要素と表示領域の「重なり」を知らせるAPI

要素とビューポート、または指定した祖先要素の領域の重なりを非同期で通知するブラウザAPI。交差率のしきい値などを使って、画像の読み込み開始や無限スクロールのきっかけを作れる。実際に人の目に見えたことを保証するものではない。

📌 このページのポイント
要素と基準領域の重なりを監視 root:ビューポート 画像A:全体が交差 画像B 交差率 1.0 交差率 0.5 対象面積の半分 この図はrootMargin: 0pxの例 しきい値をまたぐ変化などを非同期で通知 通常の交差判定 ≠ 人が実際に見た証拠
画像Bは縦の半分が領域内に入り、交差率は0.5。この模式例には、ほかの祖先による切り取りはない。
ひよこ ひよこ
スクロールイベントで調べるのとどう違うの?
ペンギン先生 ペンギン先生
スクロールのたびに位置を自分で調べ続ける代わりに、ブラウザへ交差の監視を任せる仕組みだよ。通知は非同期だけれど、コールバックのJavaScriptはメインスレッドで動く。重い処理を入れれば画面の動きに影響するので、必ず高速になるとは言えないんだ。
ひよこ ひよこ
どうやって使うの?
ペンギン先生 ペンギン先生
new IntersectionObserver(callback, options)で作り、observe(element)で対象を登録するよ。rootがnullならビューポート、祖先要素を指定すればその領域を基準にできる。監視開始時にも通知が来るので、コールバックでは各entryのisIntersectingやintersectionRatioを確認しよう。
ひよこ ひよこ
thresholdって何?
ペンギン先生 ペンギン先生
対象のどれだけの面積が交差したら通知するかのしきい値だよ。0.5なら50%をまたぐ変化で通知する。図の画像Bは縦の半分が領域内に入っているので、ほかの切り取りがないこの例では交差率0.5になるんだ。画面の半分を占める、という意味ではないよ。
ひよこ ひよこ
rootMarginは何に使うの?
ペンギン先生 ペンギン先生
交差を判定する基準の領域を広げたり狭めたりできるよ。たとえば0px 0px 200px 0pxなら下側を200px広げ、画面に入る前の読み込みのきっかけにできる。200pxだけ書くと上下左右が広がるんだ。実際の開始位置は対象の位置や途中のスクロール領域などにもよるよ。
ひよこ ひよこ
通知が来たら、利用者が見たと分かる?
ペンギン先生 ペンギン先生
通常の交差判定だけでは分からないよ。ほかの要素に覆われたり、透明だったりしても、領域としては交差し得る。画像の読み込み開始や無限スクロールのトリガーに使えるけれど、通知を人が見た証拠にはしない。不要になった対象はunobserve、全部ならdisconnectで監視を止められるよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Intersection Observer」って出てきたら「要素と表示領域の重なりを非同期で知らせるAPI」と思えばだいたいOK!
📖 おまけ:英語の意味
「Intersection Observer」 = 交差の監視者
💬 Intersectionは領域の交差・重なり、Observerは監視するもの。要素と基準となる領域の重なりを観察するAPIだよ。

参考資料

← 用語集にもどる