懶載入

一、懶載入的概念

  • 概念:懶載入也叫做延遲載入、按需載入,指的是在長網頁中延遲載入圖片數據,是一種較好的網頁性能優化的方式。在比較長的網頁或應用中,如果圖片很多,所有的圖片都被載入出來,而用戶只能看到可視窗口的那一部分圖片數據,這樣就浪費了性能。如果使用圖片的懶載入就可以解決以上問題。在滾動螢幕之前,可視化區域之外的圖片不會進行載入,在滾動螢幕時才載入。這樣使得網頁的載入速度更快,減少了伺服器的負載。懶載入適用於圖片較多,頁面列表較長(長列表)的場景中。

二、懶載入的特點

  • 減少無用資源的載入
    • 使用懶載入明顯減少了伺服器的壓力和流量,同時也減小了瀏覽器的負擔。
  • 提升用戶體驗
    • 如果同時載入較多圖片,可能需要等待的時間較長,這樣影響了用戶體驗,而使用懶載入就能大大的提高用戶體驗。
  • 防止載入過多圖片而影響其他資源文件的載入
    • 載入過多圖片可能會影響網站應用的正常使用。

三、懶載入的實現原理

​

  • 圖片的載入是由src引起的,當對src賦值時,瀏覽器就會請求圖片資源。根據這個原理,我們使用HTML5 的data-xxx屬性來儲存圖片的路徑,在需要載入圖片的時候,將data-xxx中圖片的路徑賦值給src,這樣就實現了圖片的按需載入,即懶載入。

  • 懶載入的實現重點在於確定用戶需要載入哪張圖片,在瀏覽器中,可視區域內的資源就是用戶需要的資源。所以當圖片出現在可視區域時,獲取圖片的真實地址並賦值給圖片即可。

  • 使用原生JavaScript實現懶載入

    • window.innerHeight 是瀏覽器可視區的高度

    • document.body.scrollTop || document.documentElement.scrollTop 是瀏覽器滾動的過的距離

    • imgs.offsetTop 是元素頂部距離文檔頂部的高度(包括滾動條的距離)

    • 圖片載入條件:img.offsetTop < window.innerHeight + document.body.scrollTop

      <div class="container">
      	<img src="loading.gif" data-src="pic.png">
      	<img src="loading.gif" data-src="pic.png">
      	<img src="loading.gif" data-src="pic.png">
      	<img src="loading.gif" data-src="pic.png">
      	<img src="loading.gif" data-src="pic.png">
      <div>
      <script>
          // 獲取全部的圖片元素
          let imgs = document.querySelectorAll('img')
          function lazyLoad () {
              // 獲取瀏覽器滾動的過的距離
              var scrollTop = document.body.scrollTop || document.documentElement.scrollTop
              // 獲取瀏覽器可視區的高度
              var winHeight = window.innerHeight
              for (let i = 0; i < imgs.length; i++) {
                  // 判斷是否滿足圖片載入條件
                  if (imgs[i].offsetTop < scrollTop + winHeight) {
                      imgs[i].src = imgs[i].getAttribute('data-src')
                  }
              }
          }
          window.onscroll = lazyLoad()
      </script>
      

四、懶載入與預載入的區別

  • 這兩種方式都是提高網頁性能的方式,兩者主要區別是一個是提前載入,一個是遲緩甚至不載入。懶載入對伺服器前端有一定的緩解壓力作用,預載入則會增加伺服器前端壓力。
  • 懶載入:
    • 懶載入也叫延遲載入,指的是在長網頁中延遲載入圖片的時機,當用戶需要訪問時,再去載入,這樣可以提高網站的首屏載入速度,提升用戶的體驗,並且可以減少伺服器的壓力。它適用於圖片很多,頁面很長的電商網站的場景。懶載入的實現原理是,將頁面上的圖片的 src 屬性設置為空字元串,將圖片的真實路徑保存在一個自定義屬性中,當頁面滾動的時候,進行判斷,如果圖片進入頁面可視區域內,則從自定義屬性中取出真實路徑賦值給圖片的 src 屬性,以此來實現圖片的延遲載入。
  • 預載入:
    • 預載入指的是將所需的資源提前請求載入到本地,這樣後面在需要用到時就直接從快取取資源。通過預載入能夠減少用戶的等待時間,提高用戶的體驗。我了解的預載入的最常用的方式是使用 js 中的 image 對象,通過為 image 對象來設置 src屬性,來實現圖片的預載入。