css選擇器的優先級算法

1. 引言

瀏覽器CSS匹配順序:css

瀏覽器CSS匹配不是從左到右進行查找,而是從右到左進行查找。html

好比#divBox p span.red{color:red;}瀏覽器

瀏覽器的查找順序以下:spa

先查找html中全部class='red'的span元素,找到後,再查找其父輩元素中是否有p元素,再判斷p的父元素中是否有id爲divBox的div元素,若是都存在則匹配上。3d

瀏覽器從右到左進行查找的好處是爲了儘早過濾掉一些無關的樣式規則和元素。code

  

  上圖中,css中的兩個選擇器都是針對<span>的,並且兩個設置的顏色不同,這裏的<span>到底遵從誰的命令?htm

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

  

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

2. 特指度

  要解決以上問題,咱們須要引入一個概念——特指度(specificity)。特指度表示一個css選擇器表達式的重要程度,能夠經過一個公式來計算出一個數值,數越大,越重要。ci

  這個計算叫作「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的選擇器賽過包含元素的選擇器;例以下圖,第一個特指度更高:

  

  規則二,不一樣選擇器的特指度比較時,不區分加載的順序(相同選擇器在層疊時,後加載的覆蓋前加載的),例以下圖,雖而後加載,可是特指度低:

  

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

      

上圖中,有兩個css樣式,若是按照優先級來看,應該是第一個優先級大,可是頁面確實按照第二個樣式顯示的。
這是由於,第一個樣式雖然優先級大,但它倒是經過繼承的方式來影響span樣式的,而第二個樣式是直接設置在span樣式上的。
所以,直接設置的樣式要高於繼承的樣式,無論優先級多大

  其實,大部分狀況下,你經過這個簡版的規則,便可判斷選擇器的優先級。

相關文章
相關標籤/搜索