圖片的懶加載和預(yù)加載

一、懶加載

【1.1】什么是懶加載?

懶加載也就是延遲加載,指的是在長網(wǎng)頁中延遲加載圖像,是一種很好優(yōu)化網(wǎng)頁性能的方式當(dāng)訪問一個頁面的時候,先把img元素或是其他元素的背景圖片路徑替換成一張大小為1*1px圖片的路徑(這樣就只需請求一次,俗稱占位圖),只有當(dāng)圖片出現(xiàn)在瀏覽器的可視區(qū)域內(nèi)時,才設(shè)置圖片正真的路徑,讓圖片顯示出來。這就是圖片懶加載。

【1.2】為什么要懶加載?

當(dāng)很多頁面,內(nèi)容很豐富,頁面很長,圖片較多的時候。比如說各種商城頁面。這些頁面圖片數(shù)量多,而且比較大,少說百來K,多則上兆。要是頁面載入就一次性加載所有圖片,等待時間很長,用戶難免會心生抱怨,這就嚴(yán)重影響用戶體驗。

【1.3】懶加載的原理

頁面中的img元素,如果沒有src屬性,瀏覽器就不會發(fā)出請求去下載圖片,只有通過javascript設(shè)置了圖片路徑,瀏覽器才會發(fā)送請求。懶加載的原理就是先在頁面中把所有的圖片統(tǒng)一使用一張占位圖進(jìn)行占位,把真正的路徑存在元素的“data-src”(這個名字起個自己認(rèn)識好記的就行)屬性里,要用的時候就取出來,再設(shè)置;

【1.4】懶加載的優(yōu)點

頁面加載速度快、可以減輕服務(wù)器的壓力、節(jié)約了流量,用戶體驗好

【1.5】懶加載實現(xiàn)方式

方法一:純粹的延遲加載,使用setTimeOut或setInterval進(jìn)行加載延遲.

方法二:條件加載,符合某些條件,或觸發(fā)了某些事件才開始異步下載。

方法三:可視區(qū)加載,即僅加載用戶可以看到的區(qū)域,這個主要由監(jiān)控滾動條來實現(xiàn),一般會在距用戶看到某圖片前一定距離遍開始加載,這樣能保證用戶拉下時正好能看到圖片。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  <title>Document</title>
  <style>
    .image-item {
      display: block;
      margin-bottom: 50px;
      /* 一定記得設(shè)置圖片高度 */
      height: 200px; 
    }
  </style>
</head>

<body>
  <div class="wrap">
    <img class="image-item" src="" data-src="images/1.jpg" alt="" />
    <img class="image-item" src="" data-src="images/2.jpg" alt="" />
    <img class="image-item" src="" data-src="images/3.jpg" alt="" />
    <img class="image-item" src="" data-src="images/4.jpg" alt="" />
    <img class="image-item" src="" data-src="images/5.jpg" alt="" />
    <img class="image-item" src="" data-src="images/6.jpg" alt="" />
    <img class="image-item" src="" data-src="images/7.jpg" alt="" />
    <img class="image-item" src="" data-src="images/8.jpg" alt="" />
    <img class="image-item" src="" data-src="images/9.jpg" alt="" />
    <img class="image-item" src="" data-src="images/10.jpg" alt="" />
  </div>

  <script>
    // 首先獲得頁面當(dāng)中所有的圖片
    let img = document.getElementsByTagName("img");

    //存儲圖片加裁到的位置,避免每次都從第一 張圖片開始遍歷
    let n = 0;

    //頁面載入完畢加載可視區(qū)域內(nèi)的圖片
    lazyload();

    //注冊滾動條滾動事件
    window.onscroll = lazyload;

    //監(jiān)聽頁面滾動事件
    function lazyload() {

      //可見區(qū)域高度
      let seeHeight = document.documentElement.clientHeight;

      /*滾動條距離頂部高度
      * Chrome: document.body.scrollTop
      * FF: document.documentElement.scrollTop
      **/
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

      for (let i = n; i < img.length; i++) {
        //  當(dāng)前圖片相對于頁面頂部的距離 <= 可視區(qū)域+滾動條距離距離頂部的距離
        if (img[i].offsetTop < seeHeight + scrollTop - 100) {
          //將img[i]的src設(shè)置 成img[i]的data-src
          if (img[i].getAttribute("src") == "") {
            img[i].src = img[i].getAttribute("data-src");
            n = i + 1;
          }
        }
      }
    }
  </script>
