CSS選擇器的權重與優先規則?

標籤:

我們做項目的時候,經常遇到樣式層疊問題,被其他的樣式覆蓋,或者寫的權重不高沒效果,對權重進行具體的分析,做了一個總結。

css繼承是從一個元素向其後代元素傳遞屬性值所採用的機制。確定應當向一個元素應用哪些值時,瀏覽器不僅要考慮繼承,還要考慮聲明的特殊性,另外需要考慮聲明本身的來源。這個過程就稱爲層疊。——《css權威指南》

 如下圖,css規則由選擇器和聲明塊組成,寫在選擇器後面大括號裏的就叫聲明。

一、樣式類型
1、行間/行內/內聯樣式

 <h1 style="font-size:12px;color:#000;">我的行間CSS樣式。</h1>

2、內部樣式

<style type="text/css">
   h1{font-size:12px; color:#000;}
</style>

3、外部樣式

<link rel="stylesheet" href="css/style.css">

例子彙總html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS選擇器的權重與優先規則?</title>
<style>
.demo{
    width:1000px;
    border:1px solid #eee;
    margin:0 auto;
}
a {color:red;}
</style>
<link rel="stylesheet" rev="stylesheet" href="css/style1.css" type="text/css" />
<link rel="stylesheet" rev="stylesheet" href="css/style2.css" type="text/css" />
</head>
<body>

<div class="demo">
    <a href="#" style="color:yellow;">11111111</a>
</div>

</body>
</html>

style1.css

a {color:blue;}

style2.css

a {color:green;}

不同情況說明:一共四種情況都設置了a的樣式,看看優先級情況;

1.當只有2個外聯樣式時:style2.css > style1.css   

顯示綠色:  

說明樣式相同情況下,樣式表是從上向下執行的。

2.當有外部和內聯情況下

顯示綠色:  

說明內聯和外面,樣式相同情況下,樣式表是從上向下執行的。

注意:經常有錯覺,內聯大於外部,那是我們內部經常加到外部下面,覆蓋掉了外部的。

3.當有外部,內部,行間時:

顯示:黃色  

說明:行間權重最高。

 

二、選擇器類型
  1、ID  #id{...}    權值0100
  2、class  .class{...}    權值0010
  3、標籤  p{...}    權值0001
  4、通用  *{...}    權值0000
  5、屬性  [type="text"]{...}    權值0010
  6、僞類  :hover{...}  權值0010
  7、僞元素  ::first-line{...},:after{...}    權值0001
  8、子選擇器、相鄰選擇器    權值0000

三、權重計算規則
    如下千級權值、百級權值……是自己發明的詞,非官網,好理解而已。
    特級:!important(權重),優先級是最高,沒有特殊性值,爲了方便記憶,可以認爲它的特殊性值爲1,0,0,0,0。
    第一等(千級權值):代表 內聯樣式,如: style=””,權值爲:1000。
    第二等(百級權值):代表 ID選擇器,如:#content,權值爲:0100。
    第三等(十級權值):代表 類,僞類和屬性選擇器,如: .content , :hover , [type="text"] 權值爲:0010。
    第四等(個級權值):代表 標籤選擇器和僞元素選擇器,如:  p ,::first-line 權值爲:0001。
    零級權值:通配符、子選擇器、相鄰選擇器等的。如: *、>、+,權值爲:0000。
    繼承權值:-1,繼承的樣式沒有權值,通配符、子選擇器、相鄰選擇器等優先級高於元素繼承的優先級,可以理解爲繼承的權值是-1。繼承樣式的元素就是沒人管的孩子,他們就近找一戶人家罷了。

<style type="text/css">
	.panel_list li{font-size: 20px !important;}
	div{font-size: 12px;}
</style>
...
<ul class="panel_list">
    <li> <div class="mytitle">樣式測試</div> </li>
</ul>

.panel_list li{font-size: 20px !important;} 雖然權值很高,但對於div元素來說,只是一個繼承樣式,所以權值是最低的-1,

設計思想就是要讓繼承的樣式被明確指定的樣式覆蓋。

補充:CSS的繼承是指被包在內部的標籤將擁有外部標籤的樣式性質,它是依賴於祖先-後代的關係的。
多數邊框類屬性,比如象Padding(補白),Margin(邊界),背景和邊框的屬性都是不能繼承的。表格也不能繼承父親的樣式。

css選擇器權重列表如下:

權重 選擇器
10000 !important(!important並不是選擇器,但是權重卻是最高的)
1000 內聯樣式:style=""
100 ID選擇器: #idName{...}
10 類、僞類、屬性選擇器:.className{...} / :hover{...} / [type="text"] ={...}
1 標籤、僞元素選擇器:div{...} / :after{...}
0 通用選擇器(*)、子選擇器(>)、相鄰選擇器(+)、同胞選擇器(~)

    例如:以下規則中選擇器的權值分別是:

1  style="color: yellow;"                      /*權值:1000*/
2  div a{color: green;}                        /*權值:1+1=2*/
3  #demo a{color: orange;}                     /*權值:100-0-1*/
4  div#demo a{color: red;}                     /*權值:100-0-2*/
5  .demo a{color: black;}                      /*權值:0-10-1*/
6  .demo input[type="text"]{color: blue;}      /*權值:0-20-1*/
7  .demo *[type="text"]{color: grey;}          /*權值:0-20-0*/

 

變態情況:鑫大神的例子256個class類名選擇器幹掉一個id選擇器實例頁面--->親自試驗沒有幹掉……
http://www.zhangxinxu.com/study/201208/256-class-fire-an-id.html
解釋:
因爲test元素是不存在的,因此,爲了兼容IE6~8瀏覽器,需要在頭部寫上額外的一行JS代碼:document.createElement("test");
chrome 沒有此現象,FireFox有此現象,因爲在FireFox的源代碼中,所有的類名(classes)都是以8字節字符串存儲的,8字節所能存儲的最大值是255,當出現256個class時候,存儲的數字會進位,從而超過id權值。

這其實是一個小BUG,有些瀏覽器廠商已經開始修復。

四、比較規則
    0-100-0-0 > 0-0-110-0。也就是說從左往右逐個等級比較,前一等級相等才往後比。
    百級權值跟百級權值比較,十級權值跟十級權值比較……十級權值不能進位到百級權值,
    #demo{color: orange;}的權值:100-0-1,意思是百級權值是100,十級權值是0,個級權值是1,
    .c1.c2.c3.c4.c5.c6.c7.c8.c9.c10.c11{color: red;}的權值:0-110-0,最後結果是#demo{color: orange;}生效。


    無論是行間、內部和外部樣式,都是按照這個規則來進行比較。而不是直觀的行間>內部>外部樣式;ID>class>元素。
    在權重相同的情況下,後面的樣式會覆蓋掉前面的樣式。
    通配符、子選擇器、相鄰選擇器等,雖然權值爲0000,但是也比繼承的樣式優先。

五、實例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS選擇器的權重與優先規則?</title>
<style>
a{color: yellow;} /*1*/
div a{color: green;} /*2*/
.demo a{color: black;} /*10-1*/
.demo a[title]{color: blue;} /*20-1*/
.demo *[title]{color: grey;} /*20*/
#demo a{color: orange;} /*100-0-1*/
div#demo a{color: red;} /*100-0-2*/
</style>
</head>
<body>

<a href="">第一條應該是黃色</a> <!--適用第1行規則-->
<div><a href="">第二條應該是綠色</a></div>
<div class="demo">
    <a href="">第三條應該是黑色</a><br/><!--適用第1、2、3行規則,第3行優先級高-->
    <a href="" title="#">第四條應該是藍色</a><br/><!--適用第4、5行規則,第4行優先級高-->
    <p title="#">第五條應該是灰色</p><!--適用第4、5行規則,第5行適用-->
</div>
<div id="demo">
    <a href="">第七條應該是紅色</a><!--適用第6、7行規則,第7行優先級高-->
</div>

</body>
</html>

顯示:

另外參考:https://blog.csdn.net/qq_41761591/article/details/97547284,權值的計算更到位。

細說繼承特性

1、就近繼承原則
strong分別從body和p中繼承了color屬性,但是由於p在繼承樹上離strong更近,因此strong中的文字最終繼承p的藍色。

<style type="text/css">
    body {color:black;}
    p {color:blue;}
</style>
...
<body> 
    <p>welcome to <strong>我的博客</strong></p>
</body>

2、直接指定樣式優先
繼承的樣式沒有權值,通配符、子選擇器、相鄰選擇器等優先級高於元素繼承的優先級,可以理解爲繼承的權值是-1。
繼承的樣式會被明確指定的樣式覆蓋。

<ul class="panel_list">
    <li>
        <div class="mytitle">字體測試</div>
    </li>
</ul>

內部樣式

<style type="text/css">
	.panel_list li{font-size: 20px;}
	div{font-size: 12px;}
</style>

看起來 .panel_list li{font-size: 20px;} 權值是0-10-1,但是div是繼承此樣式,所以對於div來說,此樣式權值是繼承權值-1,
而 div{font-size: 12px;} 權值是0-0-1,此樣式生效。

修改爲

<style type="text/css">
	.panel_list li>div{font-size: 20px;}
	div{font-size: 12px;}
</style>

此時對於div來說,
.panel_list li>div{font-size: 20px;} 權值是:0-10-2,
div{font-size: 12px;}權值是:0-0-1,
所以 .panel_list li>div{font-size: 20px;} 生效。

國外有人制作了一個很通俗易懂的,大魚吃小魚,小魚吃小蝦的CSS選擇器類型與權重關係圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章