CSS權(quán)重關(guān)系及問題剖析

id 的選擇器為什么要這么寫 li#first?
一. 一個疑問?
看到過一篇關(guān)于 CSS 的文章,其中說到:對于類似 li#first 這樣的選擇器,由于使用 id 就已經(jīng)可以確定元素了,沒有必要再寫上前面的 li, 直接寫上 #first 這樣的 id 選擇器就可以了。聽起來說得不錯,簡單測試一下也沒有問題。
可是,我們經(jīng)??吹綆в性孛Q的選擇器,例如,在微軟的項目模板中就有大量的帶有元素名稱的選擇器,如果沒有用的話,為什么要這樣寫呢?
ul#navlist
{
float: right;
}
ul#navlist li
{
display: inline;
}
二. 問題出現(xiàn)了!
寫一個簡單的菜單,使用 ul 和 li 實現(xiàn),菜單項之間使用邊框來實現(xiàn)間隔線。
html 代碼如下:
<ul id="navlist">
<li class="first"><a href="/" id="current">Home</a></li>
<li><a href="#">Store</a></li>
<li><a href="#">ShoppingCart</a></li>
<li><a href="#">Admin</a></li>
</ul>
使用下面的樣式表,首先通過為所有的超級鏈接增加一個左邊框來畫出間隔的虛線,然后將第一個菜單項的左邊框去掉,我的第一個樣式使用了 .first a。
ul#navlist li
{
display: inline;
}
ul#navlist li a
{
border-left: 1px dotted #8A8575;
padding: 10px;
margin-top: 10px;
color: #8A8575;
text-decoration: none;
float: left;
}
.first a
{
border: none;
}
看一下效果,完全沒有反應(yīng)。

還有的地方說 id 選擇器的級別比較高,那么將類改成 id 。
<li id="first"><a href="/" id="current">Home</a></li>
將樣式表也進(jìn)行相應(yīng)的修改。
#first a
{
border: none;
}
可是結(jié)果呢?巋然不動!

用火狐的 firebug 看一看,被忽略了。

