层叠样式表 CSS新特性@layer

过往 css 优先级中存在的问题如果我们的页面上存在非常多的样式,譬如有我们开发页面的时候的自定义样式,也有引入的组件库样式 。这时候样式将会非常混乱难以管理 。
当我们想覆盖一些本身非我们书写的样式时候,往往不得不通过使用优先级权重更高的样式名,去覆盖那些样式 。
同时,当样式优先级感到难以控制时,开发者习惯滥用 !important 去解决,这又循环导致了后续更混乱的样式结构 。
基于让 CSS 得到更好的控制和管理的背景,CSS @layer 应运而生 。
何为 CSS @layer?CSS Cascade Layers,也叫做CSS级联层,是Cascading and Inheritance Level5 规范中新增了一个新的 CSS 特性 。
@layer声明了一个 级联层,同一层内的规则将级联在一起,这给予了开发者对层叠机制的更多控制 。语法也非常简单,看这样一个例子:
@layer utilities {/* 创建一个名为 utilities 的级联层 */}这样,我们就创建一个名为 utilities 的 @layer 级联层 。
@layer语法@layer规则可以通过三种方式其一来创建级联层 。第一种方法如上方代码所示,它创建了一个块级的@规则,其中包含作用于该层内部的CSS规则 。
@layer utilities {.padding-sm {padding: .5rem;}.padding-lg {padding: .8rem;}}一个级联层同样可以通过 @import 来创建,规则存在于被引入的样式表内:
@import(utilities.css) layer(utilities);你也可以创建带命名的级联层,但不指定任何样式 。例如,单一的命名层:
@layer utilities或者,多个命名层也可以被同时定义 。例如:
@layer theme, layout, utilities这一做法很有用,因为层最初被指定的顺序决定了它是否有父级层 。对于声明而言,如果同一声明在多个级联层中被指定,最后一层中的将优先于其他层 。
因此,在上面的例子中,如果 theme 层和 utilities 层中存在冲突的规则,那么 utilities 层中的将优先被应用 。
即使 utilities 层中规则的 优先级低于 theme 层中的,该规则仍会被应用 。一旦级联层顺序建立之后,优先级和出现顺序都会被忽略 。
这将使创建CSS选择器变得更加简单,因为你不需要确保每一个选择器都有足够高的优先级来覆盖其他冲突的规则,你只需要确保它们出现在一个顺序更靠后的级联层中 。
注:在已经声明级联层的名字后,它们的顺序随即被确立,你可以重复声明某级联层的名字来向其添加CSS规则 。这些样式将被附加到该层的末尾,且级联层之间的顺序不会改变 。
其他不属于任何一级联层的样式将被集中到同一匿名层,并置于所有层的前部,这意味着任何级联层内定义的规则都将覆盖外部声明的规则 。
嵌套层级联层允许嵌套,例如:
@layer framework {@layer layout {}}向 layout 层内部的 framework 层附加规则,只需用 . 连接这两层 。
@layer framework.layout {p {margin-block: 1rem;}}匿名层如果创建了一个级联层但并未指定名字,例如:
@layer {p {margin-block: 1rem;}}那么则称为创建了一个匿名层 。除创建后无法向其添加规则外,该层和其他命名层功能一致 。
标准语法@layer [ <layer-name># | <layer-name>?{<stylesheet>} ]@layer如何使用创建级联层级联层可以通过多种方式声明:
1、使用@layer 块规则,并立即为其分配样式:
@layer reset {* { /* Poor Man's Reset */margin: 0;padding: 0;}}2、使用规则@layer 语句,没有指定任何样式:
@layer reset;3、将@import 与layer关键字或layer()函数一起使用
【层叠样式表 CSS新特性@layer】@import(reset.css) layer(reset);以上每一个都创建了一个名为 的级联层reset 。
管理级联层级联层会按它们声明的顺序排序 。
在下面的例子中,我们建立四个级联层:reset,base,theme,和utilities 。
@layer reset { /* 创建级联层 “reset” */* {margin: 0;padding: 0;}}@layer base { /* 创建级联层 “base” */…}@layer theme { /* 创建级联层 “theme” */…}@layer utilities { /* 创建级联层 “utilities” */…}按照它们的声明顺序,层顺序变为:
resetbasethemeutilities重复使用级联层名称时,样式将附加到现有级联层 。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序:
@layer reset { /* 创建第一个级联层 “reset” */…}@layer base { /* 创建第二个级联层 “base” */…}@layer theme { /* 创建第三个级联层 “theme” */…}@layer utilities { /* 创建第四个级联层 “utilities” */…}@layer base { /* 会将样式添加至级联层“base” */…}


推荐阅读