網頁測試源代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>瀏覽器圖片加載</title> <style type="text/css"> .no_show{ display: none; } </style> <script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script> <script type="text/javascript"> $(function(){ $(".domReady_no_show").css("display","none"); var el = document.createElement('div'); el.innerHTML = '<img src="http://i.mmcdn.cn/simba/img/T1MeV0FbpcXXb1upjX.jpg" />';//到這個階段,瀏覽器就開始產生圖片請求。 // document.body.appendChild(el); new Image().src="http://img01.taobaocdn.com/tps/i1/T14Tx1FmFfXXXRAFgs-110-135.png";//到這個階段,瀏覽器也產生圖片請求。 }) </script> </head> <body> <div>display:none;的圖片會不會加載?會!<img class="no_show" src="http://img03.taobaocdn.com/tps/i3/T1BfxMFdNhXXcr_tT7-490-170.jpg" /></div> <div>DOM結構預備的時候,display:none;的圖片會不會加載?會!<img class="domReady_no_show" src="http://img01.taobaocdn.com/tps/i1/T1BYX3FXdfXXcr_tT7-490-170.jpg"></div> <img nosrc="http://img04.taobaocdn.com/tps/i4/T1L005Fa4cXXXRAFgs-110-135.png" /> 別忘了查看附件 </body> </html>
玉伯博客的講解:
請在主流瀏覽器中打開測試頁面,在Fiddler里查看http請求。
1. 隱藏圖片
《img src=“1.jpg” style=“display: none” /》
測試:test_1.html
結論:只有Opera不產生請求。
注意:用visibility: hidden隱藏圖片時,在Opera下也會產生請求。
2. 重復圖片
《img src=“1.jpg” /》
《img src=“1.jpg” /》
測試:test_2.html
結論:所有瀏覽器都只產生一次請求。
3. 重復背景
《style type=“text/css”》
.test1 { background: url(1.jpg) }
.test2 { background: url(1.jpg) }
《/style》
《div class=“test1”》test1《/div》
《div class=“test2”》test2《/div》
測試:test_3.html
結論:所有瀏覽器都只產生一次請求。
4. 不存在的元素的背景
《style type=“text/css”》
.test1 { background: url(1.jpg) }
.test2 { background: url(2.jpg) } /* 頁面中沒有class為test2的元素 */
《/style》
《div class=“test1”》test1《/div》
測試:test_4.html
結論:背景僅在應用的元素在頁面中存在時,才會產生請求。這對CSS框架來說,很有意義。
5. 隱藏元素的背景
《style type=“text/css”》
.test1 { background: url(1.jpg); display: none; }
.test2 { background: url(2.jpg); visibility: hidden; }
《/style》
《div class=“test1”》test1《/div》
測試:test_5.html
結論:Opera和Firefox對於用display: none隱藏的元素背景,不會產生HTTP請求。僅當這些元素非display: none時,才會請求背景圖片。
6. 多重背景
《style type=“text/css”》
.test1 { background: url(1.jpg); }
.test1 { background: url(2.jpg); }
《/style》
《div class=“test1”》test1《/div》
測試:test_6.html
結論:除了基於webkit渲染引擎的Safari和Chrome,其它瀏覽器只會請求一張背景圖。
注意:webkit引擎瀏覽器對背景圖都請求,是因為支持CSS3中的多背景圖。
7. hover的背景加載
《style type=“text/css”》
a.test1 { background: url(1.jpg); }
a.test1:hover { background: url(2.jpg); }
《/style》
《a href=“#” class=“test1”》test1《/a》
測試:test_7.html
結論:觸發hover時,才會請求hover狀態下的背景。這會造成閃爍,因此經常放在同一張背景圖里通過翻轉來實現。
注意:在圖片no-cache的情況下,IE每次hover狀態改變時,都會產生一次新請求。很糟糕。
8. JS里innerHTML中的圖片
《script type=“text/javascript”》
var el = document.createElement(‘div’);
el.innerHTML = ‘《img src=“1.jpg” /》’;
//document.body.appendChild(el);
《/script》
測試:test_8.html
結論:只有Opera不會馬上請求圖片。
注意:當添加到DOM樹上時,Opera才會發送請求。
9. 圖片預加載
最常用的是JS方案:
《script type=“text/javascript”》
new Image().src = ‘1.jpg’;
new Image().src = ‘2.jpg’;
《/script》
在無JS支持的環境下,可以采用隱藏元素來預加載:
《img src=“1.jpg” style=“visibility: hidden; height: 0; width: 0” /》
測試:test_9.html
終於到總結了
對於隱藏圖片和隱藏元素的背景,Opera不會產生請求。
對於隱藏元素的背景,Firefox也不會產生請求。
對於尚未插入DOM樹的img元素,Opera不會產生請求。
基於webkit引擎的Safari和Chrome,支持多背景圖。
其它情景,所有主流瀏覽器保持一致。
對圖片請求的處理上,個人覺得Opera走在前列。
番外
1. 用Fiddler監控Opera時,如果是本地服務器,需要在Opera的代理服務器設置里,將本地服務器勾選上。
2. 查看HTTP請求數,還有一個萬無一失的方法是,直接查看Apache的access.log文件。
3. 我的Firefox對於重復圖片和重復背景,會產生重復請求。禁用了所有擴展,問題依舊。有知詳情者,還望告知。( lifesinger)
//---------------------------2014/1/17
如果你在html里面已經加載了圖片,再修改img的src,瀏覽器不會產生請求。