过往css优先级中存在的问题 如果我们的页面上存在非常多的样式,譬如有我们开发页面的时候的自定义样式,也有引入的组件库样式。这时候样式将会非常混乱难以管理。 当我们想覆盖一些本身非我们书写的样式时候,往往不得不通过使用优先级权重更高的样式名,去覆盖那些样式。 同时,当样式优先级感到难以控制时,开发者习惯滥用!important去解决,这又循环导致了后续更混乱的样式结构。 基于让CSS得到更好的控制和管理的背景,CSSlayer应运而生。何为CSSlayer? CSSCascadeLayers,也叫做CSS级联层,是CascadingandInheritanceLevel5规范中新增了一个新的CSS特性。 layer声明了一个级联层,同一层内的规则将级联在一起,这给予了开发者对层叠机制的更多控制。语法也非常简单,看这样一个例子:layerutilities{创建一个名为utilities的级联层} 这样,我们就创建一个名为utilities的layer级联层。layer语法 layer规则可以通过三种方式其一来创建级联层。第一种方法如上方代码所示,它创建了一个块级的规则,其中包含作用于该层内部的CSS规则。layerutilities{。paddingsm{padding:。5rem;}。paddinglg{padding:。8rem;}} 一个级联层同样可以通过import来创建,规则存在于被引入的样式表内:import(utilities。css)layer(utilities); 你也可以创建带命名的级联层,但不指定任何样式。例如,单一的命名层:layerutilities 或者,多个命名层也可以被同时定义。例如:layertheme,layout,utilities 这一做法很有用,因为层最初被指定的顺序决定了它是否有父级层。对于声明而言,如果同一声明在多个级联层中被指定,最后一层中的将优先于其他层。 因此,在上面的例子中,如果theme层和utilities层中存在冲突的规则,那么utilities层中的将优先被应用。 即使utilities层中规则的优先级低于theme层中的,该规则仍会被应用。一旦级联层顺序建立之后,优先级和出现顺序都会被忽略。 这将使创建CSS选择器变得更加简单,因为你不需要确保每一个选择器都有足够高的优先级来覆盖其他冲突的规则,你只需要确保它们出现在一个顺序更靠后的级联层中。 注:在已经声明级联层的名字后,它们的顺序随即被确立,你可以重复声明某级联层的名字来向其添加CSS规则。这些样式将被附加到该层的末尾,且级联层之间的顺序不会改变。 其他不属于任何一级联层的样式将被集中到同一匿名层,并置于所有层的前部,这意味着任何级联层内定义的规则都将覆盖外部声明的规则。嵌套层 级联层允许嵌套,例如:layerframework{layerlayout{}} 向layout层内部的framework层附加规则,只需用。连接这两层。layerframework。layout{p{marginblock:1rem;}}匿名层 如果创建了一个级联层但并未指定名字,例如:layer{p{marginblock:1rem;}} 那么则称为创建了一个匿名层。除创建后无法向其添加规则外,该层和其他命名层功能一致。标准语法layer〔layernamelayername?{stylesheet}〕layer如何使用创建级联层 级联层可以通过多种方式声明: 1、使用layer块规则,并立即为其分配样式:layerreset{{PoorMansResetmargin:0;padding:0;}} 2、使用规则layer语句,没有指定任何样式:layerreset; 3、将import与layer关键字或layer()函数一起使用import(reset。css)layer(reset); 以上每一个都创建了一个名为的级联层reset。管理级联层 级联层会按它们声明的顺序排序。 在下面的例子中,我们建立四个级联层:reset,base,theme,和utilities。layerreset{创建级联层reset{margin:0;padding:0;}}layerbase{创建级联层base}layertheme{创建级联层theme}layerutilities{创建级联层utilities} 按照它们的声明顺序,层顺序变为:resetbasethemeutilities 重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序:layerreset{创建第一个级联层reset}layerbase{创建第二个级联层base}layertheme{创建第三个级联层theme}layerutilities{创建第四个级联层utilities}layerbase{会将样式添加至级联层base} 重新使用级联层名称时层顺序保持不变的使layer语法变得更加方便和严谨。使用它,可以预先建立图层顺序,然后将所有CSS附加到它:layerreset;创建第一个级联层resetlayerbase;创建第二个级联层baselayertheme;创建第三个级联层themelayerutilities;创建第四个级联层utilitieslayerreset{添加样式至级联层reset}layertheme{添加样式至级联层theme}layerbase{添加样式至级联层base}layertheme{添加样式至级联层theme} 当然你可以用更短的语法来声明级联层,layerreset,base,theme,utilities; 从上面可以看出,多个级联层被声明时,最后一个级联层的声明会获胜。像这样,import(reset。css)layer(reset);第一个级联层layerbase{第二个级联层forminput{fontsize:inherit;}}layertheme{第三个级联层input{fontsize:2rem;}} 按以往CSS级联来进行分析的话,forminput(多层级)的优先级会大于input,但是由于级联层所起的作用,layertheme的input会取胜。级联层嵌套 级联层支持嵌套使用,如下:layerbase{第一个级联层p{maxwidth:70ch;}}layerframework{第二个级联层layerbase{第二级联层的嵌套子级联层1p{marginblock:0。75em;}}layertheme{第二级联层的嵌套子级联层2p{color:222;}}} 在这个例子中有两个级联外层: base framework 该framework层本身也包含两层: base theme 如果要将样式附加到嵌套级联层,需要使用以下全名来引用它,layerframework{layerdefault{p{marginblock:0。75em;}}layertheme{p{color:222;}}}layerframework。theme{这些样式会被添加到layerframework层里面的theme层blockquote{color:rebeccapurple;}}media与layermedia(minwidth:30em){layerlayout{。title{fontsize:xlarge;}}}media(preferscolorscheme:dark){layertheme{。title{color:white;}}} 如果第一个media(minwidth:30em)匹配(基于视口尺寸),则layout级联层层将在图层顺序中排在第一位。如果只有media(preferscolorscheme:dark)匹配,theme则将是第一层。 如果两者匹配,则图层顺序将为layout,theme。如果没有匹配,则不定义层。