為什么我的樣式被秒殺了?
網(wǎng)上有大量的文章,但是說法并不一致,有的說要考慮三個級別,可是也有的說需要考慮四個級別,但是總的方向大致是關(guān)于層疊的。
不如到 W3C 的網(wǎng)站上看一個究竟。相關(guān)的標(biāo)準(zhǔn)在 這個頁面 可以看到,目前為止的 CSS 標(biāo)準(zhǔn)有三個: CSS1, CSS2, 以及 CSS3。
CSS1 是最早的標(biāo)準(zhǔn),其中關(guān)于層疊順序的描述在 這里,還提供了一個簡單的示例進(jìn)行說明。
LI {...} /* a=0 b=0 c=1 -> specificity = 1 */
UL LI {...} /* a=0 b=0 c=2 -> specificity = 2 */
UL OL LI {...} /* a=0 b=0 c=3 -> specificity = 3 */
LI.red {...} /* a=0 b=1 c=1 -> specificity = 11 */
UL OL LI.red {...} /* a=0 b=1 c=3 -> specificity = 13 */
#x34y {...} /* a=1 b=0 c=0 -> specificity = 100 */
在 CSS1 中將優(yōu)先級分為三組,將 id 選擇器作為 a 組,類選擇器作為 b 組,元素名作為 c 組,每組中出現(xiàn)一次,計數(shù)一次,按照先 a 組進(jìn)行比較,相同的情況下,使用 b 組進(jìn)行比較,最后是 c 組。什么選擇器的優(yōu)先級別高,什么選擇器提供的樣式有效。比如在上面的例子中,第 5 組使用 id 的級別最高,所以,這組的樣式設(shè)置生效,而其他的設(shè)置將會被忽略掉。
在 CSS2 中,又增加了關(guān)于行內(nèi)說明 style 的組,所以參與比較的組成為了 4 組,其中 style 的優(yōu)先級別最高。同樣,在 CSS2 的標(biāo)準(zhǔn)說明中也提供了樣例。
* {} /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
ul li {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
ul ol+li {} /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */
h1 + *[rel=up]{} /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
#x34y {} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
<style type="text/css">
#x97z { color: red }
</style>
<p id="x97z" style="color: green">
</p>
在這個示例中,style 的優(yōu)先級別最高,所以將會覆蓋掉通過 id 進(jìn)行的設(shè)置,顏色為綠色。
四. 解決問題
通過上面的分析可以看到,僅僅提供選擇器并不足以能夠生效,還要看選擇器的優(yōu)先級別,在我們的問題中,即使使用 id 來選擇第一個菜單項:#first a ,包括了一個 id 和一個元素名,那么所得的優(yōu)先級別為:a=0, b=1, c=0, d=1
可是,通用的選擇器是這樣的:ul#navlist li a,優(yōu)先級中卻包括了一個 id, 還有 3 個元素名稱,所以優(yōu)先級別為:
a=0, b=1, c=0, d=3
所以我們的選擇器沒有比過通用的選擇器,悲劇發(fā)生了!
知道了原因,問題也就簡單了,提高我們選擇器的優(yōu)先級別,超過通用選擇器的優(yōu)先級就可以了,比如,我們可以寫成這樣:
ul#navlist li#first a
現(xiàn)在的優(yōu)先級是多少呢?
a=0, b=2, c=0, d=3
在 b 組比較的時候就已經(jīng)超過了,看看是否已經(jīng)成功了!

還可以加上重要性說明,也可以解決。!important 必須寫在樣式與分號之間,每個樣式必須單獨聲明。
#first a
{
border: none !important;
}
看來選擇器不是那么簡單呀!
相關(guān)文章

CSS3打造的現(xiàn)代交互式登錄界面詳細(xì)實現(xiàn)過程
本文介紹CSS3和jQuery在登錄界面設(shè)計中的應(yīng)用,涵蓋動畫、選擇器、自定義字體及盒模型技術(shù),提升界面美觀與交互性,同時優(yōu)化性能和可訪問性,感興趣的朋友跟隨小編一起看看吧2025-06-20CSS普通流、浮動與定位網(wǎng)頁布局三大機(jī)制及最佳實踐
本文給大家講解CSS 的三種核心布局機(jī)制——普通流(Normal Flow)、浮動(Float)和定位(Positioning)對于創(chuàng)建靈活、響應(yīng)式的網(wǎng)頁至關(guān)重要,本文將深入探討這三種機(jī)制的工作原2025-06-19
css實現(xiàn)角標(biāo)效果并帶有文章或圖標(biāo)效果(完整代碼)
文章介紹如何用CSS實現(xiàn)角標(biāo)效果,通過.active類結(jié)合::after和::before偽元素,利用定位、邊框和旋轉(zhuǎn)創(chuàng)建紅色邊框與白色三角形的提示標(biāo)志,適用于按鈕或卡片元素的視覺增強(qiáng)設(shè)計2025-06-19CSS Anchor Positioning重新定義錨點定位的時代來臨(最新推薦)
CSS Anchor Positioning是一項仍在草案中的新特性,由 Chrome 125 開始提供原生支持需啟用實驗 flag,它允許你在 CSS 中通過錨點(anchor)來相對于任意 DOM 元素定位,本文2025-06-17CSS中的Static、Relative、Absolute、Fixed、Sticky的應(yīng)用與詳細(xì)對比
CSS 中的 position 屬性用于控制元素的定位方式,不同的定位方式會影響元素在頁面中的布局和層疊關(guān)系,以下是 static、relative、absolute、fixed、sticky 的詳細(xì)對比和應(yīng)用2025-06-17CSS place-items: center解析與用法詳解
place-items: center; 是一個強(qiáng)大的 CSS 簡寫屬性,用于同時控制 網(wǎng)格(Grid) 和 彈性盒(Flexbox) 布局中的對齊方式,本文給大家介紹CSS place-items: center; 詳解與用法2025-06-17
在日常開發(fā)中,我們經(jīng)常需要讓某個元素占據(jù)容器的剩余空間,本文將介紹5種不同的方法來實現(xiàn)這個需求,并分析各種方法的優(yōu)缺點,感興趣的朋友一起看看吧2025-06-17CSS中前端單位 px、vw、vh 等的區(qū)別與使用建議
CSS單位區(qū)別與使用場景總結(jié):px絕對、vw/vh響應(yīng)式,%繼承父尺寸,em/rem文字縮放,vmin/vmax適應(yīng)寬高變化,固定布局用px或%,響應(yīng)式布局用vw/vh/rem,文字用em或rem,本文給大家2025-06-16CSS 樣式表的四種應(yīng)用方式及css注釋的應(yīng)用小結(jié)
這篇文章主要介紹了CSS 樣式表的四種應(yīng)用方式及css注釋的應(yīng)用小結(jié),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-05-21- 在CSS布局中,padding屬性是控制元素內(nèi)容與其邊框之間距離的關(guān)鍵工具,本文介紹CSS基礎(chǔ)中padding,通過本文的介紹,我們深入了解了padding的基本概念、簡寫方法以及它對元2025-05-16