</body>

</html>

二、預(yù)加載

【2.1】什么是預(yù)加載?

提前加載圖片,當(dāng)用戶需要查看時可直接從本地緩存中渲染

【2.2】為什么要預(yù)加載?

在網(wǎng)頁全部加載之前,對一些主要內(nèi)容進(jìn)行加載,以提供給用戶更好的體驗,減少等待的時間。否則,如果一個頁面的內(nèi)容過于龐大,沒有使用預(yù)加載技術(shù)的頁面就會長時間的展現(xiàn)為一片空白,直到所有內(nèi)容加載完畢。圖片預(yù)先加載到瀏覽器中,訪問者便可順利地在你的網(wǎng)站上沖浪,并享受到極快的加載速度。這對圖片畫廊及圖片占據(jù)很大比例的網(wǎng)站來說十分有利,它保證了圖片快速、無縫地發(fā)布,也可幫助用戶在瀏覽你網(wǎng)站內(nèi)容時獲得更好的用戶體驗。

【2.3】預(yù)加載的優(yōu)點

預(yù)加載可以說是犧牲服務(wù)器前端性能,換取更好的用戶體驗,這樣可以使用戶的操作得到最快的反映。

【2.4】預(yù)加載實現(xiàn)方式

方法一:CSS方式實現(xiàn)預(yù)加載,隱藏在css的background的url屬性里面

#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }  
#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }  
#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; }

方法二:JavaScript實現(xiàn)預(yù)加載,通過javascript的Image對象設(shè)置實例對象的src屬性實現(xiàn)圖片的預(yù)加載

function preloadImg(url) {
    var img = new Image();
    img.src = url;
    if(img.complete) {
        //接下來可以使用圖片了
        //do something here
    } else {
        img.onload = function() {
            //接下來可以使用圖片了
            //do something here
        };
    }
}

三、懶加載和預(yù)加載的對比

兩者都是提高頁面性能有效的辦法,兩者的行為是相反的,一個是提前加載,一個是遲緩甚至不加載。懶加載對服務(wù)器前端有一定的緩解壓力作用,預(yù)加載則會增加服務(wù)器前端壓力。

四、補(bǔ)充知識

