」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Intersection Observer 提高網站效能

使用 Intersection Observer 提高網站效能

發佈於2024-07-30
瀏覽:677

Enhancing Website Performance with Intersection Observer

介紹

為了尋求更快、更有效率的網路體驗,開發人員不斷尋求新的方法來優化效能。 Intersection Observer API 是 Web 開發人員武器庫中的強大工具。此 API 可讓您觀察目標元素可見性的變化,從而啟用延遲載入和延遲內容載入等進階策略。在本部落格中,我們將探討如何使用 Intersection Observer API 來提升網站的效能。

什麼是交叉口觀察者?

Intersection Observer API 提供了一種非同步觀察目標元素與祖先元素或頂級文件視窗的交集變化的方法。這對於用戶向下捲動頁面時延遲載入圖片或其他內容特別有用。

效能改進的關鍵用例

  1. 延遲載入映像和 iframe:僅在映像和 iframe 即將進入視窗時才載入映像和 iframe,減少初始載入時間。
  2. 螢幕外內容的延遲載入:延遲載入廣告、影片或繁重腳本等內容,直到它們出現在視圖中。
  3. 無限滾動:當使用者向下捲動頁面時載入更多內容。
  4. 分析追蹤:追蹤元素何時進入使用者參與分析視圖。

基本用法

讓我們深入了解 Intersection Observer API 的基本實作。

  1. 建立交叉口觀察器

首先,建立 IntersectionObserver 的實例:

let observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // Perform actions when the element is visible
      entry.target.src = entry.target.dataset.src;
      observer.unobserve(entry.target); // Stop observing after loading
    }
  });
}, {
  root: null, // relative to document viewport
  rootMargin: '0px', // margin around root
  threshold: 0.1 // visible amount of item shown in relation to root
});
  1. 觀察目標元素

選擇要觀察的元素並開始觀察:

document.querySelectorAll('img[data-src]').forEach(img => {
  observer.observe(img);
});
  1. 延遲載入的 HTML 結構

使用資料屬性確保您的 HTML 結構支援延遲載入:

Lazy Loaded Image

進階配置

為了進行更多控制,您可以調整根邊距和閾值選項:

  1. 根邊距:在內容進入視口前稍微預先載入內容。
rootMargin: '100px' // preload 100px before entering viewport
  1. Threshold:確定在觸發回調之前應該有多少元素可見。
threshold: [0.25, 0.5, 0.75, 1] // trigger at 25%, 50%, 75%, and 100% visibility

實際範例:延遲載入圖片

這是延遲載入圖片的完整範例:

  1. JavaScript 程式碼
document.addEventListener("DOMContentLoaded", function() {
  let lazyImages = document.querySelectorAll("img.lazy");

  let imageObserver = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        let img = entry.target;
        img.src = img.dataset.src;
        img.classList.remove("lazy");
        observer.unobserve(img);
      }
    });
  });

  lazyImages.forEach(image => {
    imageObserver.observe(image);
  });
});
  1. HTML 結構
Lazy Loaded Image

好處

  1. 縮短初始載入時間:透過僅載入視窗中或視窗附近的映像和內容,可以縮短初始載入時間。
  2. 改進的滾動效能:延遲載入離螢幕內容可以讓捲動更流暢。
  3. 更好的使用者體驗:使用者只下載他們將要查看的內容,從而獲得更靈敏的體驗。

結論

透過實作 Intersection Observer API,您可以大幅增強網站的效能和使用者體驗。無論您是延遲載入映像、延遲載入繁重的腳本還是實作無限捲動,此 API 都提供了一種強大而有效的方法來管理內容可見性。立即開始使用 Intersection Observer,看看您網站效能的差異!

