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

有時(shí)候一個(gè)網(wǎng)頁(yè)會(huì)包含很多的圖片莉御,例如淘寶京東這些購(gòu)物網(wǎng)站撇吞,商品圖片多只之又多,頁(yè)面圖片多礁叔,加載的圖片就多牍颈。服務(wù)器壓力就會(huì)很大。不僅影響渲染速度還會(huì)浪費(fèi)帶寬琅关。比如一個(gè)1M大小的圖片煮岁,并發(fā)情況下,達(dá)到1000并發(fā)涣易,即同時(shí)有1000個(gè)人訪問(wèn)画机,就會(huì)產(chǎn)生1個(gè)G的帶寬。

為了解決以上問(wèn)題新症,提高用戶體驗(yàn)步氏,就出現(xiàn)了懶加載方式來(lái)減輕服務(wù)器的壓力,優(yōu)先加載可視區(qū)域的內(nèi)容徒爹,其他部分等進(jìn)入了可視區(qū)域再加載荚醒,從而提高性能。

vue項(xiàng)目中的打包隆嗅,是把html界阁、css、js進(jìn)行打包胖喳,還有圖片壓縮泡躯。但是打包時(shí)把css和js都分成了幾部分,這樣就不至于一個(gè)css和就是文件非常大。也是優(yōu)化性能的一種方式精续。

JS 圖片加載器插件

效果動(dòng)圖如下:
[示例圖片]https://img-blog.csdnimg.cn/20190524171929234.gif

1.懶加載原理

一張圖片就是一個(gè)<img>標(biāo)簽坝锰,瀏覽器是否發(fā)起請(qǐng)求圖片是根據(jù)<img>src屬性,所以實(shí)現(xiàn)懶加載的關(guān)鍵就是重付,在圖片沒(méi)有進(jìn)入可視區(qū)域時(shí)顷级,先不給<img>src賦值,這樣瀏覽器就不會(huì)發(fā)送請(qǐng)求了确垫,等到圖片進(jìn)入可視區(qū)域再給src賦值弓颈。

2.懶加載思路及實(shí)現(xiàn)

實(shí)現(xiàn)懶加載有四個(gè)步驟,如下:
1.加載loading圖片
2.判斷哪些圖片要加載【重點(diǎn)】
3.隱形加載圖片
4.替換真圖片

1.加載loading圖片是在html部分就實(shí)現(xiàn)的删掀,代碼如下:
示例圖片

2.如何判斷圖片進(jìn)入可視區(qū)域是關(guān)鍵翔冀。
示例圖片

如上圖所示,讓在瀏覽器可視區(qū)域的圖片顯示披泪,可視區(qū)域外的不顯示纤子,所以當(dāng)圖片距離頂部的距離top-height等于可視區(qū)域h和滾動(dòng)區(qū)域高度s之和時(shí)說(shuō)明圖片馬上就要進(jìn)入可視區(qū)了,就是說(shuō)當(dāng)top-height<=s+h時(shí)款票,圖片在可視區(qū)控硼。
這里介紹下幾個(gè)API函數(shù):
頁(yè)可見(jiàn)區(qū)域?qū)挘?document.body.clientWidth;
網(wǎng)頁(yè)可見(jiàn)區(qū)域高: document.body.clientHeight;
網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)挘?document.body.offsetWidth (包括邊線的寬);
網(wǎng)頁(yè)可見(jiàn)區(qū)域高: document.body.offsetHeight (包括邊線的寬);
網(wǎng)頁(yè)正文全文寬: document.body.scrollWidth;
網(wǎng)頁(yè)正文全文高: document.body.scrollHeight;
網(wǎng)頁(yè)被卷去的高: document.body.scrollTop;
網(wǎng)頁(yè)被卷去的左: document.body.scrollLeft;
網(wǎng)頁(yè)正文部分上: window.screenTop;
網(wǎng)頁(yè)正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的寬: window.screen.width;
屏幕可用工作區(qū)高度: window.screen.availHeight;

