本系列内容由ZouStrong整理收录
整理自 《写给大家看的CSS书(第2版)》、《CSS权威指南(第3版)》、《精彩绝伦的CSS》、《精通CSS:高级Web标准解决方案(第2版)》、CSS参考手册 css.doyoe.com
由于CSS选择器的强大,我们可以使用不同方法来选择同一个元素,因此,如果一个元素有两个以上的规则匹配,会怎样呢?
特殊性的出现决定了应用样式时的优先级,决定了谁覆盖谁,是”层叠”的基础
特殊性可以,表述为4个部分
A——B——C——D
0 0 0 0
特殊性0,0,1,0比特殊性0,0,0,12高(也就是再多的元素选择器也不可能比一个类选择器的特殊性高,同理,再多类选择器也不可能比ID选择器高.....)
继承的值没有特殊性,0特殊性要比没有特殊性强,即定义的样式总是覆盖继承的样式
<p id="test"><span>一段文字</span></p>
* {color:blue;}
p {color:red;} /*显示蓝色*/
这个例子说明了不加区别的使用通配选择符可能存在的问题之一,由于它能匹配任何元素,所以通配选择符往往具有短路继承的效果(覆盖继承值)
#test {color:red;}
span {color:blue;} /*仍然显示蓝色*/
注:如果都是继承值的话,那就看特殊性了
h1,h2,h3{color:red;}
h1{color:blue;}
h1显示蓝色,选择器分组实际上是这样的(所以说,选择器分组不是一种选择器)
h1{color:red;}
h2{color:red;}
h3{color:red;}
h1{color:blue;}
为元素应用某些CSS样式时,其后代元素也自动获得该样式,这种机制称之为继承,继承的存在有利于减少CSS代码,便于维护
可继承的属性有:
不可继承的属性:
注:之所以设置背景色等属性时,子元素也有效果,是因为背景色的默认值是transparent,是透明的,所以才会显示父元素的背景
继承值完全没有特殊性(比0特殊性还要低)这一点很重要
#tool { color : #F00; }
只要id为tool的元素内包含的是纯文本就不会有什么问题,但是如果包含一个超链接的话,那么它的颜色可能就是蓝色咯,因为开头的reset里总是会为超链接设置一些默认样式,此时必须如下声明
#tool a { color : #F00;}
CSS层叠是指针对同一元设置置同一属性时,依据层叠规则(来源、特殊性)来处理冲突,选择权重高的CSS选择器所指定的属性(权重高的覆盖权重低的)
除此之外的符合以下层叠规则
特殊性相同时,那就要看来源了
外部样式如果放在嵌入样式的后面,则外部样式也会覆盖内部样式,那么,其实,这两个权重是一样的咯?之所以说嵌入样式高于外部样式,TM的是因为嵌入样式几乎总是写在外部样式的后面,这是覆盖的问题了
现在可以谈一谈为什么要按照 :link、:visited、:hover、:active的顺序声明链接样式了
因为他们的来源,特殊性都相同,所以只能以出现的顺序来决定层叠
如果,我们这样使用
:active {}
:hover {}
:link {}
:visited {}
将永远不会得到hover的样式,因为所有链接要么是已访问的,要么是未访问的....因此:hover和:active的样式最终都会被覆盖,不会显示出来