版本聲明 本文轉載於:https://dev.to/koolkamalkishor/enhancing-website-performance-with-intersection-observer-f89?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    程式設計 發佈於2025-02-07
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    克服go mod中的模塊路徑差異 coreos/bbolt:github.com/coreos/ [email受保護]:解析go.mod:模塊將其路徑聲明為:go.etcd.io/bbolt `要解決此問題,您可以在go.mod文件中使用替換指令。只需在go.mod的末尾添加以下行:[&& &...
    程式設計 發佈於2025-02-07
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    </main> <section> ,但无法使其正常工作,如您所见。任何洞察力都将不胜感激! display:grid; { position:sticky; top:1em; z-index:1 1 ; { { { pos...
    程式設計 發佈於2025-02-07
  • Trie簡介(前綴樹)
    Trie簡介(前綴樹)
    Trie 是一種類似樹的數據結構,用於有效存儲和搜索字符串,尤其是在諸如AutoComplete,Spell Checking和IP路由之類的應用程序中。 Trie的關鍵特性: nodes :每個節點代表一個字符。 :root節點是空的,並用作起點。 :每個節點最多有26個...
    程式設計 發佈於2025-02-07
  • 如何處理PHP MySQL中的分頁和隨機訂購以避免重複和不一致?
    如何處理PHP MySQL中的分頁和隨機訂購以避免重複和不一致?
    [ php mysql分頁與隨機訂購:克服重複和頁面一致性挑戰 1。在後續頁面上排除先前看到的結果,以防止先前顯示的結果在隨機訂購時重新出現在隨機訂購時:在會話變量中存儲ID作為逗號分隔的列表。 修改您的sql查詢以排除這些IDS: 2。確保第一頁上的不同結果隨機訂購將使很難在第一頁上保證獨特的...
    程式設計 發佈於2025-02-07
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php 您的目標可能是檢索“ varnum”屬性值,其中提取數據的傳統方法可能會使您感到困惑。 - > attributes()為$ attributeName => $ attributeValue){ echo $ attributeName,'=“',$ a...
    程式設計 發佈於2025-02-07
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python 射線tracing方法Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a路徑對象表示多邊形。它檢查給定點是否位於定義路徑內。 T...
    程式設計 發佈於2025-02-07
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    [2明確擔心Microsoft Visual C(MSVC)在正確實現兩相模板實例化方面努力努力。該機制的哪些具體方面無法按預期運行? 背景:說明:的初始Syntax檢查在範圍中受到限制。它未能檢查是否存在聲明名稱的存在,導致名稱缺乏正確的聲明時會導致編譯問題。 為了說明這一點,請考慮以下示例:一個...
    程式設計 發佈於2025-02-07
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在默認值中使用current_timestamp或mysql版本中的current_timestamp或在5.6.5 這種限制源於遺產實現的關注,這些限制需要為Current_timestamp功能提供特定的實現。消息和相關問題 `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-02-07
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    使用(1)而不是(;;)會導致無限循環的性能差異? 現代編譯器,(1)和(;;)之間沒有性能差異。 是如何實現這些循環的技術分析在編譯器中: perl: S-> 7 8 unstack v-> 4 -e語法ok 在GCC中,兩者都循環到相同的彙編代碼中,如下所示:。 globl t_時 ...
    程式設計 發佈於2025-02-07
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-02-07
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決“一般錯誤:2006 MySQL 服務器已消失”介紹:將數據插入MySQL 數據庫有時會導致錯誤“一般錯誤:2006 MySQL 服務器已消失”。當與服務器的連接丟失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變量之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-02-07
  • 在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在hibernate中保存枚舉值:故障排除錯誤的列type ,他們各自的映射至關重要。在Java中使用枚舉類型時,至關重要的是,建立冬眠的方式如何映射到基礎數據庫。 在您的情況下,您已將MySQL列定義為枚舉,並在Java中創建了相應的枚舉代碼。但是,您遇到以下錯誤:“ MyApp中的錯誤列類型...
    程式設計 發佈於2025-02-07
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript 理解prefix keys primary鍵(movie_id(3))primary鍵(Movie_id) primary鍵(Movie_id) primary鍵(Movie_id) > `這將在整個Movie_ID列上建立標...
    程式設計 發佈於2025-02-07
  • 如何在網站中連接兩個頁面
    如何在網站中連接兩個頁面
    在本指南中,您將學習如何使用基本HTML在網站上鍊接兩個頁面。鏈接頁面允許用戶輕鬆地在網站的不同部分之間導航。讓我們開始吧! 創建兩個HTML文件 首先,創建要鏈接的兩個HTML文件。例如,讓我們創建一個稱為index.html(您的主頁)和另一個稱為.html(您的關於頁面)的名為index....
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3