CSS樣式表的優先順序別

來源:互聯網
上載者:User

原文:http://www.cnblogs.com/lushuicongsheng/archive/2012/07/30/2614756.html

CSS2.1 中規定了關於 CSS 規則 Specificity(特異性)的計算方式,用一個四位的數字串(註:CSS2 中是用三位)來表示,最後以 Specificity 的高低判斷 CSS 的優先權。
Specificity 具體的計算規則:
元素的 style 樣式屬性,加 1,0,0,0。
每個 ID 選擇符(#id),加 0,1,0,0。
每個 class 選擇符(.class)、每個屬性選擇符(例 [attr=”"] )、每個偽類(例 :hover),加 0,0,1,0。
每個元素或虛擬元素(例 :firstchild)等,加 0,0,0,1。
其他選擇符(例 全域選擇符 *,子選擇符 >),加 0,0,0,0。
最後逐位相加數字串,得到最終的 Specificity 值,按照從左至右的順序逐位比較。
除了 Specificity 還有一些其他規則:
!important 聲明的規則高於一切,如果 !important 聲明衝突,則比較優先權。
如果優先權一樣,則按源碼中“後來者居上”的原則。
由繼承而得到的樣式屬性不參與 specificity 的計算,低於一切其他規則(例 全域選擇符 * )。
範例分析:

h1 {color: red;}
/* 只有一個普通元素加成,結果是 0,0,0,1 */
body h1 {color: green;}
/* 兩個普通元素加成,結果是 0,0,0,2 */
/*0,0,0,1 小於 0,0,0,2 ,後者勝出*/
h2.grape {color: purple;}
/* 一個普通元素、一個class選擇符加成,結果是 0,0,1,1*/
h2 {color: silver;}
/*一個普通元素,結果是 0,0,0,1 */
/*0,0,1,1 大於 0,0,0,1 ,前者勝出*/
html > body table tr[id=”totals”] td ul > li {color: maroon;}
/* 7個普通元素、一個屬性選擇符、兩個其他選擇符(子選擇符 >),結果是0,0,1,7 */
li#answer {color: navy;}
/* 一個ID選擇符,一個普通選擇符,結果是0,1,0,1 */
/*0,0,1,7 小於 0,1,0,1,後者勝出*/
             摘自  http://www.cnblogs.com/Hotcocoa/articles/2104147.html 

談到CSS優先順序別:從兩個層面來談:

第一層面,就是從宏觀的層面上談,CSS樣式優先順序別,就是

 行內樣式 >  植入樣式(就是寫在頁面style裡的樣式) >連結樣式 >匯入樣式 >瀏覽器預設的樣式

 

第二層面,就是在第一個層面的樣式層級裡某一個階段,舉例子說,在植入樣式這層級上,有5大優先法則;

 優先原則一:文本從上到下,後出現的樣式優先於前面出現的同一樣式

 例:

<style type=”text/css”>

.def1{background:black;}

.def2{background:yellow; }

</style>

<div class=” def2 def1″>測試1</div>

結果:所有瀏覽器均yellow色,注意:與class=”” 引號內的順序無關,只看.def1和.def2在聲明時的順序,.def2後聲明的所以權重高。

優先原則二:id聲明(即 # 開頭的樣式)> class聲明(即 . 開頭的樣式)> 標籤聲明(即 類似 div 開頭)

以上三種聲明處於不同的量級,份量上,div 開頭相當於 1克 重,. 開頭相當於 1公斤 重,# 開頭相當於 1噸 重。

例:

<style type=”text/css”>

#bb{background:pink}

.def{background:black;}

div{background:yellow; }

</style>

<div id=”bb” class=”def”>測試2</div>

結果:所有瀏覽器均pink色,注意:雖然按優先原則一,後出現的權重高,但那隻是在同樣重量級下的比較,優先原則二各重量層級就不同了。

優先原則三:數量取勝。如果同一個樣式聲明即一個大括弧{}由多個 # . 或 div 組成,則權重按出現符號的量級增加

比如:#bb #tt #dd {background:red} 則重量等於3噸

#bb .tt ul.dd li {background:red} 則重量等於1噸2公斤2克,這麼精確的重量,就不需要舉例了吧。

再次說明:優先原則一隻適用兩個樣式聲明同樣重的情況

優先原則四:‘!important’。相當於無限重量,在之前已經有說明,需要注意:ie下,在同一條樣式聲明即一個大括弧中出現的!important 會被隨後出現的同名樣式沖洗掉。

<style type=”text/css”>

.def1{background:yellow !important;background:red;}

.def2{background:green;}

</style>

<div class=”def1 def2 “>dd</div>

結果:ie下,green色,background:yellow !important被後面的background:red沖洗了,而background:red與background:green的較量中,前者敗在優先原則一之下。

優先原則五:近水樓台。<div style=”background:black”></div>直接寫在元素體內的style優先順序別最高!(僅次於!important)用重量來形容,可以定為百萬噸量級。

<style type=”text/css”>

.def1{ background:red;}

</style>

<div class=”def1 ” style=”background:black”>dd</div>

結果:black色。

<style type=”text/css”>

.def1{ background:red !important;}

</style>

<div class=”def1 ” style=”background:black”>dd</div>

結果:red色。

<style type=”text/css”>

.def1{ background:red !important;}

</style>

<div class=”def1 ” style=”background:black !important”>dd</div>

結果:black色。

 

一談樣式的層級,有時候,還和瀏覽器有關係,上述的CSS樣式優先順序別知識,在大部分場合沒問題,但是不是一定對。

所有請各位讀者,這個只是給你一個CSS相對正確的知識。

摘自 http://blog.csdn.net/qulijian1234/article/details/4365048

原文:http://www.cnblogs.com/lushuicongsheng/archive/2012/07/30/2614756.html

CSS2.1 中規定了關於 CSS 規則 Specificity(特異性)的計算方式,用一個四位的數字串(註:CSS2 中是用三位)來表示,最後以 Specificity 的高低判斷 CSS 的優先權。
Specificity 具體的計算規則:
元素的 style 樣式屬性,加 1,0,0,0。
每個 ID 選擇符(#id),加 0,1,0,0。
每個 class 選擇符(.class)、每個屬性選擇符(例 [attr=”"] )、每個偽類(例 :hover),加 0,0,1,0。
每個元素或虛擬元素(例 :firstchild)等,加 0,0,0,1。
其他選擇符(例 全域選擇符 *,子選擇符 >),加 0,0,0,0。
最後逐位相加數字串,得到最終的 Specificity 值,按照從左至右的順序逐位比較。
除了 Specificity 還有一些其他規則:
!important 聲明的規則高於一切,如果 !important 聲明衝突,則比較優先權。
如果優先權一樣,則按源碼中“後來者居上”的原則。
由繼承而得到的樣式屬性不參與 specificity 的計算,低於一切其他規則(例 全域選擇符 * )。
範例分析:

h1 {color: red;}
/* 只有一個普通元素加成,結果是 0,0,0,1 */
body h1 {color: green;}
/* 兩個普通元素加成,結果是 0,0,0,2 */
/*0,0,0,1 小於 0,0,0,2 ,後者勝出*/
h2.grape {color: purple;}
/* 一個普通元素、一個class選擇符加成,結果是 0,0,1,1*/
h2 {color: silver;}
/*一個普通元素,結果是 0,0,0,1 */
/*0,0,1,1 大於 0,0,0,1 ,前者勝出*/
html > body table tr[id=”totals”] td ul > li {color: maroon;}
/* 7個普通元素、一個屬性選擇符、兩個其他選擇符(子選擇符 >),結果是0,0,1,7 */
li#answer {color: navy;}
/* 一個ID選擇符,一個普通選擇符,結果是0,1,0,1 */
/*0,0,1,7 小於 0,1,0,1,後者勝出*/
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.