作為網頁內容的一部分,影像和視訊通常要消耗很多資源載入。要提高網頁應用的效能,如何避免資源浪費在載入影像和視訊上就很重要了。但是,很多時候我們都不願意減少網頁上的媒體資源,所以我們經常無從下手。幸運的是,我們有懶載入這個絕招,它可以幫助我們減少載入時間和降低負載,而不在內容上偷工減料。
認識懶載入
什麼是懶載入?
懶載入是一種在頁面載入時延遲載入一些非關鍵資源的技術,換句話說就是按需載入。
我們之前看到的懶載入一般是這樣的形式:
- 瀏覽一個網頁,準備往下拖動滾動條
- 拖動一個佔點陣圖片到視窗
- 佔點陣圖片被瞬間替換成最終的圖片
為什麼使用懶載入而不直接載入?
- 浪費流量。在不計流量收費的網路,這可能不重要;在按流量收費的網路中,毫無疑問,一次性載入大量圖片就是在浪費使用者的錢。
- 消耗額外的電量和其他的系統資源,並且延長了瀏覽器解析的時間。因為媒體資源在被下載完成後,瀏覽器必須對它進行解碼,然後渲染在視窗上,這些操作都需要一定的時間。
懶載入圖片和視訊,可以減少頁面載入的時間、頁面的大小和降低系統資源的佔用,這些對於效能都有顯著地提升。總體來講,就是改善使用者體驗,增強頁面效能。
圖解
通過下圖所示(綠色為頁面範圍,紅色為視窗範圍,藍色為待顯示元素)。 $(window).scrollTop()
為 頁面頂部 到 視窗頂部的高度。 $(window).height()
為 視窗的高度。$node.offset().top
為頁面頂部到待顯示元素的高度。即我們可以知道如何判斷一個元素,是否進入使用者視野範圍內,即
$node.offset().top <= $(window).height() + $(window).scrollTop()
條件滿足的時候,這個元素就進入了我們的視野。
進入視野 與 抵達底部
如何判斷元素出現在使用者視野?
$(window).scrollTop()
為 頁面頂部 到 視窗頂部的高度。$(window).height()
為 視窗的高度。$node.offset().top
為頁面頂部到待顯示元素的高度。即我們可以知道如何判斷一個元素,是否進入使用者視野範圍內,即
$(window).height() + $(window).scrollTop() >= $node.offset().top
條件滿足的時候,這個元素就進入了我們的視野。(上圖已經分析過)
如何判斷瀏覽器滾動到最底部?
$(window).scrollTop()
為 頁面頂部 到 視窗頂部的高度。$(window).height()
為 視窗的高度。$(`body`).height()
為頁面整個文件的高度。即我們可以知道如何判斷瀏覽器是否滾動到最底部,即$(window).height() + $(window).scrollTop() >= $(`body`).height()
條件滿足的時候,瀏覽器滾動到最底部。
懶載入的實現
//進頁面直接呼叫 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) }
View Code
Demo 效果預覽
懶載入效果預覽
該 demo 新增了 setTimeout 便於直觀的檢視懶載入的效果,實際應用的時候不要新增,因為懶載入的作用就是增強使用者體驗的。
結合該 demo 更好的理解之前的圖解