非首屏圖片延時載入

来源:https://www.cnblogs.com/shapeY/archive/2018/01/05/8205694.html
-Advertisement-
Play Games

目標 減少資源載入可以明顯的優化頁面載入的速度,所以可以減少頁面載入時立即下載的圖片的數量,以提高頁面載入速度,其他的圖片在需要的時候再進行載入。 思路 想要實現以上的目標,有幾個地方需要思考。 1、如何判斷哪些圖片需要立即載入,哪些可以晚些再載入? 2、如何控製圖片在指定的時候載入? 對於第一個問 ...


目標

  減少資源載入可以明顯的優化頁面載入的速度,所以可以減少頁面載入時立即下載的圖片的數量,以提高頁面載入速度,其他的圖片在需要的時候再進行載入。

思路

  想要實現以上的目標,有幾個地方需要思考。

  1、如何判斷哪些圖片需要立即載入,哪些可以晚些再載入?

  2、如何控製圖片在指定的時候載入?

  

  對於第一個問題,頁面打開就會被用戶看到的圖片肯定需要立即載入,其他的可以延後。即在視窗中的圖片需要立即載入。那麼如何判斷圖片是否在視窗內呢?getBoundingClientRect可以返回元素的大小及其相對於視口的位置(詳細說明

  

  可以通過圖中top和right的值判斷圖片是否在視窗中。

  對於第二個問題,先不給img指定src,而是將圖片鏈接地址存放再元素的data-src屬性(自定義)中,需要載入的時候再賦值給src,才會開始下載圖片。

實現

  思路有了,我們開始實現。用以下HTML進行測試

  

HTML
  <div class="container">
    <h1>圖片懶載入</h1>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <img src="" alt="" class="lazy-img" data-src="http://c.hiphotos.baidu.com/zhidao/pic/item/1f178a82b9014a909461e9baa1773912b31bee5e.jpg">
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/1208/1718/ntk-1718-66531.jpg">
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <img src="" alt="" class="lazy-img" data-src="http://2t.5068.com/uploads/allimg/151105/48-151105112944-51.jpg">
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/anime/4654/4654-4708.jpg">
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <img src="" alt="" class="lazy-img" data-src="http://img2.niutuku.com/desk/1208/1721/ntk-1721-66572.jpg">
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>
    <p>測試性配文,測試圖片懶載入</p>

  </div>

  html中鏈接都來自百度圖片,可在network中觀察是否載入,這裡忽略樣式。按照之前的思路,有以下代碼

      //所有的圖片
      var imgs = document.querySelectorAll('.lazy-img');
      //首屏圖片載入
      lazyLoad(imgs)
      //剩餘圖片載入---監聽滾動事件
      window.addEventListener('scroll',function(){
        //滾動事件觸發太頻繁了,所以加上節流
        throttle(lazyLoad(imgs),200,500)
      })
    }

  下麵就是如何實現lazyLoad

    function lazyLoad(imgs,offset){
      offset = offset || 100;
      if (!imgs || imgs.length < 1) {
        console.log('imgs為空');
        return ;
      }
      [].slice.call(imgs).forEach(function(element,index){
        //元素的DomRect
        var rect = element.getBoundingClientRect()
        //出現在視窗中
        if (rect.top <= window.innerHeight + offset && rect.right > 0) {
          element.setAttribute('src',element.getAttribute('data-src'))
        }
      })
    }

  通過window.innerHeight獲取到視窗的高度,當元素距離視窗上邊沿為offset時,載入圖片;其中offset為指定的偏移距離。

  節流函數如下

    function throttle (fn, delay, atleast) {
      let timer = null
      let startTime = new Date()

      return function () {
        let context = this
        let args = arguments
        let curTime = new Date()

        clearTimeout(timer)
        if (curTime - startTime >= atleast) {
          fn.apply(context, args)   // apply 指定函數指向的 上下文(this) 和 參數列表
          startTime = curTime
        } else {
          timer = setTimeout(function () {
            fn.apply(context, args)
            startTime = curTime
          }, delay)
        }
      }
    }

效果

  頁面載入完成,只載入了一張圖片

  

  向下滾動到指定位置,才會依次載入後續圖片

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在HTML中,共有6個級別的標簽:<h1>~<h6>。 標題數字越小,字體就會越大,標題的級別也就越高。 標題標簽的使用對於搜索引擎優化也有著比較重要的作用,這裡就不具體介紹了。 代碼實例: ...
  • 表達式是JavaScript中的短語,那麼語句就是JavaScript的整句或者命令。 JavaScript語句是以分號結尾的(分號有時候是可以省略的,需要保持語義完整性)。 如果說表達式是人體的細胞或者軟組織的話,那麼語句就是更高層次的人體器官,它能夠完成一些較為複雜的操作,改變程式的運行狀態。復 ...
  • 通過查詢瞭解到博客園是有開發博客查詢相關的介面的,列表如下: 但是我們打開其中一個介面的話會發現提供的介面返回的是xml格式的內容,因此如果需要後臺轉發為前臺需要的格式還需要把xml轉換為json數據: 那麼我們一步一步來,首先需要Node將這個介面代理轉發為自己的介面,其實只需要express的r ...
  • 效果: ...
  • 前面的話 本文將詳細介紹演算法複雜度 大O表示法 大O表示法是描述演算法的性能和複雜程度。 分析演算法時,時常遇到以下幾類函數 如何衡量演算法的效率?通常是用資源,例如CPU(時間)占用、記憶體占用、硬碟占用和網路占用。當討論大O表示法時,一般考慮的是CPU(時間)占用 下麵用一些例子來理解大O表示法的規則 ...
  • JavaScript中的標識符的命名有以下規則: 由字母、數字、$、_組成 以字母、$、_開頭 不可以使用保留字!!! 要有意義!!!!!!! 標識符的命名規範: 1.駝峰命名法 除標識符的第一個單詞外,其餘單詞的首字母大寫,例如:trueName 2.蛇型命名法 單詞之間用_隔開,例如:true_ ...
  • 一、什麼是滑動門 大家在網頁中經常會見到這樣一種導航效果,因為使用頻率廣泛,所以廣大的程式員給它起了一個名字,叫做滑動門.在學習滑動門之前,首先你要瞭解什麼是滑動門。 小米官網,網頁滑動門效果 二、實現滑動門所需技術 三、如何實現滑動門1.準備好一段HTML代碼 2.給當前HTML結構添加一些樣式 ...
  • 首先功能是要求前臺導出word,但是前後臺是分離的,圖片存在後臺,所以就存在跨域問題。 導出文字都是沒有問題的(jquery.wordexport.js),但是導出圖片就存在問題了: 圖片是以鏈接形式存到word中,這樣如果是需要vpn的網站就會存在生成的word在沒有vpn的情況下打不開,有vpn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...