CSS入门8-三大特性之层叠特性与优先级

html-css06

CSS入门8-三大特性之层叠特性与优先级,第1张

所谓的层叠性与优先级,其实说白了可以理解为,不同的规则起冲突的情况下,听谁的呢?有的时候这种冲突很容易解决,有的时候我们自己都难以决断,比如好声音三位导师都选你,该跟谁走呢。索性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中的层叠上下文和层叠顺序

可以有三种理解方式,如下:

一:层叠性指的是样式的优先级,当产生冲突时以优先级高的为准。

开发者样式>读者样式>浏览器样式(除非使用!important标记 )

id选择符>(伪)类选择符>元素选择符

权重相同时取后面定义的样式

二:

CSS层叠性是指CSS样式在针对同一元素配置同一属性时,依据层叠规则(权重)来处理冲突,选择应用权重高的CSS选择器所指定的属性,一般也被描述为权重高的覆盖权重低的,因此也称作层叠。每个CSS选择器都会有一个权重,当两个选择器同时配置同一元素的同一属性时(比如一个设置color:red,另一个color:black),就会产生冲突,而解决冲突的方案就是CSS选择器的权重,权重高的来覆盖权重低的。

三:层叠性指的是上级标签的样式会自动继承到其所有下级标签,如针对<body>设置的标签选择器所设的字体样式会自动应用到<body>下的<p>中,除非<p>重写了相关样式将其覆盖。

一、CSS层叠性

说明

层叠性是多种CSS样式的叠加,是浏览器处理样式冲突的方式。在HTML中对于同一个元素可以有多个CSS样式存在,当有相同权重的样式存在时,会根据这些样式出现的先后顺序来决定,处于最后面的CSS样式将会覆盖前面的CSS样式。

二、CSS继承性

说明

简单的理解为—“子承父业“,是指子标签会继承父标签的==某些==样式,如文本颜色和字号。想要设置一个可继承的属性,只需将它应用于父元素即可。

三、CSS优先级

在复杂CSS样式表,往往并不是相同样式不同值的堆叠这么简单,经常出现两个或多个不同样式规则应用在同一元素上,这时到底采用哪个样式呢?这就是典型的CSS优先级问题。

处理优先级问题,就是考虑样式权重的高低。这里先给大家介绍一些特殊的情况:

==继承样式的权重为0。==也就是说,在嵌套结构中,无论父元素样式权重多大,子元素继承时,应用在子元素上的权重都为0,即子元素定义的样式会覆盖所有继承来的样式。

==行内样式优先。==应用style属性的元素,其行内样式的权重非常高,可以理解为远大于100。总之,他拥有比上面提高的选择器都大的优先级。

权重相同时,CSS遵循就近原则。也就是说靠近元素的样式具有最大的优先级,或者说排在最后的样式优先级最大。

CSS定义了一个!important命令,该命令被赋予最大的优先级。也就是说不管权重如何以及样式位置的远近,!important都具有最大优先级。