前端圖片懶加載(lazyload)的實(shí)現(xiàn)方法(提高用戶體驗(yàn))
定義
圖片懶加載又稱圖片延時(shí)加載、惰性加載,即在用戶需要使用圖片的時(shí)候加載,這樣可以減少請(qǐng)求,節(jié)省帶寬,提高頁面加載速度,相對(duì)的,也能減少服務(wù)器壓力。
惰性加載是程序人性化的一種體現(xiàn),提高用戶體驗(yàn),防止一次性加載大量數(shù)據(jù),而是根據(jù)用戶需要進(jìn)行資源的請(qǐng)求。
實(shí)現(xiàn)
懶加載的難點(diǎn)在于確定某張圖片是否是用戶需要的資源,在瀏覽器中,用戶需要的是可視區(qū)內(nèi)的資源,因此我們只需要判斷圖片是否已經(jīng)呈現(xiàn)在可視區(qū)內(nèi),當(dāng)圖片呈現(xiàn)在可視區(qū)內(nèi)時(shí),獲取圖片的真實(shí)地址并賦給該圖片即可(圖片寬高需要指定,可以利用padding處理)。
判斷是否存在于可視區(qū)
瀏覽器視口高度
待加載資源距離視口頂端位置
通過以上兩點(diǎn)即可判斷圖片是否位于可視區(qū)內(nèi)。
var nodes = document.querySelectorAll('img[data-src]'), elem = nodes[0], rect = elem.getBoundingClientRect(), vpHeight = document.documentElement.clientHeight; if(rect.top < vpHeight && rect.bottom>=0) { console.log('show') }
之后獲取圖片的真實(shí)地址
<img src="loading.gif" alt="" data-src="1.gif"> ... <script data-filtered="filtered"> var src = elem.dataset.src; </script>
把真實(shí)地址賦給圖片
var img = new Image(); img.onload = function(){ elem.src = img.src; } img.src = src;
完整代碼
var scrollElement = document.querySelector('.page'), viewH = document.documentElement.clientHeight; function lazyload(){ var nodes = document.querySelectorAll('img[data-src]'); Array.prototype.forEach.call(nodes,function(item,index){ var rect; if(item.dataset.src==='') return; rect = item.getBoundingClientRect(); if(rect.bottom>=0 && rect.top < viewH){ (function(item){ var img = new Image(); img.onload = function(){ item.src = img.src; } img.src = item.dataset.src item.dataset.src = '' })(item) } }) } lazyload(); scrollElement.addEventListener('scroll',throttle(lazyload,500,1000)); function throttle(fun, delay, time) { var timeout, startTime = new Date(); return function() { var context = this, args = arguments, curTime = new Date(); clearTimeout(timeout); if (curTime - startTime >= time) { fun.apply(context, args); startTime = curTime; } else { timeout = setTimeout(fun, delay); } }; };
總結(jié)
以上所述是小編給大家介紹的前端圖片懶加載(lazyload)的實(shí)現(xiàn)方法(提高用戶體驗(yàn)),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JS判斷是否為JSON對(duì)象及是否存在某字段的方法(推薦)
下面小編就為大家?guī)硪黄狫S判斷是否為JSON對(duì)象及是否存在某字段的方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11JavaScript this關(guān)鍵字指向常用情況解析
這篇文章主要介紹了JavaScript this關(guān)鍵字指向常用情況解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09html+css+js實(shí)現(xiàn)canvas跟隨鼠標(biāo)的小圓特效源碼
這篇文章主要介紹了html+css+js實(shí)現(xiàn)canvas跟隨鼠標(biāo)的小圓特效源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03js實(shí)現(xiàn)遮罩層劃出效果是生成div而不是顯示
單純的遮蓋層劃出是比較簡單的,而本例介紹的這個(gè)就有點(diǎn)難度,生成div,而不是顯示存在的div,需要的朋友可以參考下2014-07-07整理Javascript數(shù)組學(xué)習(xí)筆記
整理Javascript數(shù)組學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript數(shù)組,希望大家繼續(xù)關(guān)注2015-11-11JS學(xué)習(xí)筆記之原型鏈和利用原型實(shí)現(xiàn)繼承詳解
這篇文章主要介紹了JS學(xué)習(xí)筆記之原型鏈和利用原型實(shí)現(xiàn)繼承,結(jié)合實(shí)例形式詳細(xì)分析了javascript原型鏈以及利用原型實(shí)現(xiàn)繼承的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-05-05基于js原生和ajax的get和post方法以及jsonp的原生寫法實(shí)例
下面小編就為大家?guī)硪黄趈s原生和ajax的get和post方法以及jsonp的原生寫法實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10