何為CSS 樣式優先順序
導讀 | 當建立的樣式表越來越複雜時,一個標籤的樣式將會受到越來越多的影響,這種影響可能來自周圍的標籤,也可能來自其自身。下面我們從這兩方面去看看 CSS 樣式的優先順序。 |
CSS 的繼承特性指的是應用在一個標籤上的那些 CSS 屬性被傳到其子標籤上。看下面的 HTML 結構:
<div> <p></p></div>
如果 <div> 有個屬性 color: red,則這個屬性將被 <p> 繼承,即 <p> 也擁有屬性 color: red。
由上可見,當網頁比較複雜, HTML 結構巢狀較深時,一個標籤的樣式將深受其祖先標籤樣式的影響。影響的規則是:
CSS 優先規則1: 最近的祖先樣式比其他祖先樣式優先順序高。
例1:
<!-- 類名為 son 的 div 的 color 為 blue --><div style="color: red"> <div style="color: blue"> <div class="son"></div> </div></div>
如果我們把一個標籤從祖先那裡繼承來的而自身沒有的屬性叫做"祖先樣式",那麼"直接樣式"就是一個標籤直接擁有的屬性。又有如下規則:
CSS 優先規則2:"直接樣式"比"祖先樣式"優先順序高。
例2:
<!-- 類名為 son 的 div 的 color 為 blue --><div style="color: red"> <div class="son" style="color: blue"></div></div>
上面討論了一個標籤從祖先繼承來的屬性,現在討論標籤自有的屬性。在討論 CSS 優先順序之前,先說說 CSS 7 種基礎的選擇器:
- 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;}
最終的 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.cssdiv { background: lime;}// style-import.cssdiv { background: grey;}
從順序上看,內部樣式在最下面,被最晚引用,所以 <div> 的背景色為 blue。
上面程式碼中,@import 語句必須出現在內部樣式之前,否則檔案引入無效。當然不推薦使用 @import 的方式引用外部樣式檔案,原因見另一篇部落格:CSS 引入方式。
CSS 還提供了一種可以完全忽略以上規則的方法,當你一定、必須確保某一個特定的屬性要顯示時,可以使用這個技術。
CSS 優先規則5:屬性後插有 !important 的屬性擁有最高優先順序。若同時插有 !important,則再利用規則 3、4 判斷優先順序。
例6:
// HTML<div class="father"> <p class="son"></p></div>// CSSp { 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,應該應用前者的樣式,然而事實是應用後者的樣式。錯誤的原因是:權重的進位制是並不是十進位制,CSS 權重進位制在 IE6 為 256,後來擴大到了 65536,現代瀏覽器則採用更大的數量。。還是拿剛剛的例子說明。11 個類選擇器組成的選擇器的總權值為 110,但因為 11 個均為類選擇器,所以其實總權值最多不能超過 100, 你可以理解為 99.99,所以最終應用後者樣式。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2780217/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSS優先順序CSS
- css 選擇器優先順序CSS
- 推導相等優先順序為何彈出棧頂
- HTML中設定多個class屬性css的優先順序,css樣式覆蓋HTMLCSS
- CSS 選擇器的優先順序CSS
- CSS 選擇器優先順序規則CSS
- CSS之選擇器及其優先順序CSS
- CSS之CSS和html整合方式及優先順序CSSHTML
- 怎樣做好客戶的優先順序?
- 華為路由協議優先順序路由協議
- 深入理解CSS選擇器優先順序CSS
- CSS3選擇器及優先順序CSSS3
- python運算子及優先順序順序Python
- Android程式優先順序Android
- 中斷優先順序
- Yacc使用優先順序
- 真正理解"CSS選擇器的優先順序"CSS
- CSS入門十二:選擇器的優先順序CSS
- toString()和valueOf()函式呼叫和優先順序函式
- Facebook的分散式優先順序佇列FOQS分散式佇列
- SpringBoot配置檔案優先順序載入順序Spring Boot
- 運算子的優先順序
- SQL 優先順序join>whereSQL
- java運算子優先順序Java
- CSS 基礎(盒模型、選擇器、權重、優先順序)CSS模型
- CSS的三大特性(繼承、層疊和優先順序)CSS繼承
- CSS三個特性:層疊性、繼承性、優先順序CSS繼承
- [譯]HTTP/2的優先順序HTTP
- Yarn任務優先順序配置Yarn
- ansible 變數優先順序示例變數
- C++運算子優先順序C++
- java setPriority()設定優先順序Java
- 封裝優先順序佇列封裝佇列
- 好程式設計師HTML5培訓教程-css樣式的繼承性、層疊性 、優先順序程式設計師HTMLCSS繼承
- html優先順序和層疊性HTML
- 任務卡片優先順序排序-Leangoo排序Go
- C語言運算子優先順序C語言
- 設計中的優先順序(下)