自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Web圖片資源的加載與渲染時(shí)機(jī)

開發(fā) 前端
此文研究頁面中的圖片資源的加載和渲染時(shí)機(jī),使得我們能更好的管理圖片資源,避免不必要的流量和提高用戶體驗(yàn)。

此文研究頁面中的圖片資源的加載和渲染時(shí)機(jī),使得我們能更好的管理圖片資源,避免不必要的流量和提高用戶體驗(yàn)。

瀏覽器的工作流程

要研究圖片資源的加載和渲染,我們先要了解瀏覽器的工作原理。以Webkit引擎的工作流程為例: 

 

從上圖可看出,瀏覽器加載一個(gè)HTML頁面后進(jìn)行如下操作:

  • 解析HTML —> 構(gòu)建DOM樹
  • 加載樣式 —> 解析樣式 —> 構(gòu)建樣式規(guī)則樹
  • 加載javascript —> 執(zhí)行javascript代碼
  • 把DOM樹和樣式規(guī)則樹匹配構(gòu)建渲染樹
  • 計(jì)算元素位置進(jìn)行布局
  • 繪制

從上圖我們不能很直觀的看出圖片資源從什么時(shí)候開始加載,下圖標(biāo)出圖片加載和渲染的時(shí)機(jī):

  • 解析HTML【遇到<img>標(biāo)簽加載圖片】 —> 構(gòu)建DOM樹
  • 加載樣式 —> 解析樣式【遇到背景圖片鏈接不加載】 —> 構(gòu)建樣式規(guī)則樹
  • 加載javascript —> 執(zhí)行javascript代碼
  • 把DOM樹和樣式規(guī)則樹匹配構(gòu)建渲染樹【加載渲染樹上的背景圖片】
  • 計(jì)算元素位置進(jìn)行布局
  • 繪制【開始渲染圖片】

圖片加載與渲染規(guī)則

頁面中不是所有的<img>標(biāo)簽圖片和樣式表背景圖片都會(huì)加載。

display:none

  1. <style> 
  2.  
  3. .img-purple { 
  4.  
  5.     background-image: url(../image/purple.png); 
  6.  
  7.  
  8. </style> 
  9.  
  10. <img src="../image/pink.png" style="display:none"
  11.  
  12. <div class="img-purple" style="display:none"></div>  

圖片資源請(qǐng)求如下:

 

設(shè)置了display:none屬性的元素,圖片不會(huì)渲染出來,但會(huì)加載。

原理

把DOM樹和樣式規(guī)則樹匹配構(gòu)建渲染樹時(shí),會(huì)把可渲染元素上的所有屬性(如display:none屬性和background-image屬性)結(jié)合一起產(chǎn)出到渲染樹。

當(dāng)解析渲染樹時(shí)會(huì)加載<img>標(biāo)簽元素上的圖片,發(fā)現(xiàn)元素上有background-image屬性時(shí)會(huì)加載背景圖片。

當(dāng)繪制時(shí)發(fā)現(xiàn)元素上有display:none屬性,則不計(jì)算該元素位置,也不會(huì)繪制該元素。

  1. <style> 
  2.  
  3. .img-yellow { 
  4.  
  5.     background-image: url(../image/yellow.png); 
  6.  
  7.  
  8. </style> 
  9.  
  10. <div style="display:none"
  11.  
  12.     <img src="../image/red.png"
  13.  
  14.     <div class="img-yellow"></div> 
  15.  
  16. </div>  

圖片資源請(qǐng)求如下: 

 

設(shè)置了display:none屬性元素的子元素,樣式表中的背景圖片不會(huì)渲染出來,也不會(huì)加載;而<img>標(biāo)簽的圖片不會(huì)渲染出來,但會(huì)加載。

原理

正如上面所說的,構(gòu)建渲染樹時(shí),只會(huì)把可渲染元素產(chǎn)出到渲染樹,這就意味有不可渲染元素,當(dāng)匹配DOM樹和樣式規(guī)則樹時(shí),若發(fā)現(xiàn)一個(gè)元素的屬性上有display:none,瀏覽器會(huì)認(rèn)為該元素的子元素是不可渲染的,因此不會(huì)把該元素的子元素產(chǎn)出到渲染樹上。

當(dāng)解析渲染樹時(shí)渲染樹上沒有設(shè)置了display:none屬性元素的子元素,因此不會(huì)加載該元素中子元素的背景圖片。

當(dāng)繪制時(shí)也因?yàn)殇秩緲渖蠜]有設(shè)置了display:none屬性元素的子元素,因此該元素中子元素的背景圖片不會(huì)渲染出來。

