当我们想覆盖一些本身非我们书写的样式时候,往往不得不通过使用优先级权重更高的样式名,去覆盖那些样式。
同时,当样式优先级感到难以控制时,开发者习惯滥用 !important 去解决,这又循环导致了后续更混乱的样式结构。
基于让 CSS 得到更好的控制和管理的背景,CSS @layer 应运而生。
CSS Cascade Layers,也叫做CSS级联层,是Cascading and Inheritance Level5 规范中新增了一个新的 CSS 特性。
这样,我们就创建一个名为 utilities 的 @layer 级联层。
@layer规则可以通过三种方式其一来创建级联层。第一种方法如上方代码所示,它创建了一个块级的@规则,其中包含作用于该层内部的CSS规则。
一个级联层同样可以通过 @import 来创建,规则存在于被引入的样式表内:
你也可以创建带命名的级联层,但不指定任何样式。例如,单一的命名层:
或者,多个命名层也可以被同时定义。例如:
因此,在上面的例子中,如果 theme 层和 utilities 层中存在冲突的规则,那么 utilities 层中的将优先被应用。
即使 utilities 层中规则的 优先级低于 theme 层中的,该规则仍会被应用。一旦级联层顺序建立之后,优先级和出现顺序都会被忽略。
这将使创建CSS选择器变得更加简单,因为你不需要确保每一个选择器都有足够高的优先级来覆盖其他冲突的规则,你只需要确保它们出现在一个顺序更靠后的级联层中。
级联层允许嵌套,例如:
向 layout 层内部的 framework 层附加规则,只需用 . 连接这两层。
如果创建了一个级联层但并未指定名字,例如:
那么则称为创建了一个匿名层。除创建后无法向其添加规则外,该层和其他命名层功能一致。
1、使用@layer 块规则,并立即为其分配样式:
2、使用规则@layer 语句,没有指定任何样式:
3、将@import 与layer关键字或layer()函数一起使用
以上每一个都创建了一个名为 的级联层reset。
在下面的例子中,我们建立四个级联层:reset,base,theme,和utilities。
重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序:
重新使用级联层名称时层顺序保持不变的使@layer 语法变得更加方便和严谨。使用它,可以预先建立图层顺序,然后将所有 CSS 附加到它:
按以往CSS级联来进行分析的话,form input(多层级)的优先级会大于input,但是由于级联层所起的作用,@layer theme的input会取胜。
级联层支持嵌套使用,如下:
在这个例子中有两个级联外层:
base
framework
该framework层本身也包含两层:
base
theme
如果要将样式附加到嵌套级联层,需要使用以下全名来引用它,
如果第一个@media (min-width: 30em)匹配(基于视口尺寸),则layout级联层层将在图层顺序中排在第一位。如果只有@media (prefers-color-scheme: dark)匹配,theme则将是第一层。
如果两者匹配,则图层顺序将为layout, theme。如果没有匹配,则不定义层。
最近在 Weekly 邮件推送中查阅到这样的一条信息:
会发现这条信息里面出现了一个CSS的新名词 CSS Cascade Layers ,出于好奇以及对新知识的渴望(说得我自己都信了,哈哈),于是查阅起 CSS Cascade Layers 的相关资料,试图搞懂它。
at-rule 规则, CSS Conditional Rules Module Level 3 新增的规则,是一条语句,它为CSS提供了执行或如何执行的指令,常见的 at-rule 规则有:
级联(层叠)与继承 经过多年的发展迭代,目前已有多个版本( CSS2.2、Level3、Level4 和 Level5 )
何为级联(层叠)?
层叠本质就是定义了如何合并来自 多个源 的属性值的算法,简单来说,CSS规则的顺序很重要。当两条同级别的规则应用到一个元素的时候,写在后面的就是实际使用的规则。
两条规则 优先级相同 ,所以顺序在最后的生效, h1 是 color:blue '胜出',显示蓝色。
css属性一般来自于哪几个源?
层叠(级联)算法如何过滤来自不同源的css规则?
过滤来自不同源的css规则后,确定同源优先级高低,决定谁“优胜”
了解级联算法有助于帮助我们理解浏览器是如何解决样式规则冲突,也就是浏览器决定哪个样式规则运用到元素上,更多相关 css级联 的了解:
何为继承?
当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值 。只有文档根元素取该属性定义的默认值,类似的属性有 color 、 font-size 等 。
CSS是由 Cascading Style Sheets 三个词的首字母缩写,很多人将其称为 层叠样式表或者级联样式表 .
CSS Cascade Layers ,也叫做 CSS级联层 ,是 Cascading and Inheritance Level5 规范中新增了一个新的 CSS 特性,对应的CSS属性写法 @layer ,即 一个新的 @ 规则 ,也就是大家所说的 at-rule 规则。
为啥会出现@layer?
也就是说我们一般会使用选择器权重和顺序作为控制级联的方法,但是这样却会时常碰到:
使用较高权重的选择器来防止你的代码被后面的代码(或别人的代码)覆盖。但这也会引起另一个不良的现象,可能会在代码中新增很多带有 !important 的样式规则,这本身就会引起更多的问题,比如 !important 在 CSS 样式表中随处可见,需要覆盖的时候难以被覆盖 。
使用较低权重的选择器又很容易被后面的代码(或别人的代码)覆盖。比如你在引入第三方代码库或组件时,自己的代码可能被覆盖。
这两个现象也是编写CSS代码,特别是在一个大型项目或多人协作的项目中常出现。也给很多CSS开发者带来很多困扰。
虽然社区有很多第三方方案,如 CSS-in-JS 、 CSS Modules 和 CSS Scoped 等来协助解决级联所带来的问题,但由于 源码顺序(打包产物)仍然起着决定性的作用,顺序带来的覆盖和冲突依旧未真正的解决,而且选择器权重仍然比层的顺序(源码顺序)更重要 。
这样的背景促进了 @layer 的出现,要真正的解决级联带来的这些问题。
@layer 的出现,也要求我们对以往 css级联 有个新的了解,
可以看出 CSS的级联层 一般位于“Style 属性”(Style Attribute)和 CSS 选择器权重(Specificity)之间。
使用 CSS级联层 ,可以通过 @layer at-rule将 CSS 分成多个层。
1、使用@layer 块规则,并立即为其分配样式:
2、使用规则@layer 语句,没有指定任何样式:
3、将@import 与layer关键字或layer()函数一起使用
以上每一个都创建了一个名为 的级联层reset。
在下面的例子中,我们建立四个级联层: reset,base,theme,和utilities 。
重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序:
重新使用级联层名称时层顺序保持不变的使@layer 语法变得更加方便和严谨。使用它,可以预先建立图层顺序,然后将所有 CSS 附加到它:
按以往CSS级联来进行分析的话, form input (多层级)的优先级会大于 input ,但是由于 级联层 所起的作用, @layer theme 的 input 会取胜。
级联层 支持嵌套使用,如下:
在这个例子中有两个级联外层:
就像一棵树,像这样,
如果要将样式附加到嵌套级联层,需要使用以下全名来引用它,
如果第一个 @media (min-width: 30em) 匹配(基于视口尺寸),则layout级联层层将在图层顺序中排在第一位。如果只有 @media (prefers-color-scheme: dark) 匹配,theme则将是第一层。
如果两者匹配,则图层顺序将为layout, theme。如果没有匹配,则不定义层。
随着 Cascade Layers 的出现,我们的开发人员将拥有更多的工具来控制 Cascade 。 Cascade Layers 的真正力量来自它在 Cascade 中的独特位置: Style 属性(Style Attribute) 和 CSS 选择器权重(Specificity) 之间。因此,我们不需要担心其他层中使用的 CSS 的选择器特异性,也不需要担心我们将 CSS 加载到这些层中的顺序.
了解到这里,是不是觉得 @layer 相当地cool,迫不及待地想去使用了,我们看一下 caniuse @layer 的兼容情况,
很遗憾,支持程度惨不忍睹,想真正使用可能还要再等等,对于明年三月份 Chromium 99 ,发布我们拭目以待。
当然现在如果想尝鲜,对于社区也有给出一些办法,
大家也可以试一试,感谢阅读!
前者是流动布局,即自然布局,
就类似从左至右,
从上至下那样,
后者是层布局,
层布局是脱离流布局不受流布局影响,
能够实现自由的位置布局,
不过也有其起身的局限性,
详细的你去查下资料