1. 程式人生 > 實用技巧 >css的優先順序和權重問題 以及!important優先順序

css的優先順序和權重問題 以及!important優先順序

一,前言:

  剛加的css怎麼沒有渲染出來?瀏覽器中檢視,發現是被其他的css給覆蓋了,相信我們都曾遇到過這樣的問題。那麼瀏覽器是如何選擇css標籤的渲染順序的呢?換句話說,css選擇器的優先順序是怎麼規定的?

二、正文:

  先上一個例子

<div id = "outerId" class = "outerClass">
    <div id = "innererId" class = "innerClass">
          <p id = "thisId" class = "thisClass" style = "">這是一個CSS選擇器的測試</p>

      <button type = "button" class = "buttonClass">按鈕</button> </div> </div>

問:有多少種css選擇器可以對<p>標籤樣式產生影響呢?

如果詳細的進行分析,排列組合有太多種了,太過麻煩。我們就說說有哪幾個類別:

  • 行內樣式: 即 style = "font-size: 12px";
  • id選擇器:   即 #thisId {font-size: 12px;}
  • class選擇器: 即 .thisClass{font-size: 12px;}
  • 元素選擇器: 即 p {font-size: 12px;}

如上四種類別都可以對<p>標籤的樣式產生影響,那麼誰先誰後,誰打誰小呢?

有如下兩種解釋:

  1. 一個selector的權重表示方式:0.0.0.0,按照計算規則給每位填充數字,對應位置相等,則比較下一位;
  2. 也有分別以1000、100、10、1四個權值係數對CSS選擇器進行權重計算。
選擇器類別 說明 權重表示 權值表示
行內樣式 行內只有一個 style = "" (1.0.0.0) 1000
id選擇器 selector中使用了幾個id,即#的個數 (0.1.0.0) 100
類選擇器

類,偽類,以及屬性的個數

如: .outerClass .buttonClass[type="button"]:hover{}

選擇器中有2個類,1個屬性,1個偽類

(0.0.1.0) 10
元素選擇器

偽元素和標籤元素的個數,如:p:first-child

選擇器中有一個標籤元素p和一個偽元素first-child

(0.0.0.1) 1

張鑫旭大神的256個class類名選擇器幹掉一個id選擇器例項頁面,我試了下256個好像也不行。。。

最後的幾點說明:
  • !important 表示強制應用該樣式,例如:button{width:150px!important;},與以上的選擇器相遇時,強制使用此樣式;
  • 如果比較後權重相同,那麼後者覆蓋前者,後渲染的勝出;
  • 內聯樣式 > id選擇器樣式 > 類選擇器樣式 > 元素選擇器樣式;
  • CSS選擇器的使用,應該儘量避免使用 !important 和 內聯樣式;id通常也是與class區分開使用,前者多用於JS中的結點定位,後者多用於CSS選擇器。
  • 重中之重,1000/100/10/1這種權值係數的比較方式只是便於理解,真實情況下10個class並不能逆轉1個id。