Javascript實(shí)現(xiàn)圖片懶加載插件的方法
前言
網(wǎng)絡(luò)上各大論壇,尤其是一些圖片類型的網(wǎng)站上,在圖片加載時(shí)均采用了一種名為懶加載的方式,具體表現(xiàn)為,當(dāng)頁面被請(qǐng)求時(shí),只加載可視區(qū)域的圖片,其它部分的圖片則不加載,只有這些圖片出現(xiàn)在可視區(qū)域時(shí)才會(huì)動(dòng)態(tài)加載這些圖片,從而節(jié)約了網(wǎng)絡(luò)帶寬和提高了初次加載的速度,具體實(shí)現(xiàn)的技術(shù)并不復(fù)雜,下面分別對(duì)其說明。
Web 圖片的懶加載就是通過讀取img元素,然后獲得img元素的data-src(也可以約定為其他屬性名)屬性的值,并賦予img的src,從而實(shí)現(xiàn)動(dòng)態(tài)加載圖片的機(jī)制。
這里需要注意的是: img在初始化的時(shí)候不要設(shè)置src屬性,因?yàn)榧词乖O(shè)置 src='' 瀏覽器也會(huì)嘗試加載圖片。
一個(gè)簡(jiǎn)單的圖片懶加載共涉及兩個(gè)方面
1. HTML 約定
我們首先需要給準(zhǔn)備實(shí)施懶加載的img元素添加指定的class 這里為m-lazyload ,同時(shí)將img src賦值給 data-src屬性。
具體示例為:
<img class="m-lazyload" data-src="imgUrl">
2. JavaScript 實(shí)現(xiàn)
動(dòng)態(tài)加載總共分為以下幾個(gè)步驟,這里每個(gè)步驟都將被拆分為獨(dú)立的函數(shù)
1. 添加頁面滾動(dòng)監(jiān)聽事件
window.addEventListener('scroll', _delay, false);
function _delay() {
clearTimeout(delay);
delay = setTimeout(function () {
_loadImage();
}, time);
}
2. 當(dāng)觸發(fā)監(jiān)聽事件時(shí)會(huì)執(zhí)行 _loadImage 函數(shù),該函數(shù)負(fù)責(zé)加載圖片
function _loadImage() {
for (var i = imgList.length; i--;) {
var el = imgList[i];
if (_isShow(el)) {
el.src = el.getAttribute('data-src');
el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " ");
imgList.splice(i, 1);
}
}
}
雖然執(zhí)行了_loadImage函數(shù),但是我們得知道哪些圖片需要被加載,這里的判斷依據(jù)是什么呢?
依據(jù)就是判斷該圖片是否在當(dāng)前窗口的可視區(qū)域內(nèi),在這里我們封裝一個(gè)_isShow函數(shù)來實(shí)現(xiàn)
function _isShow(el) {
var coords = el.getBoundingClientRect();
return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset));
}
自此一個(gè)圖片加載的閉環(huán)就形成了
當(dāng)網(wǎng)頁滾動(dòng)的事件被觸發(fā) -> 執(zhí)行加載圖片操作 -> 判斷圖片是否在可視區(qū)域內(nèi) -> 在,則動(dòng)態(tài)將data-src的值賦予該圖片。
太簡(jiǎn)單了?
事實(shí)就是如此?。?!
如此簡(jiǎn)單,不妨擴(kuò)展一下
添加一些自定義參數(shù),誰都喜歡自定義,不是嗎?
支持iScroll, iScroll是一個(gè)高性能,資源占用少,無依賴,多平臺(tái)的javascript滾動(dòng)插件。
這里我們做了些優(yōu)化
圖片加載后移除選擇器,避免重復(fù)判斷。
緩存img元素結(jié)合,減少dom元素查詢性能損耗
擴(kuò)展prototype添加getNode方法,支持分頁數(shù)據(jù)懶加載(由于我們之前緩存了dom元素)
OK!說了這么多,show me the code 吧!
(function () {
var imgList = [], // 頁面所有img元素集合
delay, // setTimeout 對(duì)象
offset, //偏移量,用于指定圖片距離可視區(qū)域多少距離,進(jìn)行加載
time, // 延遲載入時(shí)間
_selector; // 選擇器 默認(rèn)為 .m-lazyload
function _isShow(el) {
var coords = el.getBoundingClientRect();
return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset));
}
function _loadImage() {
for (var i = imgList.length; i--;) {
var el = imgList[i];
if (_isShow(el)) {
el.src = el.getAttribute('data-src');
el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " ");
imgList.splice(i, 1);
}
}
}
function _delay() {
clearTimeout(delay);
delay = setTimeout(function () {
_loadImage();
}, time);
}
function ImageLazyload(selector, options) {
var defaults = options || {};
offset = defaults.offset || 0;
time = defaults.time || 250;
_selector = selector || '.m-lazyload';
this.getNode();
_delay();//避免首次加載未觸發(fā)touch事件,主動(dòng)觸發(fā)一次加載函數(shù)
if (defaults.iScroll) {
defaults.iScroll.on('scroll', _delay);
defaults.iScroll.on('scrollEnd', _delay);
} else {
window.addEventListener('scroll', _delay, false);
}
}
ImageLazyload.prototype.getNode = function () {
imgList = [];
var nodes = document.querySelectorAll(_selector);
for (var i = 0, l = nodes.length; i < l; i++) {
imgList.push(nodes[i]);
}
};
})();
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用圖片懶加載的時(shí)候能有所幫助,如果有有疑問大家可以留言交流。
- 基于javascript實(shí)現(xiàn)圖片懶加載
- JavaScript實(shí)現(xiàn)圖片懶加載(Lazyload)
- 快速實(shí)現(xiàn)JS圖片懶加載(可視區(qū)域加載)示例代碼
- 解析javascript圖片懶加載與預(yù)加載的分析總結(jié)
- JavaScript如何實(shí)現(xiàn)圖片懶加載(lazyload) 提高用戶體驗(yàn)(增強(qiáng)版)
- js前端實(shí)現(xiàn)圖片懶加載(lazyload)的兩種方式
- 深入研究jQuery圖片懶加載 lazyload.js使用方法
- javascript瀑布流式圖片懶加載實(shí)例解析與優(yōu)化
- 原生JS實(shí)現(xiàn)圖片懶加載(lazyload)實(shí)例
- 圖片懶加載imgLazyLoading.js使用詳解
- JavaScript實(shí)現(xiàn)圖片懶加載的方法分析
相關(guān)文章
JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述
這篇文章主要介紹了JavaScript實(shí)現(xiàn)職責(zé)鏈模式概述,詳細(xì)的介紹了什么是職責(zé)鏈模式和實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
js 調(diào)用本地exe的例子(支持IE內(nèi)核的瀏覽器)
js 調(diào)用本地exe程序.我實(shí)驗(yàn)了一下 : 使用IE內(nèi)核的瀏覽器 都支持 火狐好像不行,感興趣的碰可以研究下2012-12-12
25個(gè)讓你眼前一亮的JavaScript代碼技巧分享
學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下2023-07-07
List Information About the Binary Files Used by an Applicati
List Information About the Binary Files Used by an Application...2007-06-06
微信小程序?qū)崿F(xiàn)給嵌套template模板傳遞數(shù)據(jù)的方式總結(jié)
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)給嵌套template模板傳遞數(shù)據(jù)的方式,結(jié)合實(shí)例形式總結(jié)分析了微信小程序嵌套template模板的定義、調(diào)用、參數(shù)傳遞及相關(guān)使用技巧,需要的朋友可以參考下2017-12-12
layui實(shí)現(xiàn)下拉復(fù)選功能的例子(包括數(shù)據(jù)的回顯與上傳)
今天小編大家分享一篇layui實(shí)現(xiàn)下拉復(fù)選功能的例子(包括數(shù)據(jù)的回顯與上傳),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
微信小程序?qū)崿F(xiàn)手風(fēng)琴折疊面板
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)手風(fēng)琴折疊面板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

