作為網頁內容的一部分,圖像和視頻通常要消耗很多資源加載。要提高網頁應用的性能,如何避免資源浪費在加載圖像和視頻上就很重要了。但是,很多時候我們都不願意減少網頁上的媒體資源,所以我們經常無從下手。幸運的是,我們有懶加載這個絕招,它可以幫助我們減少加載時間和降低負載,而不在內容上偷工減料。
什么是懶加載?
懶加載是一種在頁面加載時延遲加載一些非關鍵資源的技術,換句話說就是按需加載。
我們之前看到的懶加載一般是這樣的形式:
- 瀏覽一個網頁,准備往下拖動滾動條
- 拖動一個占位圖片到視窗
- 占位圖片被瞬間替換成最終的圖片
為什么使用懶加載而不直接加載?
- 浪費流量。在不計流量收費的網絡,這可能不重要;在按流量收費的網絡中,毫無疑問,一次性加載大量圖片就是在浪費用戶的錢。
- 消耗額外的電量和其他的系統資源,並且延長了瀏覽器解析的時間。因為媒體資源在被下載完成后,瀏覽器必須對它進行解碼,然后渲染在視窗上,這些操作都需要一定的時間。
懶加載圖片和視頻,可以減少頁面加載的時間、頁面的大小和降低系統資源的占用,這些對於性能都有顯著地提升。總體來講,就是改善用戶體驗,增強頁面性能。
懶加載圖解
通過下圖所示(綠色為頁面范圍,紅色為窗口范圍,藍色為待顯示元素)。 $(window).scrollTop() 為 頁面頂部 到 窗口頂部的高度。 $(window).height() 為 窗口的高度。$node.offset().top 為頁面頂部到待顯示元素的高度。即我們可以知道如何判斷一個元素,是否進入用戶視野范圍內,即
$node.offset().top <= $(window).height() + $(window).scrollTop()
條件滿足的時候,這個元素就進入了我們的視野。

懶加載的實現
//進頁面直接調用 start() // 滾動的時候執行加載函數 $(window).on('scroll',function(){ start() }) //加載函數 function start(){ //not('[data-isLoaded]') 用來過濾已經加載過的,實現節流 $('.container img').not('[data-isLoaded]').each(function(){ if( isShow($(this)) ){ loadImg($(this)) } }) } // 判斷是否進入視野的函數 function isShow($node){ return $node.offset().top <= $(window).height() + $(window).scrollTop() } // 格式化圖片加載地址函數 function loadImg($img){ //setTimeout模擬延遲 測試效果用,實際環境不要加 // setTimeout(function(){ $img.attr('src', $img.attr('data-src')) // },500) //加載過后就添加 data-isLoaded屬性 $img.attr('data-isLoaded',1) }
pixabayhttps://www.wode007.com/sites/73237.html wallhavenhttps://www.wode007.com/sites/73236.html
懶加載效果預覽
該 demo 添加了 setTimeout 便於直觀的查看懶加載的效果,實際應用的時候不要添加,因為懶加載的作用就是增強用戶體驗的。
結合該 demo 更好的理解之前的圖解

$(window).height() + $(window).scrollTop() < $(node).offset().top
$(window).height() + $(window).scrollTop() >= $(node).offset().top