特殊性
上一章介绍了用不同的选择器选择元素,假设一个元素可以用两个或多个规则选择,每个规则都有自己的选择器,那应该应用哪一个选择器呢?
显然每一对规则只能有一个胜出.应该选哪个呢?答案就在每个选择器的特殊性,对于每个规则,用户代理会计算选择器的特殊性,并将这个特殊性附加到规则中的各个声明.如果一个元素有两个或多个冲突的属性声明,那么有最高特殊性的声明就会胜出.
选择器的特殊性由选择器本身的组件确定,特殊性值表述为4个部分,比如0,0,0,0.一个选择器的具体特殊性如下确定:
1.对于选择器中给定的各个ID属性值,加1,0,0,0;
2.对于选择器中给定的各个类属性值、属性选择或伪类,加0,0,1,0;
3.对于选择器中给定的各个元素和伪元素,加0,0,0,1
4.结合符和通配选择器对特殊性没有贡献.其特殊性为0,0,0,0
5.每个内联声明的特殊性都是1,0,0,0
要注意的是,当在一个样式声明中使用一个!important 规则时,此声明将覆盖任何其他声明。虽然技术上!important与特殊性无关,但它与它直接相关。
继承
所谓继承,指样式不光应用到指定元素,还会应用到后代元素,值得注意的点如下:
1.大多数框模型属性(包括外边距,内边距,背景和边框)都不能继承
2.继承的值没有特殊性,甚至连0特殊性都没有.
<h1 class="page">
juzipchy
<em>jin</em>
</h1>
由此可见,通配选择器优先于继承值.
层叠
假如特殊性相等的两个规则同时应用到同一个元素会如何显示?显示规则如下:
1.按显示权重对应到该元素的所有声明排序.标有!important的规则权重高于没有标!important的规则
2.按特殊性对应到给定元素的所有声明排序.有较高特殊性的元素权重大于有较低特殊性的元素.
3.按出现顺序对应到给定元素的所有声明排序.一个声明在样式表或文档中越往后权重越大.
值得注意的是,上章讲了伪类,我们推荐的链接样式顺序是按link-visited-hover-active(LVHA)的顺序,
a:link{
color: blue;
}
a:visited{
color: purple;
}
a:hover{
color: red;
}
a:active{
color: orange;
}
因为这些选择器的特殊性是一样的,按显示顺序里决定最后显示的样式是什么.
如忽略这种循序,而是按字母顺序排列链接样式
a:active{
color: orange;
}
a:hover{
color: red;
}
a:link{
color: blue;
}
a:visited{
color: purple;
}
则
:hover和:active样式失效,因为:link和:visited规则后出现,所有链接要么是已访问,要么是未访问,所以
:link和:visited样式总是覆盖:hover和:active.