相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突问题。
在这里会显示的颜色为pink,字体大小为20px。
子标签会继承父标签的某些样式
在这里p标签会显示红字,20px。
行高的继承
当同一个元素指定多个选择器,就会有优先级的产生
p为白色因为继承权重为0,无论父类是什么权重都不继承。
所以如果要给a设置样式就要单独设置一个a的样式。
这里显示的为蓝色,因为权重大。
最终大猪蹄子的颜色为红色,大肘子和猪尾巴为蓝色。
所谓的层叠性与优先级,其实说白了可以理解为,不同的规则起冲突的情况下,听谁的呢?有的时候这种冲突很容易解决,有的时候我们自己都难以决断,比如好声音三位导师都选你,该跟谁走呢。索性css给出了这些规则的优先级,不需要我们去苦恼。
元素的样式该如何去展现呢,首先看一下某个元素某个属性可能作用样式的情况:
下面我们来详细分析一下这三种情况。
我们先来看有唯一指定样式的情况,因为,这种情况最简单,就一个选择,也别挑了,说啥就是啥。我们还是来大致看看。
结论:若只有唯一指定样式,以该样式为准。
多个样式规则冲突,其实有很多种情况。还记得我们学过样式引入方式有四种,涉及三种样式,分别是内联,内部和外部(参考 CSS入门4-引入CSS )。首先我们来看只引入其中一种类型的情况下,出现冲突该如何解决。
仅有内联的情况下,要出现冲突,只可能是在style中多次对同一个属性赋值。
看上图,审查一下元素,可以看到该元素样式中,前面的red被覆盖了,color最后的取值是blue。最右边文字的颜色确实也是蓝色。
结论:只有内联样式,后面的属性赋值优先级大于前面的属性赋值。
内部样式,已经可以选择多种选择器来指定样式。所以,这里情况比内联会复杂很多。首先来复习一下选择器的种类,可以参考 CSS入门5-选择器 。这么多的选择器类型和组合关系,可能都会产生冲突,这个时候怎么办呢,想想都复杂,我们继续拆分问题。将选择器分为四类:
可以看到div中两个类对颜色的定义冲突时,不管class定义的顺序如何,以style中类的顺序为准,后面的覆盖前面的样式。如果是同一选择器,也是后者覆盖前者,这种情况可以涵盖在同类选择器的情况下。
结论:同类型选择器(类型一样,即同为元素选择器,类选择器,id选择器或者属性选择器),按style中的先后顺序,后者优先级更高。
我们选择正反两种顺序,来看不同选择器之间的比较。首先,四种选择器在一起时,id选择器获胜。然后排除id选择器,剩余三种选择器比较时,类和属性谁在下边谁赢,也就是后者覆盖前者。最后,元素分别与类和属性比较,发现元素都输了。
结论:id >(类和属性) >元素,类和属性同级,遵循同级元素后者覆盖前者的规则。
注:查看某个元素样式的时候,调试窗口是按照优先级规则从小到大往上排的,越往上的规则优先级越高,对同个属性的样式规定将会覆盖下面低优先级的样式规定。
注:要想在调试器看到动态伪类效果,需要在styles中勾选该效果。
看上面示例,我们在style内先按id,类,属性,元素,静态伪类(只应用于超链接),动态伪类(可应用于任何元素),目标伪类:target(IE8-不支持,匹配锚点对应的目标元素),UI元素伪类(IE8-不支持),结构伪类(IE8-不支持)的顺序指定规则。结果发现其表现如下:
a:id >结构伪类 >动态伪类 >静态伪类 >属性 >类 >元素 >浏览器默认属性 >继承属性
input:id >结构伪类 >UI元素伪类 >目标伪类 >动态伪类 >类 >元素 >浏览器默认属性 >继承属性
我们合并一下这两个结论,有如下结论:
3.2.1.2.2.1-1 id >结构伪类 >UI元素伪类 >目标伪类 >动态伪类 >静态伪类 >属性 >类 >元素 >浏览器默认属性 >继承属性
(当然,需要注意的是,并不是每个元素都有这些属性的)
然后,我们将style内各规则倒序一下:
结果发现其表现如下:
a:id >类 >属性 >静态伪类 >动态伪类 >结构伪类 >元素 >浏览器默认属性 >继承属性
input:id >类 >动态伪类 >目标伪类 >UI元素伪类 >结构伪类 >元素 >浏览器默认属性 >继承属性
我们合并一下这两个结论,有如下结论:
3.2.1.2.2.1-2 id >类 >属性 >静态伪类 >动态伪类 >目标伪类 >UI元素伪类 >结构伪类 >元素 >浏览器默认属性 >继承属性
综合3.2.1.2.2.1-1和3.2.1.2.2.1-2来看,我们再次验证了类和属性同级,并且发现它们和伪类也是同级的。有如下结论:
结论:id >(类,属性,伪类) >元素,类,属性和伪类同级,遵循同级元素后者覆盖前者的规则。
伪元素,说是元素,但又不是真实的元素,是一个虚拟的元素。如何详细理解这段话呢,我们来看一下下面这个例子。
先按后代,子代,通用兄弟,相邻兄弟在style中排序,发现后面的优先级高。然后顺序反过来:
由以上几点结论可以得出, 亲戚关系发生冲突时,先看id选择器数量,谁多谁大,一样多就看类(及其同级)选择器,谁多谁大,若还是一样多,则看元素选择器,谁多谁大。如果仍然一样多,谁在后面谁优先。
可以看出, 通配选择器样式优先级仅比浏览器默认样式和继承样式优先级高一些 。
总结3.2.1.2 仅有内部样式的情况,有如下结论:
ps:对于社群关系,在比较优先级时,将其理解为在该位置拆按顺序成一个个单独的个体即可。
这种情况的表现形式与内部样式一样。
这种情况遵循后者覆盖前者的原则,后面的link优先于前面的link,而不管其加载的顺序如何。
内联 >内部 >外部
CSS的继承性、层叠性、权重
css知多少(3)——样式来源与层叠规则
深入理解CSS中的层叠上下文和层叠顺序