loading='lazy' 不要再用啦!這才是現代懶加載的正確打開方式
懶加載(Lazy Loading)一直是前端性能優化的常見方式。不知道從什么時候開始 <img loading="lazy"> 這樣的屬性方案開始大行其道,很多同學并不了解 <img loading="lazy"> 的作用,就直接把它放到項目里進行使用,不知不覺就為自己埋下了大坑!
loading="lazy" 的作用
圖片
根據 MDN的介紹,我們可以很清楚的了解 <img loading="lazy"> 的作用, 很多同學在看到這個屬性后都會“虎軀一震”,覺得:“這簡直是完美解決懶加載的方案啊,不用寫 JS 了,真香!”
但現實遠沒有那么理想:瀏覽器的懶加載行為遠不如你想象中的那么“聰明”:
1. 加載觸發點不穩定,不可控
瀏覽器內部定義了一個“可見區域附近的預加載區域”(preload margin),當圖片即將進入視口時才加載。
但這個區域是 不可控的!不同瀏覽器、不同版本、甚至不同網絡環境下的觸發條件都不一樣!
舉個例子:
- 在 Chrome 中可能是距離視口下方 1250px 就開始加載。
- 在 Safari 中可能必須接近視口 200px 才觸發。
- 而在 Firefox 中,行為又完全不同。
所以你可能會發現用戶已經快滾到圖片了,但圖片還沒開始加載,造成“白屏”或者“圖片加載卡頓” 的問題
2. 首屏關鍵圖被延遲加載
很多同學直接在所有 <img> 標簽上加上 loading="lazy",包括首屏 Banner、Logo、首圖等關鍵視覺內容。
這是個大坑!
首屏圖片本應盡早加載,提升 FCP(首次內容繪制)性能,但 loading="lazy" 會把它推遲,導致頁面看起來很慢。
比如,如下代碼就會導致 FCP 時間變長、LCP 分數下降、用戶體驗變差
<!-- 下面的 Logo 是首屏元素,卻用了 lazy,導致 Logo 顯示很慢 -->
<img src="/logo.png" loading="lazy" alt="品牌Logo" />3. 加載狀態不可監聽
在實際開發中,我們通常需要 監聽圖片懶加載的狀態,比如:增加占位圖
各種色塊的占位圖
各種色塊的占位圖
但是,loading="lazy" 不可監聽!這就會導致以下功能完全無法實現:
- 沒法給圖片加載過程加動畫(比如漸現)
- 沒法給圖片加載失敗加容錯處理(比如加載失敗替換默認圖)
- 沒法實現漸進式加載體驗(如先顯示模糊圖再加載高清圖)
這些需求,loading="lazy" 全都做不到!
4. 只能用于 <img> 和 <iframe>,場景非常局限
如果你想懶加載:
- 背景圖?
- 視頻?
- 組件?
- 滾動區域的 DOM?
- React / Vue 的動態子組件?
都不能用 loading="lazy",完全不適配,只能乖乖用 JS 自己監聽。
正確的方案:IntersectionObserver
當瀏覽器原生的 loading="lazy" 不能滿足我們在 加載控制、動畫處理、骨架屏、兼容性、多元素懶加載 等方面的需求時,更強大、更靈活、更現代的方式就是: IntersectionObserver。

IntersectionObserver 是瀏覽器提供的一個 API,它允許你觀察某個 DOM 元素是否進入或離開視口(或某個指定容器),從而可以在適當時機觸發事件,比如:
- 加載圖片
- 動態加載組件
- 觸發動畫
- 懶加載內容模塊
它會持續監聽一個目標元素是否“交叉”進入指定容器(通常是視口),并觸發回調:
const observer = new IntersectionObserver(callback, options)
observer.observe(targetElement)以 Vue 為例,我們可以通過如下方式來直接完成 懶加載指令
// vue3 指令實現(使用 @vueuse/core 的 useIntersectionObserver)
app.directive('lazy', {
mounted(el, binding) {
const { stop } = useIntersectionObserver(
el,
([{ isIntersecting }]) => {
if (isIntersecting) {
el.src = binding.value
stop()
}
},
)
},
})<img v-lazy="imageUrl" alt="圖片">這種方式雖然比 loading="lazy" 要復雜,但是在實際企業開發中,這才是最可控的方式。
一句話總結下:如果是非常簡單的頁面,那么使用 loading="lazy" 確實是最快捷的方式;但如果你需要更多控制、更復雜的體驗,IntersectionObserver 才是更強大的選擇!



























