CSS选择器特殊性与重要性
特殊性
在編寫CSS代碼的時候,我們會出現(xiàn)多個樣式規(guī)則作用于同一個元素的情況,例如
<!-- HTML -->
<header>
<nav class="nav-main" id="navigation">Here background</nav>
</header>
/* CSS */
header nav {
background-color: red;
}
#navigation {
background-color: green;
}
.nav-main {
background-color: blue;
}
以上三個樣式規(guī)則都會作用于 ID 值為 "navigation" 的 nav 標簽,最終哪個樣式規(guī)則會生效呢,這取決于選擇器的特殊性(或優(yōu)先級)高低,選擇器特殊性高的樣式會覆蓋特殊性低的樣式,經(jīng)過測試 nav 標簽的背景會顯示為 green 綠色。
那么選擇器特殊性是如何計算的呢?
通常,我們使用四個以逗號分隔的數(shù)字來表示特殊性,比如:
每個元素或偽元素選擇器貢獻特殊性為 0,0,0,1
每個類、偽類或者屬性選擇器的特殊性為 0,0,1,0
每個ID選擇器的特殊性為 0,1,0,0
結(jié)合符和通配符的對特殊性沒有貢獻
計算一個組合選擇器的特殊性的時候就先計算各種選擇器的數(shù)量以及對應(yīng)的特殊性再相加,比如
div ul li /* 0,0,0,3 3個元素選擇器 */ div.aside ol li /* 0,0,1,3 1個類選擇器,3個元素選擇器 */ a:hover /* 0,0,1,1 1個偽類選擇器,1個元素選擇器 */ div.navlinks a:hover /* 0,0,2,2 1個類選擇器,1個偽類選擇器,2個元素選擇器 */ .affix.top /* 0,0,2,0 多類選擇器 注 */ input[type="text"] /* 0,0,1,1 1個屬性選擇器,1個元素選擇器 */ input[name="sex"][type="radio"]
/* 0,0,2,1 2個屬性選擇器,1個元素選擇器 */ #title em /* 0,1,0,1 1個 ID 選擇器,1個元素選擇器 */ h1#title em /* 0,1,0,2 1個 ID 選擇器,2個元素選擇器 */ * /* 0,0,0,0 1個通用選擇器 */
注:多類選擇器有多少個類就計算多少個類,不支持多類選擇器的 IE6 會理解為一個類
比較選擇器特殊性高低直接從左向右依次比較,數(shù)字大的則優(yōu)先級更高,如果相同就比較下一位,所有位都相同則優(yōu)先級是一樣高,當選擇器優(yōu)先級一樣高的時候后申明的樣式會覆蓋前面申明的樣式
每個級別的優(yōu)先級值是相互獨立的,13個元素選擇器寫在一堆也不會比1個類選擇器的特殊性高
第一個0是用于行內(nèi)樣式的,且僅用于行內(nèi)樣式
<nav></nav> <!-- 1,0,0,0 -->
重要性
有一樣東西可以無視特殊性,那就是 !important。使用 !important可以把任何樣式規(guī)則標記為重要
.nav-main {
background-color: blue !important;
color: #666;
}
基本上,任何重要的樣式規(guī)則都可以覆蓋沒有標記為重要的樣式規(guī)則,
<div id="gohome"><a href="/" id="home">Home</a></div>
div#gohome a#home {
color: red;
}
div a {
color: green !important;
}
上面的代碼會得到一個綠色 green 的鏈接,第一個規(guī)則有非常高的特殊性(0,2,0,2),
但是在 !important面前一樣沒用,除非我們給第一個規(guī)則也標記為重要
div#gohome a#home {
color: red !important;
}
div a {
color: green !important;
}
這時候鏈接就變?yōu)榧t色 red 了,都標記為重要的情況下,則會使用前面提到的特殊性規(guī)則來解決,
所以使用 !important的時候應(yīng)當權(quán)衡,盡量不要用
另外,IE6是支持 !important的,只是不完全支持而已,當在同一個選擇器中,在標記為重要的樣式規(guī)則之后又重新定義了此樣式則 !important將失效
.header {
color: red !important; /* 標準瀏覽器 red */
color: green; /* IE6 green !important 失效 */
}
再有就是 IE6/7 可以允許在 !important 后面添加一些文字,依然能識別
.header {
color: red !important ie; /* ie6/7 red */
}
總結(jié)
以上是生活随笔為你收集整理的CSS选择器特殊性与重要性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse 不能切换输入法
- 下一篇: 基于sinc的音频重采样(一):原理