懶加載和預加載

一轮听、懶加載

1.什么是懶加載

懶加載也叫延遲加載吸重,指的是在長網(wǎng)頁中延遲加載圖像,是一種很好優(yōu)化網(wǎng)頁性能的方式怪瓶。用戶滾動到它們之前萧落,可視區(qū)域外的圖像不會加載。這與圖像預加載相反洗贰,在長網(wǎng)頁上使用延遲加載將使網(wǎng)頁加載更快找岖。在某些情況下,它還可以幫助減少服務器負載敛滋。常適用圖片很多许布,頁面很長的電商網(wǎng)站場景中。

2.為什么要用懶加載

能提升用戶的體驗绎晃,不妨設想下蜜唾,用戶打開像手機淘寶長頁面的時候,如果頁面上所有的圖片都需要加載庶艾,由于圖片數(shù)目較大灵妨,等待時間很長,用戶難免會心生抱怨落竹,這就嚴重影響用戶體驗泌霍。

減少無效資源的加載,這樣能明顯減少了服務器的壓力和流量述召,也能夠減小瀏覽器的負擔朱转。

防止并發(fā)加載的資源過多會阻塞js的加載,影響網(wǎng)站的正常使用.

3.懶加載的原理

首先將頁面上的圖片的 src 屬性設為空字符串积暖,而圖片的真實路徑則設置在data-original屬性中藤为,

當頁面滾動的時候需要去監(jiān)聽scroll事件,在scroll事件的回調(diào)中夺刑,判斷我們的懶加載的圖片是否進入可視區(qū)域,如果圖片在可視區(qū)內(nèi)將圖片的 src 屬性設置為data-original 的值缅疟,這樣就可以實現(xiàn)延遲加載分别。

4.懶加載實現(xiàn)步驟

<html lang="en">

????<head>

????????<meta charset="UTF-8">

????????<title>Lazyload</title>

????????<style>

????????????.image-item {

????????????????????display: block;

????????????????????margin-bottom: 50px;

????????????????????height: 200px;????//一定記得設置圖片高度

????????????}

????????</style>

????</head>

????<body>

????????????<img src="" class="image-item" lazyload="true" data-original="images/1.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/2.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/3.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/4.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/5.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/6.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/7.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/8.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/9.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/10.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/11.png"/>

????????????<img src="" class="image-item" lazyload="true" data-original="images/12.png"/>

????<script>

????????????var viewHeight =document.documentElement.clientHeight????//獲取可視區(qū)高度

????????????function lazyload(){

????????????????????var eles=document.querySelectorAll('img[data-original][lazyload]')

????????????????????Array.prototype.forEach.call(eles,function(item,index){

????????????????????????var rect

????????????????????????if(item.dataset.original==="")

????????????????????????????return

? ? ? ? ? ? ? ? ? rect=item.getBoundingClientRect()????????// 用于獲得頁面中某個元素的左,上存淫,右和下分別相對瀏覽器視窗的位置? ? ? ? ? ? ? ? ? ? ? ?????????????????if(rect.bottom>=0 && rect.top < viewHeight){

????????????????????????!function(){

????????????????????????????var img=new Image()

????????????????????????????img.src=item.dataset.original

????????????????????????????img.onload=function(){

????????????????????????????????????item.src=img.src

????????????????????????????}

? ? ? ? ? ? ? ? ? ? ? ? ? ? item.removeAttribute("data-original")//移除屬性耘斩,下次不再遍歷

????????????????????????????item.removeAttribute("lazyload")

????????????????????}()

????????????????}

????????????})

????????}

????????lazyload()//剛開始還沒滾動屏幕時,要先觸發(fā)一次函數(shù)桅咆,初始化首頁的頁面圖片

????????document.addEventListener("scroll"括授,lazyload)

????</script>

????</body>

</html>

二、預加載

1.什么是預加載

資源預加載是另一個性能優(yōu)化技術岩饼,我們可以使用該技術來預先告知瀏覽器某些資源可能在將來會被使用到荚虚。預加載簡單來說就是將所有所需的資源提前請求加載到本地,這樣后面在需要用到時就直接從緩存取資源籍茧。

2.為什么要用預加載

在網(wǎng)頁全部加載之前版述,對一些主要內(nèi)容進行加載,以提供給用戶更好的體驗寞冯,減少等待的時間渴析。否則,如果一個頁面的內(nèi)容過于龐大简十,沒有使用預加載技術的頁面就會長時間的展現(xiàn)為一片空白檬某,直到所有內(nèi)容加載完畢。

3.實現(xiàn)預加載的幾種辦法

使用HTML標簽

<img src="http://pic26.nipic.com/20121213/6168183 0044449030002.jpg" style="display:none"/>


使用Image對象

<script src="./myPreload.js"></script>

//myPreload.js文件

var image= new Image()

image.src="http://pic26.nipic.com/20121213/6168183 004444903000 2.jpg"

使用XMLHttpRequest對象,雖然存在跨域問題螟蝙,但會精細控制預加載過程

