步入2022年,CSS的新特性层出不穷,而最近最受CSS圈关注的新特性非CSS@layer莫属。本文将用最简洁的语言,让读者快速了解什么是新的CSS@layer规范。以前CSS优先级的问题如果我们的页面有很多样式,比如我们开发页面时自定义的样式,导入的组件库样式等。这时候风格会很乱,不好打理。当我们想要覆盖一些不是我们自己写的样式时,我们往往不得不使用具有更高优先级权重的样式名称来覆盖这些样式。同时,当样式优先级感觉不可控时,开发者习惯于滥用!important来解决,这反过来又导致日后样式结构更加混乱。CSS@layer诞生于让CSS能够更好地被控制和管理的背景下。什么是CSS@layer?CSS@layer由CSSCascadingandInheritanceLevel5[1]的规范定义。什么是CSS@layer?简单的说,CSS[2]中的@layer@rule[3]声明了一个层叠层,同一层中的规则会被层叠在一起,让开发者对层叠机制有更多的控制权。语法也很简单,看这个例子:@layerutilities{/*Createacascadelayernamedutilities*/}这样,我们创建了一个名为@layerutilities的级联层。如何使用@layer层叠层?通过@layer级联层管理样式优先级@layer级联层最大的作用就是控制不同样式之间的优先级。看下面的例子,我们定义了两个@layer级联层A和B:
div{width:200px;高度:200px;}@layerA{div{背景:蓝色;}}@layerB{div{背景:绿色;}}因为@layerB的顺序在@layerA之后,所以@layerB中的所有样式都会比@layerA有更高的优先级,最终的div颜色会是绿色:当然,如果@layer太多的话在页面中,可能不容易记住所有@layers的顺序,所以有另一种写法。我们可以同时命名多个@layer层,然后在其中补充样式规则。@layerB,C,A;div{width:200px;高度:200px;}@layerA{div{背景:蓝色;}}@layerB{div{背景:绿色;}}@layerC{div{背景:橙色;}}在上面的代码中,我们首先定义了@layerB、C、A三个@layer级联层。然后在下面的CSS代码中补充每个级联层的CSS代码,但是样式的优先级是:A>C>B。因此,最终的div的颜色值为@layerA中定义的颜色,即蓝色:这里可以很明显的看出CSS@layer的作用。使用CSS@layer,我们可以将不同的CSS模块划分到不同的@layers中,利用顺序可以很好的控制全局样式的优先级。介绍@layer级联层定义的三种方式上面其实提到了介绍@layer级联层定义的两种方式。这里我们再描述一下。CSS@layer层叠层的引入方式一共有3种。直接创建块级的@layer规则,其中包含作用于图层的CSS规则:@layerutilities{p{padding:.5rem;}}可以通过@import[4]创建级联层,规则存在于导入的样式表中:@import(utilities.css)layer(utilities);创建命名层叠层,但不指定任何样式。然后可以在CSS中的任何位置添加样式:@layerutilities;//...//...@layerutilities{p{color:red;}}非@layer包裹层和@layer样式优先级当然,这里还会有另外一种情况,不被@layer包裹的样式优先级与被@layer包裹的样式相比如何?看这样一个例子:@layerA{a{color:red;}}@layerB{a{颜色:橙色;}}@layerC{a{颜色:黄色;}}a{颜色:绿色;}/*没有被@layer包裹的样式*/这里会有一个很重要的结论,就是没有被@layer包裹的样式比被@layer包裹的样式有更高的优先级。因此,上述规则的顺序是:未被@layer包裹的样式>@layerC>@layerB>@layerA。匿名层和嵌套层之间有两种层级关系,分别是匿名层和嵌套层层。匿名层允许创建没有名称的@layer:@layer{p{margin:1rem;}}这里创建了一个匿名层。匿名层的两个重要属性:创建后不能向其添加规则。该层与其他命名层具有相同的功能,优先级也遵循后面定义的匿名层,比其他定义的@layer层具有更高的优先级。看一个例子:div{width:200px;高度:200px;}@layer{div{背景:粉色;}}@layerB,C,A;@layerA{div{背景:蓝色;}}@layerB{div{背景:绿色;}}@layerC{div{背景:橙色;}}在上面的代码中,我们首先定义了一个匿名层,指定div的颜色为粉色,然后定义了@layerB、C、A。这里的优先级顺序是:A>C>B>匿名层。最终的颜色是@layerA中的颜色值——蓝色:如果我们把匿名层放在最后:div{width:200px;height:200px;}@layerB,C,A;@layerA{div{背景:蓝色;}}@layerB{div{背景:绿色;}}@layerC{div{背景:橙色;}}@layer{div{背景:粉色;}}此时,样式的优先级顺序为:匿名层>A>C>B。最终的颜色就是匿名层中的颜色值——粉色:嵌套层说完匿名层,我们来看再次嵌套层。顾名思义,嵌套层就是在@layer内部,我们可以嵌套使用@layer级联层。像这样:@layerA{@layerB{...}}当然,它还有另外一种语法,上面的代码相当于:@layerA.B{...}理解了这个之后,那么,看这样一个例子:div{宽度:200px;高度:200px;}@layerA{div{背景:蓝色;}@layerB{div{背景:红色;我们在@layerA中嵌套了一个@layerB,同时定义了一个div样式。最终div的背景颜色是什么?终于是蓝色背景了:蓝色,为什么?这是一个很好的记忆,我们假设如果没有@layerA这一层的封装,其实就是上面说的@layer层和非@layer层的优先级比较。这里,非@layer层(我们可以理解为@layer的上一层)有更高的优先级。因此,对于单个@layer中的嵌套关??系,样式优先级为:@layerA>@layerA.B.多个嵌套层的优先级关系是可以的,我们来看这种情况:div{width:200px;高度:200px;}@layerA{div{背景:蓝色;}@layerB{div{背景:红色;}}}@layerC{div{背景:黄色;}@layerD{div{背景:绿色;}}}同时嵌套了多个@layers。那么这种情况下优先级是怎么划分的呢?这里的规则是,优先级高的@layer,无论是否嵌套,都比优先级低的@layer(无论是否嵌套)具有更高的优先级。所以这里的优先顺序是:@layerC>@layerC.D>@layerA>@layerA.B。!important对CSS@layer的影响我们来看看!important对CSS@layer的影响。这里可以分为几种情况,先看其中一种:div{width:200px;高度:200px;背景:黑色;}@layerA{div{背景:蓝色;}@layerB{div{背景:红色;}}}@layerC{div{背景:黄色;}@layerD{div{背景:绿色!重要;}}}上面的代码,我们在@layer的中添加了C.D一条!important规则。如果不考虑!important规则,实际的CSS优先级是(序列号越高,优先级越高):@layerA.B.@layerA.@layerC.D.@layerC.非层包裹块。然后,
的颜色应该是黑色。但是,这里在@layerC.D的
中添加了一个!important规则。其实最后的
的颜色是绿色的,也就是最后的优先级是(序号越高优先级越高):@layerA.@layerA.B.@layerC.非层包裹块。@layerC.D在!important下。也就是说,!important规则的优先级仍然高于非!important规则。上面的DEMO还是挺有意思的。有兴趣的可以看看:CodePenDemo--CSSCascade@layerDemo[5]。非@layer包含块!important与@layer包含块!important对比在这一点上,你可能认为你明白了。好吧,让我们再看一个DEMO。如果我们向非@layer包含块添加!important规则,事情就会变得有趣。div{宽度:200px;高度:200px;背景:黑色!重要;}@layerA{div{背景:蓝色;}@layerB{div{背景:红色;}}}@layerC{div{背景:黄色;}@layerD{div{背景:绿色!重要;仔细看上面的代码,我们还为非@layer包含块添加了一个!important规则,正如我上面描述的那样,从规则的角度来看,非@layer包含块的优先级高于它@layer包含块。通常我们不难猜到,background:black!important的优先级应该高于background:green!important,最后
应该出现黑色。实际上,这里最后的
的颜色还是绿色的。这里还有一个很有意思的知识点,!important下样式优先级的规则和非!important下的正常状态正好相反。这是一个非常重要的特性,在比较普通(非!重要)规则时,级联越多(@layer规则越靠后),优先级越低;反之,在比较!important规则时,Linked越靠后的layer(@layer规则排序越靠后),优先级越高。这个,要想更进一步,我们需要了解CSSCascading相关知识。CSSCascade规范在CSS@layer之前,我们简单看一张图:上图展示了CSS样式声明在CSS@layer之前的优先级顺序,按照CSSCascading4(CurrentWork)[6]标准,defined当前规范下声明的级联顺序的优先级如下(优先级越低,优先级越高,以下规则按升序排列):普通用户代理声明。普通用户声明。正常的作者声明。动画声明。重要的作者声明。重要的用户声明。重要的用户代理声明。过渡声明。根据上面的算法,可以得到一种样式优先级排序,大致是这样的(优先级越低,优先级越高,以下规则按升序排列):UserAgent-UserAgent常用样式。用户-用户设置的普通样式。作者-页面作者的一般风格。动画-动画样式。??Author-页面作者!重要的风格。??用户-!用户设置的重要样式。??UserAgent-!UserAgent的重要样式。过渡-过渡样式。简单解释一下:UserAgentStyles:浏览器都会有一个基本的样式表来设置任何网页的默认样式。这些样式统称为UserAgentStylesPageAuthorStyles:网页的作者可以定义文档的样式,其中最常见的是样式表。大多数情况下,这类样式表会定义多个,构成网站的视觉和体验,即页面主题,可以理解为页面作者风格用户风格:读者,作为浏览器用户,可以使用自定义样式表来自定义和使用Experience,自定义用户偏好,可以理解为用户样式。关于CSSCascading,也就是层叠规范,可以看我的这篇文章加深理解——深入理解CSS中的层叠(CascadingStyleSheets)[7]。有了CSS@layer,更新了级联优先级顺序,具体优先级如下:整体会更复杂,但总体还是遵循两条规则:!important样式高于非!important样式。在比较!important规则时,优先顺序与普通规则相反,普通状态下优先级越低,!important状态下优先级越高。综上所述,就是关于CSS@layer的基础知识了。CSS@layer的诞生让我们能够更好的划分页面的样式层级,更好的处理内部样式和外部引用样式的优先顺序,是一个重大的创新。同时也让我们意识到应该逐渐摒弃使用!important来大规模覆盖样式优先级的错误做法,避免优先级问题带来的很多不必要的副作用。当然,截止到今天(2022-03-14),让我们来看看兼容性:虽然已经大红大紫,但最新版本的Chrome、Safari、Firefox、Edge都已经开始支持CSS@layer,并且,目前已经可以通过一些polyfill来初步使用,相信在不久的将来,它会成为业务CSS代码中不可或缺的一部分。最后,本文到此结束,希望对大家有所帮助!参考[1]CSSCascadingandInheritanceLevel5:https://www.w3.org/TR/css-cascade-5/#at-layer。[2]CSS:https://developer.mozilla.org/en-US/docs/Web/CSS。[3]@规则:https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule。[4]@import:https://developer.mozilla.org/zh-CN/docs/Web/CSS/@import。[5]CodePen演示——CSSCascade@layer演示:https://codepen.io/Chokcoco/pen/KKZKBRr。[6]CSS级联4(当前工作):https://drafts.c??sswg.org/css-cascade-4/#cascading。[7]深入理解CSS中的层叠(CascadingStyleSheets):https://github.com/chokcoco/iCSS/issues/76。
最新推荐
猜你喜欢
- 1盘点最值得关注的新款智能手表
- 2本周家电新闻!智能电视技术与体验双升级,AI电视受关注
- 3《我不是药神》引爆诊疗话题,智慧医疗引关注
- 4外媒关注金砖峰会!人工智能是第四次工业革命新引擎,中国企业成
- 5星变里频频受到外媒关注,其创新模式打造了便利店新标杆
- 62017年,英特尔仍将重点关注VR-MR等热门领域
- 7VR是谷歌开发者大会的焦点,不要只关注 Android,
- 8亮相上海科博会,星变力“星变+”智能柜备受关注
- 910月份中国智能手环市场分析!华为荣耀手环Zero最受关注
- 102018年最受欢迎的四款科技数码产品
- 11最受瞩目的电竞ROG游戏手机国内发布倒计时
- 122016亚洲消费电子展(CES Asia)会议亮点预览 可穿
- 13新品牌抵达终端!云媒体云仓储智能供应链系统受关注
- 14苏宁818母婴超级品类日,好孩子安全座椅最受欢迎
- 15关注超龄家电、智能家居,陪伴你更长久
- 16互联网创业方向!不要只关注强技术和弱人工智能,也有好生意
- 17小米智能荣获麒麟杯TOP10最受欢迎商用机器人
- 18重点关注两场比赛!谷歌眼镜成为采访“神器”
- 19极客智能家居! 2022年智慧城市相关投资将达到1580亿美
- 202015年最值得关注的7款虚拟现实头显