css知多少(6)——選擇器的優先順序

王福朋發表於2015-02-11

1. 引言

  上一節《css知多少(5)——選擇器》最後提到,選擇器型別過多將導致一些問題,是什麼問題呢?我們們直接舉例子說明。

  

  上圖中,css中的兩個選擇器都是針對<span>的,而且兩個設定的顏色不一樣,這裡的<span>到底聽從誰的命令?

  上面還是比較簡單的,下面在來一個複雜的:

  

  上圖中的<li>該顯示成什麼顏色呢?

2. 特指度

  要解決以上問題,我們需要引入一個概念——特指度(specificity)。特指度表示一個css選擇器表示式的重要程度,可以通過一個公式來計算出一個數值,數越大,越重要。

  這個計算叫做“I-C-E”計算公式,

  1. I——Id;
  2. C——Class;
  3. E——Element;

  即,針對一個css選擇器表示式,遇到一個id就往特指度數值中加100,遇到一個class就往特指度數值中加10,遇到一個element就往特指度數值中加1

  下面舉幾個css表示式的特指度計算結果,大家也自己算一算,是不是對:

CSS選擇器表示式

特指度計算結果

p

1

p.large

11

P#large

101

div p#large

102

div p#large ul.list

113

div p#large ul.list li

114

  還有一個重點要注意:!important優先順序最高,高於上面一切。* 選擇器最低,低於一切。

  好了,你現在可以返回文章一開始提出的兩個問題,根據特指度計算公式計算,哪個的計算結果大,瀏覽器就會以哪個為優先。

3. 簡版規則

  如果你嫌上面的計算過於複雜,有一個簡版規則。它只有三個規則,這三個規則能覆蓋大多數情況,而且比較好記。

  規則一,包含ID的選擇器勝過包含Class的選擇器,包含Class的選擇器勝過包含元素的選擇器;例如下圖,第一個特指度更高:

  

  規則二,不同選擇器的特指度比較時,不區分載入的順序(相同選擇器在層疊時,後載入的覆蓋前載入的),例如下圖,雖然後載入,但是特指度低:

  

  規則三,設定的樣式高於繼承的樣式,不用考慮特指度。例如:

      

      

  其實,大部分情況下,你通過這個簡版的規則,即可判斷選擇器的優先順序。

4. 親身經歷

  wangEditor是我自己做的一個富文字編輯器,當我最開始在部落格園上配置demo頁面的時候,就遇到了css選擇器優先順序的問題,現在已經解決。Demo地址:http://www.cnblogs.com/wangfupeng1988/p/4198428.html

  對於下來選單,例如選擇字型、字號等,我當時在wangEditor的css中是用Class來設定的,誰知道部落格園頁面中有一個既有的樣式,優先順序高於我的:

  

  導致了我配置的demo中,ul的margin-left還是45px,而我寫的css明明已經設定成了0px。原因就是部落格園這個css選擇器優先順序要高於我寫的優先順序。

  當然,後來我改成了id選擇器,就改過了這個問題。

5. 總結

  本節的內容是一個重點,我在許多的面試題中看到過考css優先順序的問題。css優先順序並不麻煩,只要你掌握了合適的方法來學習,一晚上就入門個差不多,祝君好運。

---------------------------------------------------------------

本系列的目錄頁面:http://www.cnblogs.com/wangfupeng1988/p/4325007.html

-------------------------------------------------------------------------------------------------------------

學習作者教程:《前端JS高階面試》《前端JS基礎面試題》《React.js模擬大眾點評webapp》《zepto設計與原始碼分析》《json2.js原始碼解讀

也歡迎關注我的開源專案——wangEditor,簡潔易用的web富文字編輯器

-------------------------------------------------------------------------------------------------------------

相關文章