CSS Sprites詳解

CSS Sprites技術不新鮮,早在2005年 CSS Zengarden 的園主 Dave Shea 就在 ALA 發(fā)表對該技術的 詳細闡述 。原先只在CSS玩家之間作為一種制作方法流傳,后來出來個 14 Rules for Faster-Loading Web Sites , 技術人員之間競相傳閱,其中第一條規(guī)則Make Fewer HTTP Requests就提到CSS Sprites。于是這個小妖精就火了起來,甚至出現(xiàn)了在線生成工具,勢不可擋也。近來國內(nèi)很多blog都提到CSS Sprites,最著名的例子莫過于 http://www.google.co.kr/ 下方的那幾個動畫。最新發(fā)布的YUI中,也是使用到CSS Sprites,幾乎都有的CSS裝飾圖都被一個 40×2000的圖 包辦。社交大站Facebook最近也使用了一個 22×1150的圖片 承擔了所有icon.一時間,CSS Sprites無處不在。
原理
我們知道,HTML傾向于語義化,在一般情況下不再在標記里寫裝飾性的內(nèi)容而是把呈現(xiàn)的任務交給了CSS。GUI是繽紛多彩的,少不了各種漂亮的圖來裝點。新時代的生產(chǎn)方式是,在HTML布滿各種各樣的鉤子(hook),然后交由CSS來處理。在需要用到圖片的時候,現(xiàn)階段是通過CSS屬性background-image組合background-repeat, background-position等來實現(xiàn)(題外話:為何我提現(xiàn)階段,因為未來瀏覽器若支持content則又新增另外的實現(xiàn)方法)。我們的主角是,你一定猜到了,就是background-position。通過調(diào)整background-position的數(shù)值,背景圖片就能以不同的面貌出現(xiàn)在你眼前。其實圖片整體面貌沒有變,由于圖片位置的改變,你看到只該看到的而已。就好比手表上的日期,你今天看到是21,明天看到是22,是因為它的position往上跳了一格。所以你也大概了解到,CSS Sprites一般只能使用到固定大小的盒子(box)里,這樣才能夠遮擋住不應該看到的部分。
我們使用YUI的sprite.png舉個例子,假如我們有這么一段代碼,max代表最大化,min代表最小化,我們需要給它們配上相應的漂亮圖片(這樣我們的網(wǎng)站才能夠吸引人,才可以賣錢,才可以到佛羅里達曬太陽:D):
<div class="max">最大化</div>
<div class="min">最小化</div>
這兩個class都使用同一個圖片:
.min, max {
width:16px;
height:16px;
background-image:url(http://developer.yahoo.com/yui/build/assets/skins/sam/sprite.png);
background-repeat: no-repeat; //我們并不想讓它平鋪
text-indent:-999em; //隱藏文本的一種方法
}
效果如下:
最大化最小化
最大化最小化
我們看到一團灰,沒錯,因為我們還沒有指定background-position,默認為 0 0,可以看下 sprite.png , 處于這個位置正是灰塊。好了,我們要找到代表最大化的加號和代表最小化的減號的位置找出來。經(jīng)過測量,最大化按鈕位于Y軸的350px處,最小化按鈕位于Y軸400px處。想一想我們?nèi)绾尾拍茏屗鼈兡軌蝻@示出來呢,明顯,要向上提升sprite.png,得到代碼如下:
.max {
background-position: 0 -350px;
}
.min {
background-position: 0 -400px;
}
耶,我們成功了:
最大化最小化
注意:為了舉例的方便,本例子直接在HTML內(nèi)置樣式,切勿在實踐中的非特殊情況使用這種方式)。
優(yōu)點
我們從前面了解到,CSS Sprites為什么突然跑火,跟能夠提升網(wǎng)站性能有關。顯而易見,這是它的巨大優(yōu)點之一。普通制作方式下的大量圖片,現(xiàn)在合并成一個圖片,大大減少了HTTP的連接數(shù)。HTTP連接數(shù)對網(wǎng)站的加載性能有重要影響。
缺點
至于可維護性,這是一般雙刃劍??赡苡腥讼矚g,有人不喜歡,因為每次的圖片改動都得往這個圖片刪除或添加內(nèi)容,顯得稍微繁瑣。而且算圖片的位置(尤其是這種上千px的圖)也是一件頗為不爽的事情。當然,在性能的口號下,這些都是可以克服的。
由于圖片的位置需要固定為某個絕對數(shù)值,這就失去了諸如center之類的靈活性。
前面我們也提到了,必須限制盒子的大小才能使用CSS Sprites,否則可能會出現(xiàn)出現(xiàn)干擾圖片的情況。這就是說,在一些需要非單向的平鋪背景和需要網(wǎng)頁縮放的情況下,CSS Sprites并不合適。YUI的解決方式是,加大圖片之間的距離,這樣可以保持有限度的縮放。
總結
性能壓倒一切。CSS Sprites是值得推廣的一種技術。尤其適宜用于FIR,比如固定大小的icon替換。為保持兼容性,圖片中的各個部分保持一定的距離是一種不錯的做法。
相關文章
- CSS Grid 是一種二維布局系統(tǒng),可以同時控制行和列,相比 Flex(一維布局),更適合用在整體頁面布局或復雜模塊結構中,這篇文章主要介紹了前端CSS Grid 布局詳解,需要的朋2025-04-16
CSS Padding 和 Margin 區(qū)別全解析
CSS 中的 padding 和 margin 是兩個非?;A且重要的屬性,它們用于控制元素周圍的空白區(qū)域,本文將詳細介紹 padding 和 margin 的概念、區(qū)別以及如何在實際項目中使用它們2025-04-07- will-change 是一個 CSS 屬性,用于告訴瀏覽器某個元素在未來可能會發(fā)生哪些變化,本文給大家介紹CSS will-change 屬性詳解,感興趣的朋友一起看看吧2025-04-07
- 本文給大家分享在 CSS 中,去除a標簽(超鏈接)的下劃線的幾種方法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-04-07
- 在前端開發(fā)中,CSS(層疊樣式表)不僅是用來控制網(wǎng)頁的外觀和布局,更是實現(xiàn)復雜交互和動態(tài)效果的關鍵技術之一,隨著前端技術的不斷發(fā)展,CSS的用法也日益豐富和高級,本文將2025-04-07
css中的 vertical-align與line-height作用詳解
文章詳細介紹了CSS中的`vertical-align`和`line-height`屬性,包括它們的作用、適用元素、屬性值、常見使用場景、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧2025-03-26淺析CSS 中z - index屬性的作用及在什么情況下會失效
z-index屬性用于控制元素的堆疊順序,值越大,元素越顯示在上層,它需要元素具有定位屬性(如relative、absolute、fixed或sticky),本文給大家介紹CSS 中z - index屬性的作用2025-03-21- 文章詳細介紹了CSS中的打印媒體查詢@mediaprint包括基本語法、常見使用場景和代碼示例,如隱藏非必要元素、調(diào)整字體和顏色、處理鏈接的URL顯示、分頁控制、調(diào)整邊距和背景等2025-03-18
CSS模擬 html 的 title 屬性(鼠標懸浮顯示提示文字效果)
本文介紹了如何使用CSS模擬HTML的title屬性,通過鼠標懸浮顯示提示文字效果,通過設置`.tipBox`和`.tipBox.tipContent`的樣式,實現(xiàn)了提示內(nèi)容的隱藏和顯示,感興趣的朋友一起2025-03-10CSS3 最強二維布局系統(tǒng)之Grid 網(wǎng)格布局
CS3的Grid網(wǎng)格布局是目前最強的二維布局系統(tǒng),可以同時對列和行進行處理,將網(wǎng)頁劃分成一個個網(wǎng)格,可以任意組合不同的網(wǎng)格,做出各種各樣的布局,本文介紹CSS3 最強二維布局系2025-02-27