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。于是這個小妖精就火了起來,甚至出現了在線生成工具,勢不可擋也。近來國內很多blog都提到CSS Sprites,最著名的例子莫過于 http://www.google.co.kr/ 下方的那幾個動畫。最新發(fā)布的YUI中,也是使用到CSS Sprites,幾乎都有的CSS裝飾圖都被一個40×2000的圖包辦。社交大站Facebook最近也使用了一個22×1150的圖片承擔了所有icon. 一時間,CSS Sprites無處不在。
原理
我們知道,HTML傾向于語義化,在一般情況下不再在標記里寫裝飾性的內容而是把呈現的任務交給了CSS。GUI是繽紛多彩的,少不了各種漂亮的圖來裝點。新時代的生產方式是,在HTML布滿各種各樣的鉤子(hook),然后交由CSS來處理。在需要用到圖片的時候,現階段是通過CSS屬性background-image組合background-repeat, background-position等來實現(題外話:為何我提現階段,因為未來瀏覽器若支持content則又新增另外的實現方法)。我們的主角是,你一定猜到了,就是background-position。通過調整background-position的數值,背景圖片就能以不同的面貌出現在你眼前。其實圖片整體面貌沒有變,由于圖片位置的改變,你看到只該看到的而已。就好比手表上的日期,你今天看到是21,明天看到是22,是因為它的position往上跳了一格。所以你也大概了解到,CSS Sprites一般只能使用到固定大小的盒子(box)里,這樣才能夠遮擋住不應該看到的部分。
我們使用YUI的sprite.png舉個例子,假如我們有這么一段代碼,max代表最大化,min代表最小化,我們需要給它們配上相應的漂亮圖片(這樣我們的網站才能夠吸引人,才可以賣錢,才可以到佛羅里達曬太陽: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, 處于這個位置正是灰塊。好了,我們要找到代表最大化的加號和代表最小化的減號的位置找出來。經過測量,最大化按鈕位于Y軸的350px處,最小化按鈕位于Y軸400px處。想一想我們如何才能讓它們能夠顯示出來呢,明顯,要向上提升sprite.png,得到代碼如下:
.max {
background-position: 0 -350px;
}
.min {
background-position: 0 -400px;
}
耶,我們成功了:
(注意:為了舉例的方便,本例子直接在HTML內置樣式,切勿在實踐中的非特殊情況使用這種方式)。
優(yōu)點
我們從前面了解到,CSS Sprites為什么突然跑火,跟能夠提升網站性能有關。顯而易見,這是它的巨大優(yōu)點之一。普通制作方式下的大量圖片,現在合并成一個圖片,大大減少了HTTP的連接數。HTTP連接數對網站的加載性能有重要影響。
缺點
至于可維護性,這是一般雙刃劍??赡苡腥讼矚g,有人不喜歡,因為每次的圖片改動都得往這個圖片刪除或添加內容,顯得稍微繁瑣。而且算圖片的位置(尤其是這種上千px的圖)也是一件頗為不爽的事情。當然,在性能的口號下,這些都是可以克服的。
由于圖片的位置需要固定為某個絕對數值,這就失去了諸如center之類的靈活性。
前面我們也提到了,必須限制盒子的大小才能使用CSS Sprites,否則可能會出現出現干擾圖片的情況。這就是說,在一些需要非單向的平鋪背景和需要網頁縮放的情況下,CSS Sprites并不合適。YUI的解決方式是,加大圖片之間的距離,這樣可以保持有限度的縮放。
總結
性能壓倒一切。CSS Sprites是值得推廣的一種技術。尤其適宜用于FIR,比如固定大小的icon替換。為保持兼容性,圖片中的各個部分保持一定的距離是一種不錯的做法。
推薦閱讀:
- CSS Sprites: Image Slicing’s Kiss of Death
- 14 Rules for Faster-Loading Web Sites
- High Performance Web Sites
更新:有網友問到IE6不支持png的問題。其實是IE6不支持的是半透明(alpha transparency)的png,對于全透明的png, IE6并不存在問題。因此,在實踐中,不涉及到半透明而需要透明背景的圖片,其實都可以使用png, 這是很安全的。
相關文章
- 很高興為大家?guī)砹薈SS Sprites 樣式生成工具 3.0版本。 保存的設置文件也同時更新了,支持打開舊的文件,會以新的格式保存(舊版本打不開)。 操作界面做了小小的調整2009-06-23
- 阿里媽媽UED談CSS Sprites技術.2009-10-20
- 網頁制作Webjx文章簡介:在google中搜索一下css sprites這個名稱,會查出很多信息,并且隨著SEO越來越被人們重視,采用這種技術來進行圖片優(yōu)化的網站越來越多,國內幾家大2009-04-02
- 論壇上提到這樣的問題:“css中用一張背景圖做頁面的技術有什么優(yōu)勢?” 簡單介紹一下 CSS Sprites 的優(yōu)點: 當用戶往U盤中拷200張圖片,會等很久。但是2009-06-21
css sprites技術將多個背景集成到一個png圖片上css定位
美國YAHOO在頁面制作中所用到的圖片整合技術,首先將小圖片整合到一張大的圖片上,然后根據具體圖標在大圖上的位置,給背景定位,感興趣的朋友可以了解下具體的實現方法2013-04-02- CSS Sprites技術不新鮮,早在2005年 CSS Zengarden 的園主 Dave Shea 就在 ALA 發(fā)表對該技術的 詳細闡述 。原先只在CSS玩家之間作為一種制作方法流傳,后來出來個 14 Rules2011-08-02
- CSS sprites是指把網頁中很多小圖片(很多圖標文件)做成按規(guī)律排列的一張大圖上,在顯示的時候通過background-image、background-position顯示圖片特定部分達到和分散的一2013-10-10
CSS Sprites就是可以將許多圖片集成在一張大圖上,然后利用CSS的圖片定位技術將其分割開來。這款CSS3圖片效果就是可以將分割完的小圖片實現分組的動畫效果,我們只需要點擊2014-09-20- CSS Sprites其實就是把網頁中一些背景圖片整合到一張圖片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的組合進行背景定位2014-12-12


