天天看點

CSS樣式優先級

CSS優先級

當樣式表比較複雜時,很容易出現多個樣式對作用于一個标簽的情況,這時就需要注意

CSS

優先級來決定哪些樣式會被作用于該标簽,哪些會被覆寫。

選擇器的優先級

對于标簽自有的屬性,選擇器的優先級規則為:

内聯樣式 > ID 選擇器 > 類選擇器 = 屬性選擇器 = 僞類選擇器 > 标簽選擇器 = 僞元素選擇器
           

當如下幾個選擇器作用于同一個标簽時本例顯示的顔色為

red

,可以在浏覽器的

Elements

選中相應元素,在

Styles

檢視樣式的覆寫情況并調試。

<div id="i1" class="c1">T1</div>

<style type="text/css">
    #i1 {
        color: red;
    }
    .c1 {
        color: blue;
    }
    :nth-child(1){
        color: green;
    }
    div {
        color: grey;
    }
</style>
           

選擇符的優先級

選擇符是由基本選擇器組成,基本分為:

後代選擇符: #i1 .c1 .c2
子選擇符:#i1 > .c1 > .c2
相鄰選擇符:.c1 + .c2
           

計算選擇符中

ID

選擇器的個數

a

,計算選擇符中類選擇器、屬性選擇器以及僞類選擇器的個數之和

b

,計算選擇符中标簽選擇器和僞元素選擇器的個數之和

c

。按

a

b

c

的順序依次比較大小,大的則優先級高,相等則比較下一個。若最後兩個的選擇符中

a

b

c

都相等,則按照"就近原則"來判斷,此外,擁有

!important

的屬性具有最高的優先級。

<div id="i2" class="c2">
    <div>T2</div>
</div>
<style type="text/css">
    #i2 div {
        color: red;
    }
    .c2 > div {
        color: green;
    }
    div > div {
        color: blue;
    }
    :nth-child(1){
        color: black;
    }
    div {
        color: grey;
    }
</style>

第一個選擇符 a:1 b:0 c:1
第二個選擇符 a:0 b:1 c:1
第三個選擇符 a:0 b:0 c:2
第四個選擇符 a:0 b:1 c:0
第五個選擇符 a:0 b:0 c:1
優先級順序依次為: 1 2 4 3 5
           

引自 https://www.runoob.com/w3cnote/css-style-priority.html

在學習過程中,你可能發現給選擇器權重值的說法,即 ID 選擇器權值為 100,類選擇器權值為 10,标簽選擇器權值為 1,當一個選擇器由多個 ID 選擇器、類選擇器或标簽選擇器組成時,則将所有權值相加,然後再比較權值。這種說法其實是有問題的。比如一個由 11 個類選擇器組成的選擇器和一個由 1 個 ID 選擇器組成的選擇器指向同一個标簽,按理說 110 > 100,應該應用前者的樣式,然而事實是應用後者的樣式。錯誤的原因是:權重的進制是并不是十進制,CSS 權重進制在 IE6 為 256,後來擴大到了 65536,現代浏覽器則采用更大的數量。還是拿剛剛的例子說明。11 個類選擇器組成的選擇器的總權值為 110,但因為 11 個均為類選擇器,是以其實總權值最多不能超過 100, 你可以了解為 99.99,是以最終應用後者樣式。

多重樣式優先級

外部樣式表和内部樣式表的優先級由其引入順序有關,一般認為内部樣式優先級大于外部樣式,也可以認為其相等,因為如果外部樣式放在内部樣式的後面引入,則外部樣式将覆寫内部樣式。

内聯樣式 > 内部樣式 > 外部樣式 > 浏覽器預設樣式
           

繼承樣式

一般來說對于文字樣式的設定都會具有繼承性,例如

font-family

font-size

font-weight

color

等等,當需要繼承樣式時,最近的祖先樣式比其他祖先樣式優先級高。

<div style="color: red;">
        <div style="color: blue;">
            <div >T3</div> <!-- 顯示藍色 -->
        </div>
    </div>
           

代碼

<!DOCTYPE html>
<html>

<head>
    <title>CSS樣式優先級</title>
</head>
<style type="text/css">
    #i1 {
        color: red;
    }
    .c1 {
        color: blue;
    }
    :nth-child(1){
        color: green;
    }
    div {
        color: grey;
    }

    #i2 div {
        color: red;
    }
    .c2 > div {
        color: green;
    }
    div > div {
        color: blue;
    }
</style>

<body>
    <div id="i1" class="c1">T1</div>
    <br>
    <div id="i2" class="c2">
        <div>T2</div>
    </div>
    <br>
    <div style="color: red;">
        <div style="color: blue;">
            <div style="color: inherit;">T3</div> <!-- 顯示藍色 -->
        </div>
    </div>
</body>

</html>
           

每日一題

https://github.com/WindrunnerMax/EveryDay
           
下一篇: ES6新特性