【4.1】原生方法


    document.body.clientWidth // body對象寬度
    document.body.clientHeight // body對象高度

    document.documentElement.clientWidth // 可見區(qū)域?qū)挾?    document.documentElement.clientHeight // 可見區(qū)域高度

    document.body.clientWidth // 網(wǎng)頁可見區(qū)域?qū)?    document.body.clientHeight // 網(wǎng)頁可見區(qū)域高
    document.body.offsetWidth // 網(wǎng)頁可見區(qū)域?qū)?包括邊線的寬)
    document.body.offsetHeight // 網(wǎng)頁可見區(qū)域高(包括邊線的高)
    document.body.scrollWidth // 網(wǎng)頁正文全文寬document.body.scrollHeight // 網(wǎng)頁正文全文高
    document.body.scrollTop // 網(wǎng)頁被卷去的高
    document.body.scrollLeft // 網(wǎng)頁被卷去的左
    window.screenTop // 網(wǎng)頁正文部分上
    window.screenLeft // 網(wǎng)頁正文部分左

    window.screen.height // 屏幕分辨率的高
    window.screen.width // 屏幕可用工作區(qū)高度
    window.screen.availHeight // 屏幕可用工作區(qū)高度
    window.screen.availWidth // 屏幕可用工作區(qū)寬度

    scrollHeight // 獲取對象的滾動高度。   
    scrollLeft // 設(shè)置或獲取位于對象左邊界和窗口中目前可見內(nèi)容的最左端之間的距離   
    scrollTop // 設(shè)置或獲取位于對象最頂端和窗口中可見內(nèi)容的最頂端之間的距離   
    scrollWidth // 獲取對象的滾動寬度   
    offsetHeight // 獲取對象相對于版面或由父坐標(biāo)offsetParent屬性指定的父坐標(biāo)的高度   
    offsetLeft // 獲取對象相對于版面或由父坐標(biāo)offsetParent屬性指定的父坐標(biāo)的計算左側(cè)位置   
    offsetTop //  獲取對象相對于版面或由父坐標(biāo)offsetTop屬性指定的父坐標(biāo)的計算頂端位置   
    event.clientX // 相對文檔的水平座標(biāo)   
    event.clientY // 相對文檔的垂直座標(biāo)   
    event.offsetX // 相對容器的水平坐標(biāo)   
    event.offsetY // 相對容器的垂直坐標(biāo)   
    document.documentElement.scrollTop // 垂直方向滾動的值   
    event.clientX+document.documentElement.scrollTop // 相對文檔的水平座標(biāo)+垂直方向滾動的量 

    // 屏幕可視窗口大?。嫒荩?    window.innerHeight // 標(biāo)準(zhǔn)瀏覽器及IE9+ 
    document.documentElement.clientHeight // 標(biāo)準(zhǔn)瀏覽器及低版本IE標(biāo)準(zhǔn)模式
    document.body.clientHeight // 低版本混雜模式

    // 瀏覽器窗口頂部與文檔頂部之間的距離,也就是滾動條滾動的距離(兼容)
    window.pagYoffset // 標(biāo)準(zhǔn)瀏覽器及IE9+ 
    document.documentElement.scrollTop // 兼容ie低版本的標(biāo)準(zhǔn)模式   
    document.body.scrollTop // 兼容混雜模式

【4.2】jQuery方法

$(window).height() // 瀏覽器時下窗口可視區(qū)域高度   
$(document).height() // 瀏覽器時下窗口文檔的高度   
$(document.body).height() // 瀏覽器時下窗口文檔body的高度   
$(document.body).outerHeight(true) // 瀏覽器時下窗口文檔body的總高度 包括border padding margin   
$(window).width() // 瀏覽器時下窗口可視區(qū)域?qū)挾?  
$(document).width() // 瀏覽器時下窗口文檔對于象寬度   
$(document.body).width() // 瀏覽器時下窗口文檔body的高度   
$(document.body).outerWidth(true) // 瀏覽器時下窗口文檔body的總寬度 包括border padding 
$(document).scrollTop(); //獲取滾動條到頂部的垂直高度
$(document).scrollLeft(); //獲取滾動條到左邊的垂直寬度

【4.3】直觀圖展示

?

文章每周持續(xù)更新,可以微信搜索「 前端大集錦 」第一時間閱讀,回復(fù)【視頻】【書籍】領(lǐng)取200G視頻資料和30本PDF書籍資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 提到前端性能優(yōu)化中圖片資源的優(yōu)化,懶加載和預(yù)加載就不能不說,下面我用最簡潔明了的語言說明懶加載和預(yù)加載的核心要點以...
    一只大橘閱讀 4,056評論 0 9
  • 懶加載的原理: 圖片預(yù)加載:就是在網(wǎng)頁全部加載之前,提前加載圖片,當(dāng)用戶需要查看時可直接從本地緩存中渲染,以提供給...
    朝樹閱讀 4,007評論 0 24
  • 懶加載與預(yù)加載的基本概念。 懶加載也叫延遲加載:前一篇文章有介紹:JS圖片延遲加載 延遲加載圖片或符合某些條件時才...
    greenlift閱讀 1,058評論 0 6
  • 懶加載:又稱延遲加載,需要等到某個情況下才加載,相對可以緩解服務(wù)器壓力。 實現(xiàn)原理:以懶加載圖片為例,當(dāng)加載圖片較...
    琴先森的博客閱讀 564評論 0 0
  • 圖片懶加載的原理是什么? 首先明白為什么要懶加載: 懶加載即延遲,對于圖片過多的頁面,為了加快頁面加載速度,我們需...
    馬建陽閱讀 1,590評論 0 1

友情鏈接更多精彩內(nèi)容