一般,在咱們的佈局中,css每條規則的權重是致使應用在元素上的css沒有生效的主要緣由。爲此,咱們須要瞭解瀏覽器是如何利用權重進行解析的。css
css 權重即每條 css 在應用時所佔據的份量,優先級如何,它決定了瀏覽器如何將這條規則應用到相應的元素上。每個選擇器都有本身的權重級別,而每一條 css 規則的權重是由這些選擇器的權重加權而成,最終,權重高的 css 將會應用到相應的元素上。html
在 css 中不一樣的選擇器有不一樣的權重等級,主要分爲如下四個等級:瀏覽器
內聯樣式bash
內聯樣式(行內樣式)即經過 style 屬性直接寫在元素上的樣式,以下佈局
<div style={{ color: red }}>
複製代碼
id 選擇器post
id 是一個元素的標識,id 選擇器經過#
表示,以下:spa
// css
#title {
color: red;
}
// html
<div id="title">
複製代碼
類、僞類、屬性選擇器code
這三種選擇器爲同一等級。htm
.root {
background: red;
}
.root:hover {
background: black;
}
[title] {
background: blue;
}
<div class="root" title="css"></div>
複製代碼
元素、僞元素選擇器繼承
這兩種選擇器爲同一等級。
.div {
background: red;
}
.div::selection {
background: black;
}
<div>css</div>
複製代碼
關於選擇器的知識能夠查看CSS 選擇器一文。
定性來講,css 權重大小順序以下!important > 內聯樣式 > ID > 類、僞類、屬性 > 元素、僞元素 > 繼承 > 通配符
,爲了方便計算,有聰明的 boy 給每一個等級定義了一個基數,即
權重計算時,每遇到一個選擇器就加上相應的基數,總和大的認爲權重更高。以下:
style="" => 1000(一個行內樣式)
#title{} => 100(一個ID選擇器)
.root => 10(一個類)
[title] => 10(一個屬性)
div => 1(一個元素)
*{} => 0(通配符)
div span {} => 1+1=2(兩個元素)
div h1+span {} => 1+1+1=2(三個元素)
div:first-child => 1+10=11(一個元素,一個僞類)
div [title] => 1+10=11(一個元素,一個屬性選擇器)
body #title .root p {} => 112(1+100+10+1,兩個元素,一個Id選擇器,一個類)
複製代碼
須要注意的是,這種計算方式只是爲了便於理解而使用的方法,它並不必定準確。
以下,因爲 body div 的權重(2)大於 div 的權重(1),所以 div 的背景色爲藍色。
<style type="text/css">
body div {
background: blue;
}
div {
height: 100px;
width: 100px;
background: red;
}
</style>
<body>
<div>css</div>
</body>
複製代碼
以下,div 背景色紅色在藍色後,所以 div 最終爲紅色。
<style type="text/css">
div {
background: blue;
}
div {
background: red;
height: 100px;
width: 100px;
}
</style>
<div>css</div>
複製代碼
也就說對於不一樣等級的選擇器,即便低等級的選擇器再多,其權重仍小於只有一個高等級選擇器的 css。例如 11 個 class 和一個 id,利用前述的計算方法 11 個 class 的權重爲 110,id 權重爲 100,class 權重值更大,可是這並不成立,這種狀況下以前的計算方法再也不適用。以下,因爲 id 比 class 高一個等級,所以,id 選擇器權重更高,div 最終爲紅色背景
<style type="text/css">
.root1 .root2 .root3 .root4 .root5 .root6 .root7 .root8 .root9 .root10 .root11 {
background: blue;
}
#root {
background: red;
height: 100px;
width: 100px;
}
</style>
<div id="root" class="root1" class="root2" class="root3" class="root4" class="root5" class="root6" class="root7" class="root8" class="root9" class="root10" class="root11" ></div>
複製代碼