重復(fù)圖片

  1. .img-blue { 
  2.  
  3.     background-image: url(../image/blue.png); 
  4.  
  5.  
  6. <div class="img-blue"></div> 
  7.  
  8. <img src="../image/blue.png"
  9.  
  10. <img src="../image/blue.png" 

圖片資源請(qǐng)求如下:

 

頁面中多個(gè)<img>標(biāo)簽或樣式表中的背景圖片圖片路徑是同一個(gè),圖片只加載一次。

原理

瀏覽器請(qǐng)求資源時(shí),都會(huì)先判斷是否有緩存,若有緩存且未過期則會(huì)從緩存中讀取,不會(huì)再次請(qǐng)求。先加載的圖片會(huì)存儲(chǔ)到瀏覽器緩存中,后面再次請(qǐng)求同路徑圖片時(shí)會(huì)直接讀取緩存中的圖片。

不存在元素的背景圖片

  1. .img-blue { 
  2.  
  3.     background-image: url(../image/blue.png); 
  4.  
  5.  
  6. .img-orange{ 
  7.  
  8.     background-image: url(../image/orange.png); 
  9.  
  10.  

圖片資源請(qǐng)求如下:

 

不存在元素的背景圖片不會(huì)加載。

原理

不存在的元素不會(huì)產(chǎn)出到DOM樹上,因此渲染樹上也不會(huì)有不存在的元素,當(dāng)解析渲染樹時(shí)無法解析不存在的元素,不存在的元素上的圖片自然不會(huì)加載也不會(huì)渲染。

偽類的背景圖片

  1. .img-green { 
  2.  
  3.     background-image: url(../image/green.png); 
  4.  
  5.  
  6. .img-green:hover{ 
  7.  
  8.     background-image: url(../image/red.png); 
  9.  

觸發(fā)hover前的圖片資源請(qǐng)求如下:

 

觸發(fā)hover后的圖片資源請(qǐng)求如下:

 

當(dāng)觸發(fā)偽類的時(shí)候,偽類樣式上的背景圖片才會(huì)加載。

原理

觸發(fā)hover前,DOM樹與樣式規(guī)則樹匹配的是無hover狀態(tài)選擇器.img-green的樣式,因此渲染樹上background-image屬性的值是url(../image/green.png),解析渲染樹時(shí)加載的是green.png,繪制時(shí)渲染的也是green.png。

觸發(fā)hover后,因?yàn)?img-green:hover的優(yōu)先級(jí)比較高,因此DOM樹與樣式規(guī)則樹匹配的是有hover狀態(tài)選擇器.img-green:hover的樣式,渲染樹上background-image屬性的值是url(../image/red.png),解析渲染樹時(shí)加載的是red.png,繪制時(shí)渲染的也是red.png。

應(yīng)用

占位圖

當(dāng)使用樣式表中的背景圖片作為占位符時(shí),要把背景圖片轉(zhuǎn)為base64格式。這是因?yàn)楸尘皥D片加載的順序在標(biāo)簽后面,背景圖片可能會(huì)在<img>標(biāo)簽圖片加載完成后才開始加載,達(dá)不到想要的效果。 

預(yù)加載

很多場(chǎng)景里圖片是在改變或觸發(fā)狀態(tài)后才顯示出來的,例如點(diǎn)擊一個(gè)Tab后,一個(gè)設(shè)置display:none隱藏的父元素變?yōu)轱@示,這個(gè)父元素里的子元素圖片會(huì)在父元素顯示后才開始加載;又如當(dāng)鼠標(biāo)hover到圖標(biāo)后,改變圖標(biāo)圖片,圖片會(huì)在hover上去后才開始加載,導(dǎo)致出現(xiàn)閃一下這種不友好的體驗(yàn)。

在這種場(chǎng)景下,我們就需要把圖片預(yù)加載,預(yù)加載有很多種方式:

  1. 若是小圖標(biāo),可以合并成雪碧圖,在改變狀態(tài)前就把所有圖標(biāo)都一起加載了。
  2. 使用上文講到的,設(shè)置了display:none屬性的元素,圖片不會(huì)渲染出來,但會(huì)加載。把要預(yù)加載的圖片加到設(shè)置了display:none的元素背景圖或標(biāo)簽里。
  3. 在javascript創(chuàng)建img對(duì)象,把圖片url設(shè)置到img對(duì)象的src屬性里。 
責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2023-10-10 15:32:09

veImageXWeb 圖片

2021-12-17 00:02:28

Webpack資源加載

2011-12-30 16:30:39

Java

2024-11-15 08:30:23

2021-03-19 06:31:06

vue-lazyloa圖片懶加載項(xiàng)目

2024-01-17 08:36:38

useEffect執(zhí)行時(shí)機(jī)函數(shù)

2013-11-20 10:47:57

瀏覽器渲染html

2012-06-05 10:22:45

jQuery

2021-01-07 07:52:04

瀏覽器網(wǎng)頁資源加載

2015-10-08 10:58:51

圖片懶加載

2011-10-21 10:01:22

標(biāo)準(zhǔn)國際標(biāo)準(zhǔn)IETF

2023-04-18 23:44:54

性能優(yōu)化開發(fā)preload

2022-06-07 08:18:49

懶加載Web前端

2016-09-30 13:11:31

前端后端網(wǎng)頁速度

2017-07-13 11:44:20

Web開發(fā)CSSPC

2011-07-22 13:30:52

JavaScript

2015-08-25 10:28:38

前端圖片延遲加載

2011-03-17 10:37:07

JavaScript

2017-11-08 14:34:20

圖片fresco程序員

2011-08-09 10:05:57

TableView服務(wù)器圖片
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)