CSS Sprites技術(shù)是一種通過(guò)將圖像合并到單個(gè)文件中來(lái)減少對(duì)圖像資源發(fā)出的HTTP請(qǐng)求數(shù)量的方法。
子畫面是二維圖像,由在定義的X和Y坐標(biāo)下將小圖像組合成一個(gè)大圖像組成。
要顯示組合圖像中的單個(gè)圖像,可以通過(guò)使用CSS background-position屬性,定義要顯示的圖像的確切位置。
具有許多圖像,尤其是許多小圖像(例如圖標(biāo),按鈕等)的網(wǎng)頁(yè)可能需要很長(zhǎng)時(shí)間才能加載并生成多個(gè)服務(wù)器請(qǐng)求。
使用圖像精靈而不是單獨(dú)的圖像將大大減少瀏覽器向服務(wù)器發(fā)出的HTTP請(qǐng)求數(shù)量,這對(duì)于縮短網(wǎng)頁(yè)的加載時(shí)間和網(wǎng)站的整體性能非常有效。
注意:減少HTTP請(qǐng)求的數(shù)量對(duì)減少響應(yīng)時(shí)間具有重大影響,該響應(yīng)時(shí)間使網(wǎng)頁(yè)對(duì)用戶的響應(yīng)速度更快。
查看以下示例,您將看到一個(gè)明顯的不同。當(dāng)您第一次將鼠標(biāo)指針?lè)旁诜荢prite版本的瀏覽器圖標(biāo)上時(shí),將在一段時(shí)間后出現(xiàn)懸停圖像,這是因?yàn)閼彝D像是在鼠標(biāo)懸停時(shí)從服務(wù)器加載的,因?yàn)檎D像和懸停圖像都是兩個(gè)不同的圖像。
而在Sprite版本中,由于所有圖像都合并在一個(gè)圖像中,因此鼠標(biāo)懸停時(shí)會(huì)立即顯示懸停圖像,從而產(chǎn)生平滑的懸停效果。使用CSS Sprite后,用戶通過(guò)訪問(wèn)合成的圖像,可以減少HTTP請(qǐng)求次數(shù),文件總大小也將縮小,可以提高訪問(wèn)的效率。
我們通過(guò)將10張單獨(dú)的圖像組合到一個(gè)圖像(mySprite.png)中來(lái)制作此sprite圖像。您可以使用任何喜歡的圖像編輯工具來(lái)創(chuàng)建自己的精靈。
提示:為簡(jiǎn)單起見(jiàn),我們使用了所有相同大小的圖標(biāo),并將它們彼此靠近放置,以方便進(jìn)行偏移量計(jì)算。
最后,利用CSS,我們可以僅顯示所需圖像精靈的一部分。
首先,我們將創(chuàng)建.sprite將加載精靈圖像的類。這是為了避免重復(fù),因?yàn)樗许?xiàng)目共享相同的背景圖像。
.sprite { background: url("images/mySprite.png") no-repeat; }測(cè)試看看?/?
現(xiàn)在,我們必須為要顯示的每個(gè)項(xiàng)目定義一個(gè)類。例如,要顯示Internet Explorer圖標(biāo)的形式,圖像精靈將是CSS代碼。
.ie { width: 50px; /* Icon width */ height: 50px; /* Icon height */ display: inline-block; /* Display icon as inline block */ background-position: 0 -200px; /* Icon background position in sprite */ }測(cè)試看看?/?
現(xiàn)在出現(xiàn)了問(wèn)題,我們?nèi)绾潍@得這些像素值background-position?讓我們找出答案。第一個(gè)值是背景的水平位置,第二個(gè)是背景的垂直位置。由于Internet Explorer圖標(biāo)的左上角接觸到左邊緣,因此它與起點(diǎn)的水平距離(即圖像精靈的左上角)為0,并且由于它位于第5個(gè)位置,因此其與起點(diǎn)的垂直距離圖片精靈的位置是4 X 50px = 200px,因?yàn)槊總€(gè)圖標(biāo)的高度均為50px。
要顯示Internet Explorer圖標(biāo),我們必須將其左上角移動(dòng)到起點(diǎn),即圖像精靈(mySprite.png)的左上角。另外,由于此圖標(biāo)的垂直距離為200px,因此我們需要將整個(gè)背景圖像(mySprite.png)垂直向上移動(dòng)200px,這要求我們將值應(yīng)用為負(fù)數(shù)-200px,因?yàn)樨?fù)值會(huì)使它垂直向上移動(dòng),而正值會(huì)使它向下移動(dòng)。但是,它不需要水平偏移,因?yàn)镮nternet Explorer圖標(biāo)的左上角之前沒(méi)有像素。
提示:只需background-position在后面的示例中使用property 的值,即可快速了解偏移量的工作原理。
在上一節(jié)中,我們學(xué)習(xí)了如何顯示圖像精靈中的單個(gè)圖標(biāo)。這是使用圖像精靈的最簡(jiǎn)單方法,現(xiàn)在我們將通過(guò)構(gòu)建一個(gè)具有翻轉(zhuǎn)效果的導(dǎo)航菜單向前邁出一步。
在這里,我們將使用相同的精靈圖像(mySprite.png)創(chuàng)建導(dǎo)航菜單。
我們將從創(chuàng)建帶有HTML 無(wú)序列表的導(dǎo)航菜單開(kāi)始。
<ul class="menu"> <li class="firefox"><a href="#">Firefox</a></li> <li class="chrome"><a href="#">Chrome</a></li> <li class="ie"><a href="#">Explorer</a></li> <li class="opera"><a href="#">Opera</a></li> <li class="safari"><a href="#">Safari</a></li> </ul>測(cè)試看看?/?
以下各節(jié)將介紹如何使用CSS將上面示例中給出的簡(jiǎn)單無(wú)序列表轉(zhuǎn)換為基于惡意圖像的導(dǎo)航。
默認(rèn)情況下,HTML 無(wú)序列表顯示為項(xiàng)目符號(hào)。我們需要通過(guò)將list-style-type屬性設(shè)置為來(lái)刪除默認(rèn)的項(xiàng)目符號(hào)none。
ul.menu { list-style-type: none; } ul.menu li { padding: 5px; font-size: 16px; font-family: "Trebuchet MS", Arial, sans-serif; }測(cè)試看看?/?
在這一步中,我們將設(shè)置所有鏈接都將共享的所有公共CSS屬性。如:color,background-image,display,padding等。
ul.menu li a { height: 50px; line-height: 50px; display: inline-block; padding-left: 60px; /* To sift text off the background-image */ color: #3E789F; background: url("images/mySprite.png") no-repeat; /* As all link share the same background-image */ }測(cè)試看看?/?
現(xiàn)在,我們必須為每個(gè)菜單項(xiàng)定義一個(gè)類,因?yàn)閳D像精靈中的每個(gè)項(xiàng)都有不同的background-position。例如,F(xiàn)irefox圖標(biāo)位于圖像精靈的起點(diǎn)即左上角,因此不需要移動(dòng)背景圖像。因此,在這種情況下背景的垂直和水平位置將為0。類似地,您可以為圖像精靈內(nèi)的其他圖標(biāo)定義背景位置。
ul.menu li.firefox a { background-position: 0 0; } ul.menu li.chrome a { background-position: 0 -100px; } ul.menu li.ie a { background-position: 0 -200px; } ul.menu li.safari a { background-position: 0 -300px; } ul.menu li.opera a { background-position: 0 -400px; }測(cè)試看看?/?
添加懸停狀態(tài)與添加上述鏈接具有相同的原理。只需將它們的左上角移動(dòng)到圖像精靈的起點(diǎn)(即,左上角)即可,就像我們上面所做的那樣。您可以background-position使用以下公式簡(jiǎn)單地計(jì)算:
懸停狀態(tài)的垂直位置 = 正常狀態(tài)下的垂直位置 - 50px
由于鼠標(biāo)懸停圖像剛好在默認(rèn)狀態(tài)之下,因此每個(gè)圖標(biāo)的高度均等于50px。圖標(biāo)的懸停狀態(tài)也不需要水平偏移,因?yàn)樵趫D標(biāo)的左上角之前沒(méi)有像素。
ul.menu li.firefox a:hover { background-position: 0 -50px; } ul.menu li.chrome a:hover { background-position: 0 -150px; } ul.menu li.ie a:hover { background-position: 0 -250px; } ul.menu li.safari a:hover { background-position: 0 -350px; } ul.menu li.opera a:hover { background-position: 0 -450px; }測(cè)試看看?/?
做完了!結(jié)合了整個(gè)過(guò)程之后,這是我們最終的HTML和CSS代碼: