使用CSS sprites減少HTTP請求

2021-09-22 09:50:52 字數 2435 閱讀 5455

sprites是鬼怪,小妖精,調皮鬼的意思,初聽這個高階洋氣的名字我被震懾住了,一步步掀開其面紗後發覺很簡單的東西,作用卻很大

css sprites是指把網頁中很多小(很多圖示檔案)做成按規律排列的一張大圖上,在顯示的時候通過background-image、background-position顯示特定部分達到和分散的一張張小一樣的效果。

使用過jquery ui 的同學可定見過這種

很多頁面常用的小圖示,但是我們看看每個小圖示的原始碼的時候會發現,這些小圖示的src是同乙個檔案,都是這張大圖

姑且先不管這是怎麼實現的,我們先來了解一下又好好的方法它不用為什麼要用這種怪異的方式,在**書寫和可讀性上都有了一定程度的開銷,這麼乾有什麼好處能讓人們放棄安逸的做法來用css sprites呢?

所以使用css sprites最大的好處就是減少http請求,加快**響應速度,提高**效能。有同學可能會問了,多幾個http請求真的會那麼嚴重嗎?如果使用一張大圖,那麼很可能大圖中有幾個用不到,這不是多載入內容了嗎,和多幾次http請求開銷差距有那麼大嗎?

公司小夥伴兒問過我類似問題,我舉了個例子,我在北京,你是我的馬仔,有天我讀了蘇東坡文集,興致來了想吃廣東的荔枝,自然是馬仔去買,然後你去銀行取錢,坐地鐵、搭火車、開飛機跑到廣東買了串荔枝回北京,拎一串荔枝回來不太累,主要是北京到廣州太折騰,明天我又來興致了,再給我買一串差不多的來,你又去銀行取錢、跑一趟廣州,不料我讀了乙個月的蘇東坡文集,你要是天天這麼跑不得發瘋,大家都會想到,看你這麼愛吃荔枝,一次買一箱回來,拎著是有些累,但好過一次次的折騰。

在這個例子中去銀行取錢就是瀏覽器準備http報文,跑廣州再回來就是乙個http請求-響應過程,荔枝自然就是response了,雖然http請求-響應過程沒有跑廣州那麼累,但因為http協議是無連線的,一次請求結束後就斷開,每次都這樣也挺累的,就跑一次拿回一張大圖來還是比較輕鬆的,當然你大圖內不能就三四張小圖。。。

更別說對廣大手機黨來說,流量也是要看的,如果乙個**訪問要花很多流量,我是不會用手機看來看去的

明白了為什麼要這麼做,我們就可以看看該怎麼來做了,先有世界觀再有方**,首先了解一下css的background-position

background-position 設定或檢索物件的背景影象位置。必須先指定 background-image 屬性。

語法:

background-position : length || length 

background-position : position || position 

取值:

length  : 百分數 | 由浮點數字和單位識別符號組成的長度值。請參閱 長度單位  

position  : top | center | bottom | left | center | right

這是jquery ui上取下來的兩張,分別是icon普通和hover是的樣子,每個小圖是16px * 16px,每張有15行16列,當然有的部分沒有,下面的demo會有很多部分有空白。

});最終效果如下圖

這樣就實現了使用一張大圖來代替很多小的icon圖示,來減少http請求,提高**效能。

使用css splites還有乙個額外的好處,如果我們使用的圖示內容是透明的,而邊框是白色(和**背景顏色相同),我們可以通過簡單的css來使整個**的icon改變,這個在換theme的時候很貼心,關於這個的圖提介紹可以看看css背景色鏤空技術實際應用及高階

使用減少ifelse使用

僅當做學習記錄 遇到如下需求 if condition else 可以這麼做 if condition do something 遇到如下需求 if user null else 可以這麼做 public class maintest public static user createuser 遇到...

使用委託來減少if else判斷

上述 根據傳進來的語言列舉值和名字串來輸出相應語言的問候語,不過,這個方法的可擴充套件性太差了,如果以後我們需要再新增韓文版,日文版,就不得不反覆修改列舉和dowork 方法,以適應新的需求。使用委託可以解決優化此類問題。using system using system.collections.g...

使用委託來減少if else判斷

using system using system.collections.generic using system.linq using system.text namespace 13 public void sayenglish string name public enum language...