Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# Observable# Subscription# DOM# Web APIs

更新時間:2025/08/04

建立時間:2020/09/24

JavaScript 筆記:Intersection Observer API

提升使用者體驗

當使用者打開網頁時,瀏覽器會一次把所有內容都載入。如果頁面上有很多圖片,載入速度就會變慢,讓使用者等很久。如果我們能先顯示重要的內容(像是文字),等使用者滑到圖片時再載入圖片,就能大幅縮短等待時間,讓網頁看起來更快。

以前我們會用 addEventListener() 監聽 scroll 事件,再用 getBoundingClientRect() 來判斷元素有沒有進入畫面。下面的程式碼就是這種做法。不過,每次滾動都會觸發 callback function,還要一直重新計算位置,這樣會拖慢網頁速度,影響體驗。為了解決這個問題,才有了 Intersection Observer API。

認識 Intersection Observer API

Intersection Observer API 可以讓我們在網頁捲動時,偵測某個元素有沒有進入畫面,常用來做圖片延遲載入(Lazy Loading)、無限捲動(Infinite Scroll)等功能,讓網頁更快更順。使用時,只要用 IntersectionObserver() 建立一個觀察器,傳入兩個參數:第一個是回呼函式(當元素進入或離開畫面時會執行),第二個是設定選項(object 物件)。設定裡的 root 預設是 null,代表以瀏覽器畫面(viewport)為基準,也可以改成某個父元素;threshold 決定元素進入多少比例時觸發回呼,例如 0.5 就是一半進入時觸發;rootMargin 則可以調整觀察範圍,像是加大或縮小邊界。

  • root:觀察範圍,預設為 viewport。
  • threshold:觸發比例,例如 0.5 表示當元素有一半進入 viewport 時觸發。
  • rootMargin:可調整觸發範圍,例如 '10px' 可擴大觀察邊界。

Reveal Section DEMO

Codepen 範例:透過 Intersection Observer,隨著滾動逐一顯示區塊。

Lazy Loading DEMO

Codepen 範例:先顯示低解析度圖片,待進入 viewport 後再載入清晰版本。

Infinite Scroll

若頁面含有龐大資訊量(如 Unsplash 圖庫),可透過 Intersection Observer 實現 Infinite Scroll。當使用者滾動至底部時,再動態載入更多內容,而非一次渲染所有資料。

範例可見 Codepen。

一般而言,若網頁資訊量過多的情況下,通常會透過分頁 (page 1, page 2...) 來做內容的切割,倘若是屬於 UNSPLASH 這種免費相面共享網站,會希望使用者在同一個頁面利用滾輪就可以瀏覽大量的圖庫,然而大量的圖片資訊若要一次渲染給使用者會需要耗費大量的時間,因此會透過 Intersection Observe API 做到分批渲染的功能,待瀏覽者滑動到頁面最底部時,再渲染新的資訊出來,如 Codepen所呈現的 。

參考資料

  • Jonas's JavaScript Course