一般,在咱们的布局中,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>
复制代码