CSS 選擇器權重 Specificity

CSS 選擇器是如何判斷要套用哪個樣式?

常會遇到寫了樣式卻沒有被套用,而樣式沒被套用有兩個可能

  1. 沒有選對元素
  2. 選對了元素,但蓋不掉之前的樣式
    以下就來講 選對了元素,但蓋不掉之前的樣式

CSS 有一個規則叫做 Specificity

Specificity 有三種

  • id (1,0,0)
  • class (0,1,0)
  • tag (0,0,1)

規則:#id > .class > <tag>
簡單來說,如果要蓋樣式的話,用#id會蓋掉.class<tag>樣式,用.class會蓋掉<tag>樣式。
但如果你用.class要蓋.class的話,就是寫在後面的蓋前面的。

Specificity 組合

你可以在寫樣式的時候去組合Specificity,這樣更好做樣式覆蓋。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- CSS的部分 -->
<style>
<!-- h1=(0,0,1) -->
h1{
color:black;
}

<!-- .text=(0,1,0) -->
.text{
color:blue;
}

<!-- h1.red=(0,1,1) -->
h1.red{
color:red;
}
</style>

<!-- HTML的部分,H1的文字呈現為color:red; -->
<h1 class="text red">文字</h1>

但是,行內樣式 (inline-style)

遇到行內樣式,你就算用了#id一樣蓋不掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- CSS的部分 -->
<style>
<!-- h1=(0,0,1) -->
h1{
color:black;
}

<!-- .text=(0,1,0) -->
.text{
color:blue;
}

<!-- #title=(1,0,0) -->
#title{
color:yellow;
}

<!-- h1.red=(0,1,1) -->
h1.red{
color:red;
}
</style>

<!-- HTML的部分,H1的文字呈現為color:green; -->
<h1 id="title" class="text red" style="color:green;">文字</h1>

還有 !important

除非在你的樣式加上!important。另外,!important也可以在inline-style中使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!-- CSS的部分 -->
<style>
<!-- h1=(0,0,1) -->
h1{
color:black;
}

<!-- .text=(0,1,0) -->
.text{
color:blue;
}

<!-- #title=(1,0,0) -->
#title{
color:yellow !important;
}

<!-- h1.red=(0,1,1) -->
h1.red{
color:red;
}
</style>

<!-- HTML的部分,H1的文字呈現為color:yellow; -->
<h1 id="title" class="text red" style="color:green;">文字</h1>

<!-- HTML的部分,H1的文字呈現為color:green; -->
<h1 id="title" class="text red" style="color:green !important;">文字</h1>

總結

  • 基本規則是 #id > .class > <tag>
  • 把其他狀況都考慮進來的話 !important > inline-style > #id > .class > <tag>