1. 程式人生 > 實用技巧 >CSS---權重,選擇器優先順序問題

CSS---權重,選擇器優先順序問題

在寫CSS的時候我們經常會遇到選擇器優先順序的問題,比如說同一個元素不同選擇器可能會讓元素呈現不同的效果,並且相同選擇器的樣式順序也會影響效果.為了搞清楚選擇器優先順序的問題,我們不妨動手來聯絡一下,加深印象.

Round 1

首先準備好我們的html

  <div class="d1" id="d1">
  </div>

這是它的樣式

<style>
  div {
    width: 50px;
    height: 50px;
    background-color: blue;
  }

  .d1 {
    background-color: red;
  }


</style>

結果圖:

可以看到 ---> 類選擇器的優先順序是高於標籤的優先順序的

Round 2

接下來改動下樣式,給id選擇器新增樣式
<style>
   div {
    width: 50px;
    height: 50px;
    background-color: blue;
  }

  .d1 {
    background-color: red;
  }

  #d1 {
    background-color: yellow;
  }
</style>

結果圖:

可以看到 ---> id選擇器的優先順序是高於標籤和class選擇器的優先順序的

Round 3

在加入一個id選擇器,看看會有什麼不同

<style>

  .d1 {
    background-color: red;
  }

  #d1 {
    background-color: yellow;
  }

  #d1 {
    background-color: green;
  }

</style>

結果圖:

可以看到 ---> 相同選擇器的樣式和他的順序有關,一般呈現最後一個選擇器裡的樣式

Round 4

在HTML裡寫了內聯樣式後

<div class="d1" id="d1" style="background-color: hotpink;">
  </div>

效果如下:

因此,內聯樣式的優先順序比id更高

Round 5

假如我們在div標籤的css里加 !important 呢?
<style>
  div {
    width: 50px;
    height: 50px;
    background-color: blue !important;
  }

  .d1 {
    background-color: red;
  }

  #d1 {
    background-color: yellow;
  }

  #d1 {
    background-color: green;
  }
</style>

結果是這樣子的:

你看,由於這個!important的頂級優先順序,方塊變成了藍色

Round 6

再來一個情況,比如說有這樣的html
<div class="d1" id="d1">
  div1
  <div class="d2">
    div2
  </div>
</div>

樣式如下

<style>
  /* div {
    width: 50px;
    height: 50px;
    background-color: blue !important;
  } */

  .d1 {
    font-size: 20px;
    width: 150px;
    height: 150px;
    color: red;
  }

  #d1 {
    background-color: yellow;
  }

  #d1 {
    /* background-color: green; */
  }

  .d2 {
    font-size: 10px;
    width: 50px;
    height: 50px;
  }ground-color: red;
  }

  #d1 {
    background-color: yellow;
  }

  #d1 {
    background-color: green;
  }
</style>

結果是這樣子的:

假如說,你給 div1 設定了 font-size,那麼 div2 也會繼承到相應的屬性,但是,它的優先順序比標籤還要低,自然也小於類選擇器和 id 選擇器。

Round 7

用萬用字元的優先順序情況呢? 樣式如下
<style>
 * {
        font-size: 30px;
    }
    div {
        /* background-color: blue !important; */
    }
    .d1{
        font-size: 20px;
        width: 100px;
        height: 100px;
        background-color: green;
    }
    #d1{
        background-color: red;
    }
    #d1{
        background-color: orange;
    }
    .d2{
        /* background-color: aqua; */
        width: 80px;
        height: 80px;
        /* font-size: 10px; */
    }
</style>

結果是這樣子的:

可以看到, d2的字型大小是 30px, 因此萬用字元的優先順序大於繼承

###################################################

到此為止,我們有 !important > 內聯 > id > class > 標籤 > 萬用字元 > 繼承

對於多個選擇器組合,我們要根據以下的優先順序演算法:

  四個級別分別為:行內選擇符、ID選擇符、類別選擇符、元素選擇符。

  優先順序的演算法:

  每個規則對應一個初始"四位數":0、0、0、0
  若是 行內選擇符,則加1、0、0、0
  若是 ID選擇符,則加0、1、0、0
  若是 類選擇符/屬性選擇符/偽類選擇符,則分別加0、0、1、0
  若是 元素選擇符/偽元素選擇符,則分別加0、0、0、1
  演算法:將每條規則中,選擇符對應的數相加後得到的”四位數“,從左到右進行比較,大的優先順序越高。注意,同一級別無論累加多少都不會進位。


舉個例子:
html

  <div class="div1 div0" id="div1">
        div1
        <div class = "div2">
            div2
        </div>
    </div>

css

div.div1{
        font-size: 20px;
        width: 100px;
        height: 100px;
        background-color: green;
    }
    .div1.div0{
        background-color: red;
    }

那麼,div.div1 的優先順序序列為 0,0,1,1 而 div1.div0 的優先順序序列為 0,0,2,0 因此,後者更加優先,故顯示紅色。