這篇文章主要介紹如何原生JS實現(xiàn)圖片懶加載之頁面性能優(yōu)化,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供大安網(wǎng)站建設(shè)、大安做網(wǎng)站、大安網(wǎng)站設(shè)計、大安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、大安企業(yè)網(wǎng)站模板建站服務(wù),10多年大安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
在項目開發(fā)中,我們往往會遇到一個頁面需要加載很多圖片的情況。我們可以一次性加載全部的圖片,但是考慮到用戶有可能只瀏覽部分圖片。所以我們需要對圖片加載進行優(yōu)化,只加載瀏覽器窗口內(nèi)的圖片,當用戶滾動時,再加載更多的圖片。這種加載圖片的方式叫做圖片懶加載,又叫做按需加載或圖片的延時加載。這樣做的好處是:1.可以加快頁面首屏渲染的速度;2.節(jié)約用戶的流量。
一.實現(xiàn)思路
1.圖片img標簽自定義一個屬性data-src來存放真實的地址。
2.當滾動頁面時,檢查所有的img標簽,判斷是否出現(xiàn)在事業(yè)中,如果出現(xiàn)在視野中,繼續(xù)進行判斷,看齊是否被加載過了,如果沒有加載,那就進行加載。
判斷圖片元素是否處于瀏覽器視野中的示意圖(手繪):
二.根據(jù)思路完成代碼如下:
原生js實現(xiàn)圖片懶加載
好了,在瀏覽器中運行一下,第一次進頁面如果不滾動滾輪的話什么也看不到,所以第一次進頁面需要調(diào)用checkShow(),處于視野中的圖片也加載出來。
在代碼最后加上:
// 第一次進頁面加載處于視野中的圖片 Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{ let img=li.getElementsByTagName('img')[0]; // 判斷當前img是否出現(xiàn)在了視野中 // 判斷當前img是否被加載過了 if(checkShow(img) && !isLoaded(img)){ loadImg(img); } })
此時我們發(fā)現(xiàn)判斷加載視野中的圖片代碼存在重復,直接封裝成一個新的方法lazyRenderImg();
// window綁定滾動事件 window.addEventListener('scroll',function(){ // 遍歷所有的img標簽 lazyRenderImg(); }); function lazyRenderImg(){ Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{ let img=li.getElementsByTagName('img')[0]; // 判斷當前img是否出現(xiàn)在了視野中 // 判斷當前img是否被加載過了 if(checkShow(img) && !isLoaded(img)){ loadImg(img); } }) } // 第一次進頁面加載處于視野中的圖片 lazyRenderImg();
三.性能優(yōu)化
問題:window.scroll
方法頁面只要一滾動就會觸發(fā)里面的方法,對性能影響很大
解決方法:當頁面停止?jié)L動的時候,再去執(zhí)行頁面中的方法,類似與函數(shù)節(jié)流(throttle)
Tips:函數(shù)節(jié)流:等時間間隔執(zhí)行函數(shù), 讓一個函數(shù)不要執(zhí)行得太頻繁,減少一些過快的調(diào)用來節(jié)流。
// window綁定滾動事件 let timer; window.addEventListener('scroll',function(){ console.log('scroll') // 遍歷所有的img標簽 if(timer){ clearTimeout(timer) } timer=setTimeout(()=>{ console.log('lazyRenderImg...'); lazyRenderImg(); },300);
通過打印的日志發(fā)現(xiàn)當滾動停止后才執(zhí)行lazyRenderImg
方法的,確實減少了不必要調(diào)用lazyRenderImg
的次數(shù)。
以上是“如何原生JS實現(xiàn)圖片懶加載之頁面性能優(yōu)化”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!