HTMLElement.offsetTop 為只讀屬性,它返回當(dāng)前元素相對(duì)于其 offsetParent 元素的頂部的距離艾少。
window.innerHeight:瀏覽器窗口的視口(viewport)高度(以像素為單位)卡乾;如果有水平滾動(dòng)條,也包括滾動(dòng)條高度缚够。

具體實(shí)現(xiàn)的js代碼為:
``// onload是等所有的資源文件加載完畢以后再綁定事件
window.onload = function(){
// 獲取圖片列表幔妨,即img標(biāo)簽列表
var imgs = document.querySelectorAll('img');
// 獲取到瀏覽器頂部的距離
function getTop(e){
return e.offsetTop;
}

// 懶加載實(shí)現(xiàn)
function lazyload(imgs){
    // 可視區(qū)域高度
    var h = window.innerHeight;
    //滾動(dòng)區(qū)域高度
    var s = document.documentElement.scrollTop || document.body.scrollTop;
    for(var i=0;i<imgs.length;i++){
        //圖片距離頂部的距離大于可視區(qū)域和滾動(dòng)區(qū)域之和時(shí)懶加載
        if ((h+s)>getTop(imgs[i])) {
            // 真實(shí)情況是頁(yè)面開(kāi)始有2秒空白,所以使用setTimeout定時(shí)2s
            (function(i){
                setTimeout(function(){
                    // 不加立即執(zhí)行函數(shù)i會(huì)等于9
                    // 隱形加載圖片或其他資源谍椅,
                    //創(chuàng)建一個(gè)臨時(shí)圖片误堡,這個(gè)圖片在內(nèi)存中不會(huì)到頁(yè)面上去。實(shí)現(xiàn)隱形加載
                    var temp = new Image();
                    temp.src = imgs[i].getAttribute('data-src');//只會(huì)請(qǐng)求一次
                    // onload判斷圖片加載完畢雏吭,真是圖片加載完畢埂伦,再賦值給dom節(jié)點(diǎn)
                    temp.onload = function(){
                        // 獲取自定義屬性data-src,用真圖片替換假圖片
                        imgs[i].src = imgs[i].getAttribute('data-src')
                    }
                },2000)
            })(i)
        }
    }
}
lazyload(imgs);

// 滾屏函數(shù)
window.onscroll =function(){
    lazyload(imgs);
}

}``

本文章轉(zhuǎn)載與https://blog.csdn.net/w1418899532/article/details/90515969

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末思恐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膊毁,更是在濱河造成了極大的恐慌胀莹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚温,死亡現(xiàn)場(chǎng)離奇詭異描焰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)荆秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篱竭,“玉大人,你說(shuō)我怎么就攤上這事步绸〔舯疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瓤介,是天一觀的道長(zhǎng)吕喘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刑桑,這世上最難降的妖魔是什么氯质? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祠斧,結(jié)果婚禮上闻察,老公的妹妹穿的比我還像新娘。我一直安慰自己琢锋,他們只是感情好辕漂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吩蔑,像睡著了一般钮热。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烛芬,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天隧期,我揣著相機(jī)與錄音,去河邊找鬼赘娄。 笑死仆潮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遣臼。 我是一名探鬼主播性置,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揍堰!你這毒婦竟也來(lái)了鹏浅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屏歹,失蹤者是張志新(化名)和其女友劉穎隐砸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝙眶,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡季希,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片式塌。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡博敬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峰尝,到底是詐尸還是另有隱情偏窝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布境析,位于F島的核電站囚枪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劳淆。R本人自食惡果不足惜链沼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沛鸵。 院中可真熱鬧括勺,春花似錦、人聲如沸曲掰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栏妖。三九已至乱豆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吊趾,已是汗流浹背宛裕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留论泛,地道東北人揩尸。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屁奏,于是被迫代替她去往敵國(guó)和親岩榆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354