Q:如果多个规则匹配同一个元素,而且部分声明之间有冲突,那么我们如何知道哪个规则胜出呢?
A:用户代理会计算每个规则中选择符的特指度,然后将其依附到规则中的每个声明上。如果两个或多个属性声明有冲突,特指度最高的声明胜出。而为了计算特指度,用户代理必须把规则“打散”成单独的规则
例如:h1 { color: silver; background: black; }
将变成以下形式。二者的特指度都是 0,0,0,1
,赋予每个声明的值就是它
h1 { color: silver; } h1 { background: black; }
特指度(或权值):表示一个css选择器表达式的重要程度
选择符的特指度由选择符本身的组成部分决定。一个特指度值由四部分构成,例如:
0,0,0,0
重要声明[1] | 行内样式 | ID选择符 | Class[2] | Element[3] | 通用选择符 | |
---|---|---|---|---|---|---|
特指度值 | 优先级最高 | 1,0,0,0 |
0,1,0,0 |
0,0,1,0 |
0,0,0,1 |
0,0,0,0 |
重要声明注意:
!important
。!important
的位置必须正确,否则声明将失效!important
的声明对特指度没有影响,但它会与不重要的声明分开处理
!important
的声明会放在一起,而特指度冲突就在这个范围内解决特指度写法注意:
1,0,0,0
比所有以 0
开头的特指度大,不管后面的数字有多大0,0,0,0
,这与没有特指度是不同的继承:是指把一个元素的某些属性值传给其后代的机制(某些样式不仅应用到所指元素上,还应用到元素的后代上)
注意事项:
案例:因为通用选择符应用于全部元素,而且特指度为零,所以它声明的颜色gray击败继承的颜色black(由于继承的值没有特指度),因此,em元素渲染为灰色,而不是黑色
* { color: gray; } h1#page-title { color: black; } <h1 id="page-title"> Meerkat <em>Central</em> </h1> <p>Welcome to the best place on the web for meerkat information!</p>
层叠:是一种样式在文档层次中逐层叠加的过程,目的是让浏览器面对某个标签特定属性值的多个来源,确定最终使用哪个值
CSS层叠规则:
按显示权重排序,以 !important
标记的规则比没有这一标记的权重高
!important
标记,那么有此标记的规则胜出如果显示权重相同,就要考虑规则的来源。声明有三个来源:创作人员、读者、用户代理
!important
标记的声明!important
标记的声明如果各声明的显示权重和来源相同,那么应该按特指度排序,特指度高的声明胜出
如果两个规则的显示权重、来源和特指度都相同,那么在样式表中的位置靠后的规则胜出
重要声明:!important ↩︎
Class:类选择符、属性选择符、伪类选择符 ↩︎
Element:元素选择符、伪元素选择符 ↩︎