上一節《css知多少(5)——選擇器》最後提到,選擇器類型過多將致使一些問題,是什麼問題呢?我們直接舉例子說明。css
上圖中,css中的兩個選擇器都是針對<span>的,並且兩個設置的顏色不同,這裏的<span>到底遵從誰的命令?html
上面仍是比較簡單的,下面在來一個複雜的:前端
上圖中的<li>該顯示成什麼顏色呢?git
要解決以上問題,咱們須要引入一個概念——特指度(specificity)。特指度表示一個css選擇器表達式的重要程度,能夠經過一個公式來計算出一個數值,數越大,越重要。github
這個計算叫作「I-C-E」計算公式,web
即,針對一個css選擇器表達式,遇到一個id就往特指度數值中加100,遇到一個class就往特指度數值中加10,遇到一個element就往特指度數值中加1。面試
下面舉幾個css表達式的特指度計算結果,你們也本身算一算,是否是對:json
CSS選擇器表達式瀏覽器 |
特指度計算結果app |
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優先級最高,高於上面一切。* 選擇器最低,低於一切。
好了,你如今能夠返回文章一開始提出的兩個問題,根據特指度計算公式計算,哪一個的計算結果大,瀏覽器就會以哪一個爲優先。
若是你嫌上面的計算過於複雜,有一個簡版規則。它只有三個規則,這三個規則能覆蓋大多數狀況,並且比較好記。
規則一,包含ID的選擇器賽過包含Class的選擇器,包含Class的選擇器賽過包含元素的選擇器;例以下圖,第一個特指度更高:
規則二,不一樣選擇器的特指度比較時,不區分加載的順序(相同選擇器在層疊時,後加載的覆蓋前加載的),例以下圖,雖而後加載,可是特指度低:
規則三,設置的樣式高於繼承的樣式,不用考慮特指度。例如:
其實,大部分狀況下,你經過這個簡版的規則,便可判斷選擇器的優先級。
wangEditor是我本身作的一個富文本編輯器,當我最開始在博客園上配置demo頁面的時候,就遇到了css選擇器優先級的問題,如今已經解決。Demo地址:http://www.cnblogs.com/wangfupeng1988/p/4198428.html
對於下來菜單,例如選擇字體、字號等,我當時在wangEditor的css中是用Class來設置的,誰知道博客園頁面中有一個既有的樣式,優先級高於個人:
致使了我配置的demo中,ul的margin-left仍是45px,而我寫的css明明已經設置成了0px。緣由就是博客園這個css選擇器優先級要高於我寫的優先級。
固然,後來我改爲了id選擇器,就改過了這個問題。
本節的內容是一個重點,我在許多的面試題中看到過考css優先級的問題。css優先級並不麻煩,只要你掌握了合適的方法來學習,一夜就入門個差很少,祝君好運。
---------------------------------------------------------------
本系列的目錄頁面:http://www.cnblogs.com/wangfupeng1988/p/4325007.html
-------------------------------------------------------------------------------------------------------------
學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀》
也歡迎關注個人開源項目——wangEditor,簡潔易用的web富文本編輯器
-------------------------------------------------------------------------------------------------------------