跳至主要內容

    Lazy Loading

    Lazy loading 延後載入非首屏資源可提升首屏速度,但若用錯可能影響 LCP 或讓內容不易被抓取。

    定義

    Lazy loading 是延後載入非立即可見資源(圖片、iframe)的策略(例如 loading="lazy")。它能減少首屏負載,但若把首屏主圖也 lazy,可能讓 LCP 變差;若內容只在滾動後才載入,爬蟲也可能抓不到。

    為什麼重要

    • 能降低首屏資源負載,加快初始頁面載入速度
    • 減少不必要的頻寬消耗,對行動用戶友善
    • 配合圖片尺寸可減少 CLS(保留空間避免跳動)
    • 瀏覽器原生支援 loading="lazy",無需額外 JS
    • 對長頁面尤其有效,避免一次載入數十張圖
    • 用錯會影響 LCP 與可索引性(首屏主圖不應 lazy)
    • iframe(如 YouTube)lazy 載入能大幅降低首屏阻塞

    怎麼做(實作重點)

    • 首屏主圖不要 lazy,改用 fetchpriority="high" 或 <link rel="preload">
    • 對非首屏圖片統一使用 loading="lazy"
    • 確保重要內容不是只有滾動後才出現(影響爬蟲)
    • 為 lazy 圖片設定 width 與 height 避免 CLS
    • iframe(如 YouTube embed)也可用 loading="lazy"
    • 使用 Intersection Observer 實作進階控制(動畫效果等)
    • 測試:用 DevTools Network 面板確認圖片只在需要時載入

    範例

    html
    <!-- 非首屏圖片使用 lazy -->
    <img src="/below-fold.webp" alt="產品圖片" loading="lazy" width="800" height="600" />
    
    <!-- 首屏主圖用 eager(預設)+ fetchpriority -->
    <img src="/hero.webp" alt="主視覺" loading="eager" fetchpriority="high" />
    
    <!-- iframe 也能 lazy -->
    <iframe src="https://www.youtube.com/embed/xxx" loading="lazy"></iframe>
    html
    // 更精細控制的 lazy loading
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          observer.unobserve(img);
        }
      });
    }, { rootMargin: '100px' });
    
    document.querySelectorAll('img[data-src]').forEach(img => {
      observer.observe(img);
    });

    相關連結

    常見問題

    關於這個詞彙的常見問答。

    回到詞彙表