CSS選擇器的權重


## 5.3 CSS優先級(重點)

<img src="media/22%E4%BC%98%E5%85%88%E7%BA%A7.png">

- 概念:

定義CSS樣式時,經常出現兩個或更多規則應用在同一元素上,此時,

* 選擇器相同,則執行層疊性
* 選擇器不同,就會出現優先級的問題。


#### 1). 權重計算公式

關於CSS權重,我們需要一套計算公式來去計算,這個就是 CSS Specificity(特殊性)

| 標簽選擇器 | 計算權重公式 |
| ---------------------- | ------------ |
| 繼承或者 * | 0,0,0,0 |
| 每個元素(標簽選擇器) | 0,0,0,1 |
| 每個類,偽類 | 0,0,1,0 |
| 每個ID | 0,1,0,0 |
| 每個行內樣式 style="" | 1,0,0,0 |
| 每個!important 重要的 | ∞ 無窮大 |

- 值從左到右,左面的最大,一級大於一級,數位之間沒有進制,級別之間不可超越。
- 關於CSS權重,我們需要一套計算公式來去計算,這個就是 CSS Specificity(特殊性)
- div {
color: pink!important;
}


#### 2). 權重疊加

我們經常用交集選擇器,后代選擇器等,是有多個基礎選擇器組合而成,那么此時,就會出現權重疊加。

就是一個簡單的加法計算

- div ul li ------> 0,0,0,3
- .nav ul li ------> 0,0,1,2
- a:hover -----—> 0,0,1,1
- .nav a ------> 0,0,1,1

<img src="media/w.jpg" /> 注意:

1. 數位之間沒有進制 比如說: 0,0,0,5 + 0,0,0,5 =0,0,0,10 而不是 0,0, 1, 0, 所以不會存在10個div能趕上一個類選擇器的情況。

#### 3). 繼承的權重是0

這個不難,但是忽略很容易繞暈。其實,我們修改樣式,一定要看該標簽有沒有被選中。

1) 如果選中了,那么以上面的公式來計權重。誰大聽誰的。
2) 如果沒有選中,那么權重是0,因為繼承的權重為0.

選擇器的類型:

  1.  ID    #id
  2.  class  .class
  3.  標簽  p
  4.  通用  *
  5.  屬性  [type="text"]
  6.  偽類  :hover
  7.  偽元素  ::first-line
  8.  子選擇器、相鄰選擇器

權重計算規則

  1. 第一等:代表內聯樣式,如: style=””,權值為1000。
  2. 第二等:代表ID選擇器,如:#content,權值為0100。
  3. 第三等:代表類,偽類和屬性選擇器,如.content,權值為0010。
  4. 第四等:代表類型選擇器和偽元素選擇器,如div p,權值為0001。
  5. 通配符、子選擇器、相鄰選擇器等的。如*、>、+,權值為0000。
  6. 繼承的樣式沒有權值。

比較規則

  1. 1,0,0,0 > 0,99,99,99。也就是說從左往右逐個等級比較,前一等級相等才往后比。
  2. 無論是行間、內部和外部樣式,都是按照這個規則來進行比較。而不是直觀的行間>內部>外部樣式;ID>class>元素。之所以有這樣的錯覺,是因為確實行間為第一等的權重,所以它的權重是最高的。而內部樣式可能一般寫在了外部樣式引用了之后,所以覆蓋掉了之前的。
  3. 在權重相同的情況下,后面的樣式會覆蓋掉前面的樣式。
  4. 通配符、子選擇器、相鄰選擇器等的。雖然權值為0000,但是也比繼承的樣式優先。

!important

  1. !important 的作用是提升優先級,換句話說。加了這句的樣式的優先級是最高的(比內聯樣式的優先級還高)。
    <style>
        p{
            color:red !important;
        }
    </style>
    <p style="color:blue;">我顯示紅色</p>    
  2. ie7+和別的瀏覽器對important的這種作用的支持度都很好。只有ie6有些bug
    p{
      color:red !important;
      color:blue;    
    }//會顯示blue

    但是這並不說明ie6不支持important,只是支持上有些bug。看下面

    復制代碼
    p{
      color:red !important;  
    }
    p{
      color:blue;  
    }
    //這樣就會顯示的是red。說明ie6還是支持important的。
    復制代碼

六、實例

  1. 復制代碼
     a{color: yellow;} /*特殊性值:0,0,0,1*/
     div a{color: green;} /*特殊性值:0,0,0,2*/
    .demo a{color: black;} /*特殊性值:0,0,1,1*/
     .demo input[type="text"]{color: blue;} /*特殊性值:0,0,2,1*/
     .demo *[type="text"]{color: grey;} /*特殊性值:0,0,2,0*/
     #demo a{color: orange;} /*特殊性值:0,1,0,1*/
     div#demo a{color: red;} /*特殊性值:0,1,0,2*/
    
    <a href="">第一條應該是黃色</a> <!--適用第1行規則-->
    <div class="demo">
        <input type="text" value="第二條應該是藍色" /><!--適用第4、5行規則,第4行優先級高-->
        <a href="">第三條應該是黑色</a><!--適用第2、3行規則,第3行優先級高-->
    </div>
    <div id="demo">
        <a href="">第四條應該是紅色</a><!--適用第5、6行規則,第6行優先級高-->
    </div>
    復制代碼
     
     
     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM