原生JS實(shí)現(xiàn)圖片懶加載(lazyload)

前言

圖片懶加載也是比較常見(jiàn)的一種性能優(yōu)化的方法,最近在用vue做一個(gè)新聞列表的客戶端時(shí)也用到了,這里就簡(jiǎn)單介紹下實(shí)現(xiàn)原理和部分代碼。


實(shí)現(xiàn)原理

加載頁(yè)面的時(shí)候,圖片一直都是流量大頭,針對(duì)圖片的性能方法也挺多的比如base64、雪碧圖等;懶加載也是其中一種,主要原理是將非首屏的圖片src設(shè)為一個(gè)默認(rèn)值,然后監(jiān)聽(tīng)窗口滾動(dòng),當(dāng)圖片出現(xiàn)在視窗中時(shí)再給他賦予真實(shí)的圖片地址,這樣可以保證首屏的加載速度然后按需加載圖片。

示例.png

具體代碼

首先在渲染時(shí),圖片引用默認(rèn)圖片,然后把真實(shí)地址放在data-*屬性上面。
<code><image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'></code></br>
?然后是監(jiān)聽(tīng)滾動(dòng),直接用window.onscroll就可以了,但是要注意一點(diǎn)的是類似于window的scroll和resize,還有mousemove這類觸發(fā)很頻繁的事件,最好用節(jié)流(throttle)或防抖函數(shù)(debounce)來(lái)控制一下觸發(fā)頻率。underscore和lodash里面都有封裝這兩個(gè)方法,這里先不多做介紹了。

?接著要判斷圖片是否出現(xiàn)在了視窗里面,主要是三個(gè)高度:1,當(dāng)前body從頂部滾動(dòng)了多少距離。2,視窗的高度。3,當(dāng)前圖片距離頂部的距離。offsetTop相關(guān)屬性可以參考這里,具體代碼如下:

window.onscroll =_.throttle(this.watchscroll, 200);
watchscroll () { 
      var bodyScrollHeight =  document.body.scrollTop;// body滾動(dòng)高度
      var windowHeight = window.innerHeight;// 視窗高度
      var imgs = document.getElementsByClassName('lazyloadimg');
      for (var i =0; i < imgs.length; i++) {
        var imgHeight = imgs[i].offsetTop;// 圖片距離頂部高度  
        if (imgHeight  < windowHeight  + bodyScrollHeight) {
           imgs[i].src = imgs[i].getAttribute('data-src');
           img[i].className = img[i].className.replace('lazyloadimg','')
        }
      }
    }

結(jié)語(yǔ)

大概內(nèi)容就這么多了,下次可能會(huì)補(bǔ)充一下防抖節(jié)流源碼的實(shí)現(xiàn)。最后再補(bǔ)充兩個(gè)常見(jiàn)的滾動(dòng)判斷:
1.頁(yè)面滾動(dòng)離開(kāi)首屏(這時(shí)可顯示回到頂部的按鈕):<code>document.body.scrollTop > window.innerHeight</code>
2.頁(yè)面滾動(dòng)到底部了(這時(shí)可去調(diào)接口獲取更多內(nèi)容):<code>window.scrollY + window.innerHeight > document.body.offsetHeight</code>

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

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

  • Window和document對(duì)象的區(qū)別 window對(duì)象window對(duì)象表示瀏覽器中打開(kāi)的窗口window對(duì)象是...
    FConfidence閱讀 2,364評(píng)論 0 5
  • 以下是常用的代碼收集,學(xué)習(xí)用。轉(zhuǎn)自豪情博客園 1. PC - js 返回指定范圍的隨機(jī)數(shù)(m-n之間)的公式 re...
    自由加咖啡閱讀 1,102評(píng)論 0 1
  • 首先是在img結(jié)構(gòu)中加入“data-xxx”如下: JavaScript部分: var num = d...
    醉死方休丶閱讀 270評(píng)論 0 0
  • 我們首先要明白,我們給頁(yè)面添加效果用到的js到底是什么?js其實(shí)包含三部分:dom 文檔對(duì)象模型 bom 瀏覽...
    一直以來(lái)都很好閱讀 867評(píng)論 0 0
  • 知其雄,守其雌,為天下溪。為天下溪,恒德不離。恒德不離,復(fù)歸于嬰兒。知其榮,守其辱,為天下谷。為天下谷,恒...
    舒驊閱讀 483評(píng)論 0 0

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