通常來講,添加背景圖片有三種辦法:css
<div style="background-image:url('images/Css.JPG')"></div>
<style> #cssContainer1 { background-image: url("images/Css3.JPG"); } </style>
其實這三種方法本質是同樣的,都是寫在了樣式表裏,而不是直接做爲Html頁面中的一個元素。那麼下面來看看下這種寫在樣式表裏的背景圖片和普通img標籤裏的背景圖片加載時有什麼不一樣:html
代碼:瀏覽器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> </head> <body> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <div style="background-image: url('images/Css1.JPG')"> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> </body> </html>
IE7+HttpWatch:服務器
FF3.0+FireBug:網絡
能夠看到,雖然背景圖片所在的div是第四個,但背景圖片「imageInCss.JPG」 倒是直到最後才被加載。測試
這段代碼會看得更清楚:url
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <style> #cssContainer1 { background-image: url("images/Css1.JPG"); } </style> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <div id="cssContainer1" style="background-image: url('images/Css5.JPG')"> <div id="cssContainer2" style="background-image: url('images/Css2.JPG')"> </div> <div id="cssContainer3" style="background-image: url('images/Css3.JPG')"> </div> <div id="cssContainer4"> </div> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> </body> </html>
其中,外聯的CSS文件代碼是:spa
#cssContainer4{ background-image:url("../images/Css4.JPG"); }
頁面中引入了四個具備背景圖片的Div,cssContainer2和cssContainer3的背景圖片是經過直接定義的style,cssContainer4的背景圖片是經過外聯的css文件定義,而cssContainer1的背景圖片則經過內聯的style和直接定義的style雙重聲明瞭。並且cssContainer1這個div包含了其他三個div。測試結果以下:
IE7+HttpWatch:3d
FF3.0+FireBug:code
能夠看到,不管何種形式,背景圖片都在最後加載。並且它們的的加載順序是Css5 -> Css2-> Css3 -> Css4,其中被雙重定義的另外一張背景圖片Css1並無被加載。
那麼咱們能夠獲得以下的結論:
那麼這給咱們的一個重要啓示是:在一個單純由Html和Css組成的頁面中,背景圖片老是最後加載的,倘若咱們想要使用較小的背景圖片做爲佔位符,用於在加載較大的圖片或者Flash文件時給用戶以提示,大部分時候恐怕是達不到效果的,由於背景圖片有時甚至會在大圖片或Flash文件加載完成以後纔會被加載。
固然,這裏一個重要的先決條件就是「單純由Html和Css組成的頁面」,由於JavaScript會對頁面元素的加載產生極大影響,
採用和以前相似的代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <div id="cssContainer1"> <div id="cssContainer2" style="background-image: url('images/Css2.JPG')"> </div> <script> var a; for (var i = 0; i < 1000; i++) { a += i; } </script> <div id="cssContainer3"> </div> <div id="cssContainer4" style="background-image: url('images/Css4.JPG')"> </div> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> <style> #cssContainer1{}{ background-image:url("images/Css1.JPG"); } </style> </body> </html>
其中style.css中的代碼以下:
#cssContainer3{ background-image:url("../images/Css3.JPG"); }
在應用了css樣式設置背景圖片的div中,加入了一段簡單的循環運行1000次的Javascript腳本。
IE7+HttpWatch:
FF3.0+FireBug:
這裏大概可以看出一些問題:
再看下一段代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <style> #cssContainer1 { background-image: url("images/Css1.JPG"); } </style> <div id="cssContainer1"> <div id="cssContainer2" style="background-image: url('images/Css2.JPG')"> </div> <script> </script> <div id="cssContainer3"> </div> <div id="cssContainer4" style="background-image: url('images/Css4.JPG')"> </div> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> </body> </html>
相比第一段代碼,這裏把Javascript腳本簡化爲一對空的Script標籤,並且把以前放在最後的設置cssContainer1的背景圖片的內聯style放到了script的前面。
IE7+HttpWatch:
FF3.0+FireBug:
那麼如今咱們能夠看出幾點:
看下下面的代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <style> #cssContainer1 { background-image: url("images/Css1.JPG"); } </style> <div id="cssContainer1"> <div id="cssContainer2" style="background-image: url('images/Css2.JPG')"> </div> <script> </script> <div id="cssContainer3"> </div> </div> <div id="cssContainer4" style="background-image: url('images/Css4.JPG')"> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> </body> </html>
圖片CSS4.jpg被放到了最後加載!而CSS3.jpg雖然也是在Script以後才定義的,並且是放在外部Css文件中的CSS3.jpg,因爲在執行Javascript的時候Css文件已被加載完畢,卻依然被提早加載了。如今咱們能夠猜測,在Firefox中,圖片的加載順序受Javascript的影響下,同時與Div的結構有關。
本節的最後一段代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>測試圖片加載順序</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <div id="div1"> <img src="images/Div1.jpg" /></div> <div id="div2"> <img src="images/Div2.jpg" /></div> <div id="div3"> <img src="images/Div3.jpg" /></div> <div> <div id="cssContainer1"> <div id="cssContainer2" style="background-image: url('images/Css2.JPG')"> </div> <script>for(var i=0;i<1000;i++){var a++}</script> <div id="cssContainer3"> </div> </div> <div id="cssContainer4" style="background-image: url('images/Css4.JPG')"> </div> <div id="div4"> <img src="images/Div4.jpg" /></div> </div> <div id="div5"> <img src="images/Div5.jpg" /></div> <div id="div6"> <img src="images/Div6.jpg" /></div> <div id="div7"> <img src="images/Div7.jpg" /></div> <div id="div8"> <img src="images/Div8.jpg" /></div> <div id="div9"> <img src="images/Div9.jpg" /></div> <div id="div10"> <img src="images/Div10.jpg" /></div> <div id="div11"> <img src="images/Div11.jpg" /></div> <div id="div12"> <img src="images/Div12.jpg" /></div> <style> #cssContainer1 { background-image: url("images/Css1.JPG"); } </style> </body> </html>
其中style.css文件作了一些調整,變成:
#cssContainer1{ background-image:url("../images/Css5.JPG"); } #cssContainer3{ background-image:url("../images/Css3.JPG"); }
這部分代碼和以前的差別:一是用一個新的Div套住了cssContainer一、cssContainer4和一個普通的Div4;另外在外聯的css文件中,重複定義了cssContainer1的背景圖片,另外一個定義在Html文檔的最末端。
FF3.0+FireBug:
到這裏基本能夠總結出來Firefox在Script的影響下對圖片的加載順序:
與IE不一樣,FF遵照的是另外一套DIV逐級解析的模式。受Script標籤影響的不只僅是Script標籤以前的圖片,還包括了包含Script標籤的父級標籤內的全部圖片。在同級標籤中,圖片的加載順序符合先內嵌、後背景的原則,而不一樣級的標籤,則按由先到後的順序加載。
此外,看下IE:
注意被選中的那一行,其中那個Result字段爲Abort的CSS5.jpg圖片。本來因爲外聯CSS優先級最低,CSS5.jpg應當被後定義的內聯CSS1.jpg覆蓋,不被加載,但因爲Javascript的影響,這裏卻被加載了,雖然因爲IE很快讀到了HTML的末端,發現了後定義的CSS1.jpg,取消了CSS5.jpg的加載。但若是網速較慢,HTML文檔或Javascript的執行時間較長,CSS5.jpg可能在很晚甚至所有加載完時才被取消,而在FireFox中,彷佛沒有Abort的操做,CSS5.jpg正是被徹底加載了!
這給咱們的啓示是:
注:
Script標籤對圖片加載的影響和網絡狀況以及Script自己執行時長有關。當把頁面放在本地服務器上測試時,一個空的Script標籤甚至不會對圖片的加載順序產生影響,圖片依然按照前兩節的順序加載。而網絡越慢,或者Script執行時間越長(在本地服務器,通常須要萬次以上的循環),Script對圖片加載順序的影響越明顯。