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如何使用创建级联层
级联层可以通过多种方式声明:
1、使用@layer 块规则,并立即为其分配样式: @layer reset { * { /* Poor Man"s Reset */ margin: 0; padding: 0; } }
2、使用规则@layer 语句,没有指定任何样式: @layer reset;
3、将@import 与layer关键字或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" */ … }
按照它们的声明顺序,层顺序变为: reset base theme utilities
重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序: @layer reset { /* 创建第一个级联层 "reset" */ … } @layer base { /* 创建第二个级联层 "base" */ … } @layer theme { /* 创建第三个级联层 "theme" */ … } @layer utilities { /* 创建第四个级联层 "utilities" */ … } @layer base { /* 会将样式添加至级联层"base" */ … }
重新使用级联层名称时层顺序保持不变的使@layer 语法变得更加方便和严谨。使用它,可以预先建立图层顺序,然后将所有 CSS 附加到它: @layer reset; /* 创建第一个级联层 "reset" */ @layer base; /* 创建第二个级联层 "base" */ @layer theme; /* 创建第三个级联层"theme" */ @layer utilities; /* 创建第四个级联层 "utilities" */ @layer reset { /* 添加样式至级联层 "reset" */ … } @layer theme { /* 添加样式至级联层 "theme" */ … } @layer base { /* 添加样式至级联层 "base" */ … } @layer theme { /* 添加样式至级联层 "theme" */ … }
当然你可以用更短的语法来声明级联层, @layer reset, base, theme, utilities;
从上面可以看出,多个级联层被声明时,最后一个级联层的声明会获胜。像这样, @import(reset.css) layer(reset); /* 第一个级联层 */ @layer base { /* 第二个级联层 */ form input { font-size: inherit; } } @layer theme { /*第三个级联层 */ input { font-size: 2rem; } }
按以往CSS级联来进行分析的话,form input(多层级)的优先级会大于input,但是由于级联层所起的作用,@layer theme的input会取胜。 级联层嵌套
级联层支持嵌套使用,如下: @layer base { /* 第一个级联层*/ p { max-width: 70ch; } } @layer framework { /* 第二个级联层 */ @layer base { /* 第二级联层的嵌套子级联层1 */ p { margin-block: 0.75em; } } @layer theme { /* 第二级联层的嵌套子级联层2 */ p { color: #222; } } }
在这个例子中有两个级联外层:
base
framework
该framework层本身也包含两层:
base
theme
如果要将样式附加到嵌套级联层,需要使用以下全名来引用它, @layer framework { @layer default { p { margin-block: 0.75em; } } @layer theme { p { color: #222; } } } @layer framework.theme { /* 这些样式会被添加到@layer framework层里面的theme层 */ blockquote { color: rebeccapurple; } }@media与@layer@media (min-width: 30em) { @layer layout { .title { font-size: x-large; } } } @media (prefers-color-scheme: dark) { @layer theme { .title { color: white; } } }
如果第一个@media (min-width: 30em)匹配(基于视口尺寸),则layout级联层层将在图层顺序中排在第一位。如果只有@media (prefers-color-scheme: dark)匹配,theme则将是第一层。
如果两者匹配,则图层顺序将为layout, theme。如果没有匹配,则不定义层。
一辈子都不换电话号码的是什么人?这种好多年不换电话号码的人有个有很多吧!我就是其中一个,我的号码是2010年来温州的时候买的,快十年了,对于一辈子不换号码的有一下几点一是这个号码用的久了绑定了支付宝,微信,可能还
对于RTX3050我的看法RTX3050是最新推出的新一代光追显卡,目前没有下发到桌面端,仅仅是用在了笔记本上。对于RTX3050有的人说RTX2060都是720p光追,这玩意是要480P光追吗?(光追一种
联想又被怼上了热搜,曾经的联想你还好吗?最近联想又被怼上了热搜,本来我这个PM只顾一旁吃瓜看戏就好,但是作为一名曾经的联想的忠实用户来说,真是百感交集。曾几何时联想可是我们国人引以为傲的国际知名企业,当年收购IBMPC业
国内首个自动驾驶商业化试点在京开启北京市高级别自动驾驶示范区工作办公室25日公布北京正式开放国内首个自动驾驶出行服务商业化试点,百度和小马智行成为首批获许开展商业化试点服务的企业。这标志着国内自动驾驶领域从测试示范
今日头条上主要聚集了哪个文化层次的人们?我也是在头条上创作了三个月了,我的文化程度是大学本科。年龄五十岁。那时候的大学本科还是不多的。我高考时的作文是45分(满分50)。我对自己的评价是中等文化程度。我现在的粉丝有一千多
对于司马南质疑联想问题。你们觉得有道理吗?司马南质疑联想的问题是在摆事实,是依据依理的无可辩驳的,联想都不敢正面回应!联想事件发展至今,主要是由于联想一系列骚操作造成的,致其处于当前舆论的风口浪尖!水能载舟亦能覆舟,当初国
万能的头条,哪里还能有免费下载歌曲?我有一个软件,大部分歌曲都可以。不要妄想白嫖呲牙自己唱大笑大笑大笑大笑大笑大笑告诉你,网站就废了头条能够收索到的音乐都能够下载的啊,只是相比较于要麻烦一点!酷我有破解版自己找找下载
苏宁易购家乐福三大门店三大升级苏宁易购全面聚焦用户体验,专注智慧零售,在为消费者提供优质商品的同时,将持续打造安全便捷的购物环境,致力带给消费者极致的消费体验。家电入住超市,一站式的购物流程虽为消费者带来了便捷
关不掉的App弹窗广告很多人都有类似的经历打开某款手机App,弹窗广告迅速弹出铺满屏幕,由于软件设置而无从关闭有些弹窗显示网络故障,点击后却跳转至广告页面在有的电商App上浏览过某种商品,进入其他App
三星降价1700元,12256GB1亿像素,比华为Mate40pro值国内手机市场竞争激烈,各大手机厂商都在推出新款机型,而全球市场销量冠军三星在国内市场依然是不温不火,并不是手机质量不给力,是国内消费者的认知度发生了改变,三星旗舰机无奈降价来促进销
2022年3月1日起微信支付宝新规定来了2022年3月1日起,禁止部分人使用微信或支付宝二维码,最新发布从明年3月1日起从事营利性质的而且没有营业执照的商户全面禁止使用微信跟支付宝的二维码,如果小商小户想要想要继续使用,