如何對選擇器進(jìn)行優(yōu)化并不是一個那么新鮮的話題,但是個人覺得,css作為前端開發(fā)人員一項(xiàng)必備的專業(yè)技能,有必要深入了解下css在頁面渲染的一些關(guān)鍵點(diǎn),并以此為css的優(yōu)化提供依據(jù)。我們這篇文章將討論選擇器優(yōu)化的一般性建議。
在給出css選擇器優(yōu)化建議之前,我們有必要弄清楚這樣一個問題,那就是瀏覽器如何識別選擇器并對相應(yīng)的html元素進(jìn)行樣式渲染?
瀏覽器對CSS的匹配原理是這樣的,瀏覽器讀取選擇器的順序是由右到左進(jìn)行。
比如,
div#divBox p span.red {
color:red;
}
瀏覽器的匹配查找順序如下,
class=red
的span
元素p
元素id=divBox
的div
元素如果以上3步都能找到相應(yīng)的結(jié)果,那么則會給匹配的最終結(jié)果應(yīng)用相關(guān)的css樣式。
從上面的結(jié)論和示例中,我們知道瀏覽器是從右到左逐個匹配css表達(dá)式的。那么為什么瀏覽器會采用這種從右至左的方法來匹配css表達(dá)式呢?其好處有兩個,第一是為了盡早的過濾掉無關(guān)的樣式規(guī)則第二是為了盡快的匹配到目標(biāo)元素。很顯然表達(dá)式最右的樣式規(guī)則以及整個css表達(dá)式的長度將決定整個匹配過程的復(fù)雜度。這個最右部分的css表達(dá)式,我們稱之為keyselector(關(guān)鍵選擇器),它將決定css選擇器的效率高低。
這篇文章中給出了常規(guī)的css選擇器的效率,
#header
.main
div
div + p
div > p
div span
div *
input[type="text"]
a:hover,ul:nth-child(2n)
可見id選擇器的效率最高,而偽類選擇器的效率最低。CSS3提供的各種偽類選擇器雖然用起來很方便,不過其效率反而是最低的。
根據(jù)上面的理論,我們會得出下面的結(jié)論,div #user
會比#user div
的效率要高。因?yàn)榍耙粋€選擇器表達(dá)式的關(guān)鍵選擇器#user
是一個id選擇器,后一個選擇器表達(dá)式的關(guān)鍵選擇器div
是一個類型選擇器,而id選擇器的效率要比類型選擇器的效率要高。換句話說,前者經(jīng)過關(guān)鍵選擇器的匹配之后得到的集合要比后者要小,在一個更小集合上再次做匹配篩選,明顯要更加快一點(diǎn)。
一般來說,我們書寫css時應(yīng)該遵循下面幾點(diǎn),
更多建議: