詳解CSS中的選擇器優(yōu)先級(jí)順序

特殊性是什么
在對(duì)一個(gè)HTML元素應(yīng)用CSS樣式時(shí),常常有很多種方法可以找到元素,比如:
- <div id="container" class="wrap_sty">
- <p class="pra">這是一個(gè)段落</p>
- </div>
- <style>
- #container p { color:red }
- div p { color:green }
- p { color:yellow }
- </style>
可見(jiàn),如果要作用到一個(gè)HTML元素的方法有很多,遠(yuǎn)遠(yuǎn)不止這些。那么如果一個(gè)元素被應(yīng)用了很多同樣的樣式,最終會(huì)顯式到哪一個(gè)樣式呢?CSS對(duì)于多個(gè)選擇器的優(yōu)先性使用了一個(gè)叫做特殊性的方式。
CSS特殊性
選擇器的特殊性分為4個(gè)等級(jí),a b c d,從左到右,越左邊的越優(yōu)先, 如果一個(gè)選擇器規(guī)則有多個(gè)相同類(lèi)型選擇器,則+1。
如果是HTML內(nèi)樣式,那么特殊性最優(yōu)先,a=1
id選擇器的特殊性是b,
類(lèi)選擇器、偽類(lèi)選擇器、屬性選擇器為c
標(biāo)簽選擇器、偽元素選擇器為d
先來(lái)說(shuō)說(shuō)一些選擇器類(lèi)型:
1.id選擇器
- #myid { ... }
2.類(lèi)選擇器
- .myclass { ... }
3.標(biāo)簽選擇器
- p { ... }
4.屬性選擇器
- [title="mytitle"] { ... }
由于大多數(shù)文檔例如W3CSCHOOL可能并沒(méi)有詳細(xì)說(shuō)明,或許不少人認(rèn)為屬性選擇器是這樣的 div[title="mytitle"] 或#id[title="mytitle"]等等,這樣是屬性選擇器,嚴(yán)格來(lái)說(shuō),這樣的并非單純的屬性選擇器,而是由id選擇器、標(biāo)簽選擇器等等和屬性選擇共同組成的。
5.偽類(lèi)選擇器
- p:hover { ... }
常見(jiàn)的偽類(lèi)選擇器有:
鏈接偽類(lèi),:link, :visited,用于錨元素。
動(dòng)態(tài)偽類(lèi),:hover,:focus,:active,用于任何選擇。
6.偽元素選擇器
- p::after { ... }
- p::before { ... }
偽元素和偽類(lèi)是完全不同的概念,之所以稱(chēng)之為偽元素,因?yàn)槠浯_實(shí)可以生成一個(gè)虛擬的HTML元素,只不過(guò)偽元素?zé)o法被DOM獲取到。
偽元素的應(yīng)用有很多,最常見(jiàn)的比如::after清除浮動(dòng):
- <ul>
- <li>A</li>
- <li>B</li>
- </ul>
- <style>
- li { float:left }
- ul::after { content: ""; display: block; clear: both }
- </style>
CSS特殊性示例
下面是一些CSS選擇器的特殊性示例:
選擇器 | 特殊性 | 以10為基數(shù)的特殊性 |
---|---|---|
style="color: red" |
1, 0, 0, 0 | 1000 |
#id {} |
0, 1, 0, 0 | 100 |
#id #aid |
0, 2, 0, 0 | 200 |
.sty {} |
0, 0, 1, 0 | 10 |
.sty p[title=""] {} |
0, 0, 2, 0 | 20 |
p:hover {} |
0, 0, 1, 0 | 10 |
p {} |
0, 0, 0, 1 | 1 |
ul::after {} |
0, 0, 0, 1 | 1 |
div p {} |
0, 0, 0, 2 | 2 |
如果兩個(gè)規(guī)則的特殊性相同,那么后定義的會(huì)覆蓋先定義的。
CSS重要性
CSS中還有一種東西可以無(wú)視特殊性,那就是!important,使用此標(biāo)記的CSS屬性總是最優(yōu)先的。
- #id { color: red }
- .class { color: yellow !important }
第二個(gè)樣式會(huì)優(yōu)先于第一個(gè)樣式,即使id選擇器的特殊性高于類(lèi)選擇器。
如果兩個(gè)屬性都有 !important 那么由特殊性來(lái)決定優(yōu)先級(jí)。
- #id { color: red !important }
- .class { color: yellow !important }
結(jié)果是第一個(gè)樣式優(yōu)先于第二個(gè)樣式。
IE6對(duì) !important 的支持并不完全,在IE6中,如果一個(gè)選擇器中先定義了 !important 屬性,后面又定義了一個(gè)同樣的不帶 !important 的屬性,那么!important 會(huì)失效。
- div {
- color: yellow !important;
- color: red;
- }
在IE6中,可就沒(méi)辦法黃了,還是見(jiàn)點(diǎn)血吧!
IE6/7還可以在 !important 后面加點(diǎn)料,也不會(huì)失去味道,但是建議別這么無(wú)聊!
- div {
- color: yellow !important you are dead; /* IE6/7依然有效 */
- }
相關(guān)文章
- 這篇文章主要介紹了CSS優(yōu)先級(jí)計(jì)算的規(guī)則,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-17
- 下面小編就為大家?guī)?lái)一篇css優(yōu)先級(jí)計(jì)算方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-19
詳解CSS中的選擇器優(yōu)先級(jí)及樣式層疊問(wèn)題解決
CSS中的選擇器是分權(quán)重的,如果不加注意則很有可能會(huì)遇到樣式層疊的問(wèn)題,下面我們就來(lái)詳解CSS中的選擇器優(yōu)先級(jí)及樣式層疊問(wèn)題解決,需要的朋友可以參考下2016-06-14CSS z-index 層級(jí)關(guān)系優(yōu)先級(jí)的概念
這篇文章主要介紹CSS z-index 層級(jí)關(guān)系優(yōu)先級(jí)的概念,講解的比較詳細(xì),需要的朋友可以參考下。2016-06-06- 本文給大家分享css 優(yōu)先級(jí)的兩種理解方式,每種方式給大家介紹的非常詳細(xì),需要的朋友參考下吧2020-02-06