上一篇讲了对CSS样式浏览器的渲染结果是什么,但是为什么是这样,为什么有的样式定义优先级就高一些,其实,浏览器是通过specificity计算来决定的.
1.specificity是什么
一个页面元素的样式是怎么计算出来的呢?
浏览器先对外部样式,内部样式和行内样式进行解析形成语法树,然后通过匹配规则把匹配到一个元素的样式赋予这个元素.
然而有时候会出现这种问题,内部样式对某种样式属性进行了定义,外部样式也对某种样式进行了定义,那么浏览器该对这个属性进行哪种取值.如果选择器不相同,那么又该要哪种选择器优先呢?
这时就要specificity来决定了.Specificity就是对选择器进行权重比较的一个值.
2.specificity如何计算
specificity的值是这样计算的:
- 计数选择器中ID选择器的个数(如: #element { … }), 让 a = 计数值.
- 计数选择器中类选择器,属性选择器,伪类选择器的个数(如: .class1, [id=1], :hover), 让 b = 计数值.
- 计数选择器中类型选择器(标签选择器)和伪元素选择器的个数(如: h1, :before), 让 c = 计数值.
其他的通用选择器(*)和组合符号(+,>,~,’ ‘)等都不做计数,”:not”也不做计数,但是”:not”其内部的选择器依然计数.
如(来自W3C Recommendation):
* /* a=0 b=0 c=0 -> specificity = 0 */
LI /* a=0 b=0 c=1 -> specificity = 1 */
UL LI /* a=0 b=0 c=2 -> specificity = 2 */
UL OL+LI /* a=0 b=0 c=3 -> specificity = 3 */
H1 + *[REL=up] /* a=0 b=1 c=1 -> specificity = 11 */
UL OL LI.red /* a=0 b=1 c=3 -> specificity = 13 */
LI.red.level /* a=0 b=2 c=1 -> specificity = 21 */
#x34y /* a=1 b=0 c=0 -> specificity = 100 */
#s12:not(FOO) /* a=1 b=0 c=1 -> specificity = 101 */
以此specificity的值来决定用哪个选择器的值来决定相同样式的属性.
至于样式定义的优先级上一篇已经讲过了,不再赘述.