Frontend
JS|Intersection Observer API
用非同步的方式監聽元素是否進入畫面,常用於圖片延遲載入、無限捲動與進場動畫。
IntersectionObserver 讓你非同步地監聽某個元素是否進入畫面(或某個容器)的可視範圍,不必自己在 scroll 事件裡反覆計算位置,效能更好。常見用途:
- 圖片延遲載入(lazy-loading)
- 無限捲動(infinite scrolling)
- 元素進場才觸發動畫,或計算它露出畫面的比例
基本用法#
建立 observer 時傳入兩個參數:一個 callback,以及一組 options。
const options = { // 作為「可視範圍」基準的容器;null(預設)代表整個瀏覽器視窗 root: document.querySelector("#scrollArea"), // 對 root 範圍做內縮/外擴,語法同 CSS margin rootMargin: "0px", // 露出多少比例才觸發 callback,可傳單一數字或陣列 // 0.0(預設):只要露出 1px 就視為可見 // 1.0:整個元素完全進入範圍才算可見 threshold: 1.0, // threshold: [0.5, 1.0] 也可以在多個比例各觸發一次};
// 目標元素進入/離開範圍時就會呼叫const callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { // 元素目前可見,做點事情⋯⋯ } });};
const observer = new IntersectionObserver(callback, options);
// 開始監聽指定的目標元素observer.observe(document.querySelector("#A"));callback 收到的 entries 是一組 IntersectionObserverEntry,可以透過 entry.isIntersecting 判斷是否可見、entry.intersectionRatio 取得露出比例。