1. 程式人生 > 實用技巧 >Js實現圖片的懶載入

Js實現圖片的懶載入

  在有些時候,我們在前端載入的圖片就很多,例如商城之類的網站,圖片就很多,那麼,我們一次性載入所有的圖片的肯定會影響效能,而且會佔用寬頻

  為了解決以上的問題,就出現了懶載入方式來減輕載入的壓力,優先載入可視區域的內容,其他部分等進入可視區域再載入,從而提高效能

  (vue專案的打包中,是把html、css、js進行打包,還有就是圖片的壓縮。但是打包時把js和css都分成了幾個部分,這樣就不至於一個css和js檔案非常大。也是提高效能的一種方式)

  那麼下邊我們就來具體說一說這個圖片懶載入的原理以及實現:

這就是簡單的懶載入,就是在使用滾動條的時候,圖片才實現可視區域的載入

一.原理

  一張圖片就是一個<img>標籤,瀏覽器是否發起請求是根據<img>的src屬性決定的,所以實現圖片的懶載入的關鍵就是,在圖片沒有進入視覺化區域時,先不給<img>的src屬性賦值,這樣瀏覽器就不會發送請求,等到圖片進入可視區域之後,再給src屬性進行賦值即可

二.懶載入的思路及實現

  1.載入可視區域的圖片

  2.判斷圖片是否需要載入

  3.隱形載入圖片

  4.替換真圖片

    (1)載入當頁面顯示時就在可視區域的圖片

      

    (2)那麼我們如何去判斷是否進入可視區域呢? 我們先來看一下一個網頁的整體的區域的劃分

      

      如上圖所示,讓在瀏覽器可視區域的圖片顯示,可視區域外的不顯示,所以當圖片距離頂部的距離top-height等於可視區域h和滾動區域高度s之和時說明圖片馬上就要進入可視區了,就是說當top-height<=s+h時,圖片在可視區。
      這裡介紹下幾個API函式:
      頁可見區域寬: document.body.clientWidth;
      網頁可見區域高: document.body.clientHeight;
      網頁可見區域寬: document.body.offsetWidth (包括邊線的寬);
      網頁可見區域高: document.body.offsetHeight (包括邊線的寬);


      網頁正文全文寬: document.body.scrollWidth;
      網頁正文全文高: document.body.scrollHeight;
      網頁被捲去的高: document.body.scrollTop;
      網頁被捲去的左: document.body.scrollLeft;
      網頁正文部分上: window.screenTop;
      網頁正文部分左: window.screenLeft;
      螢幕解析度的高: window.screen.height;
      螢幕解析度的寬: window.screen.width;
      螢幕可用工作區高度: window.screen.availHeight;

    程式碼實現如下:    

// onload是等所有的資原始檔載入完畢以後再繫結事件
window.onload = function(){
    // 獲取圖片列表,即img標籤列表
    var imgs = document.querySelectorAll('img');

    // 獲取到瀏覽器頂部的距離
    function getTop(e){
        return e.offsetTop;
    }

    // 懶載入實現
    function lazyload(imgs){
        // 可視區域高度
        var h = window.innerHeight;
        //滾動區域高度
        var s = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i=0;i<imgs.length;i++){
            //圖片距離頂部的距離大於可視區域和滾動區域之和時懶載入
            if ((h+s)>getTop(imgs[i])) {
                // 真實情況是頁面開始有2秒空白,所以使用setTimeout定時2s
                (function(i){
                    setTimeout(function(){
                        // 不加立即執行函式i會等於9
                        // 隱形載入圖片或其他資源,
                        //建立一個臨時圖片,這個圖片在記憶體中不會到頁面上去。實現隱形載入
                        var temp = new Image();
                        temp.src = imgs[i].getAttribute('data-src');//只會請求一次
                        // onload判斷圖片載入完畢,真是圖片載入完畢,再賦值給dom節點
                        temp.onload = function(){
                            // 獲取自定義屬性data-src,用真圖片替換假圖片
                            imgs[i].src = imgs[i].getAttribute('data-src')
                        }
                    },2000)
                })(i)
            }
        }
    }
    lazyload(imgs);

    // 滾屏函式
    window.onscroll =function(){
        lazyload(imgs);
    }
}

    

     這樣就實現了圖片的懶載入了

    開始的時候三張圖片在可視區域,所以發起三次請求

    

    隨著滑鼠的向下滾動,其餘圖片也逐漸顯示併發起請求

    

      動態的效果如下:

      

  一個簡單的圖片的懶載入就實現完成了