當建立的樣式表愈來愈複雜時,一個標籤的樣式將會受到愈來愈多的影響,這種影響可能來自周圍的標籤,也可能來自其自身。下面咱們從這兩方面去看看 CSS 樣式的優先級。css
CSS 的繼承特性指的是應用在一個標籤上的那些 CSS 屬性被傳到其子標籤上。看下面的 HTML 結構:segmentfault
<div> <p></p> </div>
若是 <div>
有個屬性 color: red
,則這個屬性將被 <p>
繼承,即 <p>
也擁有屬性 color: red
。學習
由上可見,當網頁比較複雜, HTML 結構嵌套較深時,一個標籤的樣式將深受其祖先標籤樣式的影響。影響的規則是:url
CSS 優先規則1: 最近的祖先樣式比其餘祖先樣式優先級高。spa
例1:code
<!-- 類名爲 son 的 div 的 color 爲 blue --> <div style="color: red"> <div style="color: blue"> <div class="son"></div> </div> </div>
若是咱們把一個標籤從祖先那裏繼承來的而自身沒有的屬性叫作「祖先樣式」,那麼「直接樣式」就是一個標籤直接擁有的屬性。又有以下規則:繼承
CSS 優先規則2:「直接樣式」比「祖先樣式」優先級高。get
例2:博客
<!-- 類名爲 son 的 div 的 color 爲 blue --> <div style="color: red"> <div class="son" style="color: blue"></div> </div>
上面討論了一個標籤從祖先繼承來的屬性,如今討論標籤自有的屬性。在討論 CSS 優先級以前,先說說 CSS 7 種基礎的選擇器:class
ID 選擇器, 如 #id{}
類選擇器, 如 .class{}
屬性選擇器, 如 a[href="segmentfault.com"]{}
僞類選擇器, 如 :hover{}
僞元素選擇器, 如 ::before{}
標籤選擇器, 如 span{}
通配選擇器, 如 *{}
CSS 優先規則3:優先級關係:內聯樣式 > ID 選擇器 > 類選擇器 = 屬性選擇器 = 僞類選擇器 > 標籤選擇器 = 僞元素選擇器
例3:
// HTML <div class="content-class" id="content-id" style="color: black"></div> // CSS #content-id { color: red; } .content-class { color: blue; } div { color: grey; } <div> 最終的 color 爲 black,由於內聯樣式比其餘選擇器的優先級高。
全部 CSS 的選擇符由上述 7 種基礎的選擇器或者組合而成,組合的方式有 3 種:
後代選擇符: .father .child{}
子選擇符: .father > .child{}
相鄰選擇符: .bro1 + .bro2{}
當一個標籤同時被多個選擇符選中,咱們便須要肯定這些選擇符的優先級。咱們有以下規則:
CSS 優先規則4:計算選擇符中 ID 選擇器的個數(a),計算選擇符中類選擇器、屬性選擇器以及僞類選擇器的個數之和(b),計算選擇符中標籤選擇器和僞元素選擇器的個數之和(c)。按 a、b、c 的順序依次比較大小,大的則優先級高,相等則比較下一個。若最後兩個的選擇符中 a、b、c 都相等,則按照「就近原則」來判斷。
例4:
// HTML <div id="con-id"> <span class="con-span"></span> </div> // CSS #con-id span { color: red; } div .con-span { color: blue; } 由規則 4 可見,<span> 的 color 爲 red。
若是外部樣式表和內部樣式表中的樣式發生衝突會出現什麼狀況呢?這與樣式表在 HTML 文件中所處的位置有關。樣式被應用的位置越在下面則優先級越高,其實這仍然能夠用規則 4 來解釋。
例5:
// HTML <link rel="stylesheet" type="text/css" href="style-link.css"> <style type="text/css"> @import url(style-import.css); div { background: blue; } </style> <div></div> // style-link.css div { background: lime; } // style-import.css div { background: grey; } 從順序上看,內部樣式在最下面,被最晚引用,因此 <div> 的背景色爲 blue。
上面代碼中,@import
語句必須出如今內部樣式以前,不然文件引入無效。固然不推薦使用 @import
的方式引用外部樣式文件,緣由見另外一篇博客:CSS 引入方式。
CSS 還提供了一種能夠徹底忽略以上規則的方法,當你必定、必須確保某一個特定的屬性要顯示時,可使用這個技術。
CSS 優先規則5:屬性後插有 !important
的屬性擁有最高優先級。若同時插有 !important
,則再利用規則 三、4 判斷優先級。
例6:
// HTML <div class="father"> <p class="son"></p> </div> // CSS p { background: red !important; } .father .son { background: blue; } 雖然 .father .son 擁有更高的權值,但選擇器 p 中的 background 屬性被插入了 !important, 因此 <p> 的 background 爲 red。
在學習過程當中,你可能發現給選擇器加權值的說法,即 ID 選擇器權值爲 100,類選擇器權值爲 10,標籤選擇器權值爲 1,當一個選擇器由多個 ID 選擇器、類選擇器或標籤選擇器組成時,則將全部權值相加,而後再比較權值。這種說法實際上是有問題的。好比一個由 11 個類選擇器組成的選擇器和一個由 1 個 ID 選擇器組成的選擇器指向同一個標籤,按理說 110 > 100,應該應用前者的樣式,然而事實是應用後者的樣式。錯誤的緣由是:選擇器的權值不能進位。仍是拿剛剛的例子說明。11 個類選擇器組成的選擇器的總權值爲 110,但由於 11 個均爲類選擇器,因此其實總權值最多不能超過 100, 你能夠理解爲 99.99,因此最終應用後者樣式。