2018-5-24 周周
1.什么是懶加載?
當(dāng)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,先把img元素背景圖片路徑替換成一張?zhí)娲鷪D片的路徑(這樣就只需請(qǐng)求一次,占位圖),將圖片的真實(shí)路徑存儲(chǔ)在img自定義屬性中,只有當(dāng)圖片出現(xiàn)在瀏覽器的可視區(qū)域內(nèi)時(shí),才設(shè)置圖片正真的路徑,讓圖片顯示出來(lái)。這就是圖片懶加載。
2.為什么要用懶加載?
很多頁(yè)面,內(nèi)容很豐富,頁(yè)面很長(zhǎng),圖片較多。比如說(shuō)各種商城頁(yè)面。這些頁(yè)面圖片數(shù)量多,而且比較大,少說(shuō)百來(lái)K,多則上兆。要是頁(yè)面載入就一次性加載完畢,提高首屏加載速度,可以減輕服務(wù)器壓力,節(jié)約流量,用戶體驗(yàn)好。
3.懶加載實(shí)現(xiàn)封裝?
lazyLoad由四個(gè)函數(shù)組成,init(初始化函數(shù)),checkShow(判斷圖片是否加載),shouldShow(將要展示的圖片),showImg(展示圖片)。
(1)初始化函數(shù)(init) 由于滾動(dòng)事件太消耗性能,所以用定時(shí)器替換,不是滾動(dòng)就觸發(fā),而是滾動(dòng)后200毫秒后觸發(fā)。
var timer;
function init(){
$(window).on("scroll",function(){
if(timer){
clearTimeout(timer);
}
timer = setTimeout(function(){
checkShow(); //
},200);
});
}
(2)判斷”圖片是否加載“(checkshow)函數(shù),如果圖片有isload屬性,就說(shuō)明圖片已經(jīng)加載過(guò)了,直接return。如果圖片沒(méi)有isload屬性,進(jìn)入將要展示圖片shouldshow函數(shù)
function checkShow(){
$lazyLoad.each(function(){
$cur = $(this);
if($cur.attr('isLoaded')){
return;
}
if(shouldShow($cur)){
showImg($cur);
}
});
}
(3)將要展示圖片shouldshow函數(shù),獲取屏幕可視寬度,滾動(dòng)高度,要展示的元素到文檔的高度,如果元素到文檔的高度小于屏幕的可視高度加上滾動(dòng)高度,說(shuō)明元素已在可視區(qū)內(nèi),返回true,否則返回false。
function shouldShow ($node){
var scrollH = $(window).scrollTop(),
windowH = $(window).height(),
top = $node.offset().top;
if(top < windowH + scrollH){
return true;
} else {
return false;
}
}
(4)“展示圖片”函數(shù),將元素的src屬性替換為自定義屬性data-src(真正圖片的地址)。
function showImg ($node){
$node.find("img").attr("src",$node.data("src"));
$node.attr("isLoaded",true);
}
(5)函數(shù)返回一個(gè)對(duì)象
return {
init : init
}
這樣就實(shí)現(xiàn)懶加載封裝了!
藍(lán)藍(lán)設(shè)計(jì)的小編 http://tweetduck.com