var xmlhttprequest=new XMLHttpRequest();

xmlhttprequest.onreadystatechange=callback;

xmlhttprequest.onprogress=progressCallback;

xmlhttprequest.open("GET","http://image.baidu.com/mouse,jpg",true);

xmlhttprequest.send();

function callback(){

????if(xmlhttprequest.readyState==4&& xmlhttprequest.status==200){

????????var responseText=xmlhttprequest.responseText;

????}else{

????????console.log("Request was unsuccessful:"+xmlhttprequest.status);

????}

}

function progressCallback(e){

????e=e || event;

? ? if(e.lengthComputable){

????????console.log("Received"+e.loaded+"of"+e.total+"bytes")

????}

}

使用PreloadJS庫

PreloadJS提供了一種預加載內(nèi)容的一致方式恢恼,以便在HTML應用程序中使用。預加載可以使用HTML標簽以及XHR來完成胰默。默認情況下场斑,PreloadJS會嘗試使用XHR加載內(nèi)容,因為它提供了對進度和完成事件的更好支持牵署,但是由于跨域問題漏隐,使用基于標記的加載可能更好。

//使用preload.js

var queue=new createjs.LoadQueue();//默認是xhr對象奴迅,如果是new createjs.LoadQueue(false)是指使用HTML標簽青责,可以跨域

queue.on("complete",handleComplete,this);

queue.loadManifest([

????{id:"myImage",src:"http://pic26.nipic.com/20121213/6168183 0044449030002.jpg"},

????{id:"myImage2",src:"http://pic9.nipic.com/20100814/2839526 1931471581702.jpg"}

]);

function handleComplete(){

????var image=queue.getResuLt("myImage");

????document.body.appendChild(image);

}


三取具、懶加載和預加載的對比

兩者都是提高頁面性能有效的辦法脖隶,兩者主要區(qū)別是一個是提前加載,一個是遲緩甚至不加載暇检。懶加載對服務器前端有一定的緩解壓力作用产阱,預加載則會增加服務器前端壓力

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末块仆,一起剝皮案震驚了整個濱河市构蹬,隨后出現(xiàn)的幾起案子王暗,更是在濱河造成了極大的恐慌,老刑警劉巖庄敛,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俗壹,死亡現(xiàn)場離奇詭異,居然都是意外死亡铐姚,警方通過查閱死者的電腦和手機策肝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門肛捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隐绵,“玉大人,你說我怎么就攤上這事拙毫∫佬恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵缀蹄,是天一觀的道長峭跳。 經(jīng)常有香客問我,道長缺前,這世上最難降的妖魔是什么蛀醉? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衅码,結果婚禮上拯刁,老公的妹妹穿的比我還像新娘。我一直安慰自己逝段,他們只是感情好垛玻,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶躯,像睡著了一般帚桩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘹黔,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天账嚎,我揣著相機與錄音,去河邊找鬼儡蔓。 笑死郭蕉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的浙值。 我是一名探鬼主播恳不,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼开呐!你這毒婦竟也來了烟勋?” 一聲冷哼從身側響起规求,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵惦,沒想到半個月后阻肿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡沮尿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年丛塌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜疾。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡赴邻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啡捶,到底是詐尸還是另有隱情姥敛,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布瞎暑,位于F島的核電站彤敛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏了赌。R本人自食惡果不足惜墨榄,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勿她。 院中可真熱鬧袄秩,春花似錦、人聲如沸嫂拴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筒狠。三九已至猪狈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辩恼,已是汗流浹背雇庙。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶伊,地道東北人疆前。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像聘萨,于是被迫代替她去往敵國和親竹椒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 懶加載的原理: 圖片預加載:就是在網(wǎng)頁全部加載之前米辐,提前加載圖片胸完,當用戶需要查看時可直接從本地緩存中渲染书释,以提供給...
    朝樹閱讀 3,978評論 0 24
  • 懶加載使用場景 圖片進入可視區(qū)域之后請求圖片資源 對于電商等圖片很多,頁面很長的業(yè)務場景適用 減少無效的資源的加載...
    Ethan__Hunt閱讀 2,063評論 0 0
  • 一、懶加載 1.什么是懶加載 懶加載也叫延遲加載赊窥,指的是在長網(wǎng)頁中延遲加載圖像爆惧,是一種很好優(yōu)化網(wǎng)頁性能的方式。用戶...
    浪里行舟閱讀 893評論 0 8
  • 1锨能、懶加載 1.什么是懶加載扯再? 懶加載也就是延遲加載。 當訪問一個頁面的時候址遇,先把img元素或是其他元素的背景圖片...
    卻忘不掉你心言閱讀 520評論 0 4
  • 1熄阻、懶加載 1.什么是懶加載? 懶加載也就是延遲加載傲隶。當訪問一個頁面的時候饺律,先把img元素或是其他元素的背景圖片路...
    xiaolizhenzhen閱讀 70,474評論 18 160