最近在Weekly邮件推送中查阅到这样的一条信息: Chromium团队宣布他们将随Chromium99(预计在明年3月发布)一起发布CSSCascadeLayers 会发现这条信息里面出现了一个CSS的新名词CSSCascadeLayers,出于好奇以及对新知识的渴望(说得我自己都信了,哈哈),于是查阅起CSSCascadeLayers的相关资料,试图搞懂它。 前置知识atrule规则 atrule规则,CSSConditionalRulesModuleLevel3新增的规则,是一条语句,它为CSS提供了执行或如何执行的指令,常见的atrule规则有:import,允许用户从其他样式表导入样式规则 fontface,允许我们引用自定义的字体 keyframes,声明一个动画 media,是条件CSS中的一种,其条件是一个媒体查询 supports,测试用户代理是否支持CSS属性值对 viewport,用来控制移动设备上的viewport设置CascadingandInheritanceLevel 级联(层叠)与继承经过多年的发展迭代,目前已有多个版本(CSS2。2、Level3、Level4和Level5) 何为级联(层叠)? 层叠本质就是定义了如何合并来自多个源的属性值的算法,简单来说,CSS规则的顺序很重要。当两条同级别的规则应用到一个元素的时候,写在后面的就是实际使用的规则。h1{color:red;}h1{color:blue;} 两条规则优先级相同,所以顺序在最后的生效,h1是color:blue胜出,显示蓝色。 只有CSS声明,就是属性名值对,会参与层叠计算。这表示包含CSS声明以外实体的规则不参与层叠计算,如包含描述符的fontface,规则(atrule规则)是做为一个整体参与层叠计算。 css属性一般来自于哪几个源? 1、用户代理样式表:浏览器的基本的样式表,用于给所有网页设置默认样式。 2、用户样式表:网页的作者可以定义文档的样式。大多数情况下此类型样式表会定义网站的主题。 3、浏览器的用户使用自定义样式表定制使用体验。 层叠(级联)算法如何过滤来自不同源的css规则? 相互冲突的声明按以下顺序适用,后一种声明将覆盖前一种声明: 1、用户代理样式表中的声明(浏览器的默认样式)。 2、用户样式表中的常规声明(用户设置的自定义样式,就如同我们的reset。css)。 3、作者样式表中的常规声明(开发人员设置的样式)。 4、作者样式表中的!important声明 5、用户样式表中的!important声明 过滤来自不同源的css规则后,确定同源优先级高低,决定谁优胜!important内联styleid。class标签 了解级联算法有助于帮助我们理解浏览器是如何解决样式规则冲突,也就是浏览器决定哪个样式规则运用到元素上,更多相关css级联的了解: 何为继承? 当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值。只有文档根元素取该属性定义的默认值,类似的属性有color、fontsize等。 CSS是由CascadingStyleSheets三个词的首字母缩写,很多人将其称为层叠样式表或者级联样式表。layer CSSCascadeLayers,也叫做CSS级联层,是CascadingandInheritanceLevel5规范中新增了一个新的CSS特性,对应的CSS属性写法layer,即一个新的规则,也就是大家所说的atrule规则。 为啥会出现layer? 通过上面我们对级联介绍,我们已经看到了顺序对于层叠的重要性,同权重的css属性后者会优胜前者,权重不同会根据CSS声明来源和优先级算法来判断谁优胜。!important的CSS规则自动将它跳到层叠算法的前面,能够覆盖普通规则的层叠。 也就是说我们一般会使用选择器权重和顺序作为控制级联的方法,但是这样却会时常碰到: 使用较高权重的选择器来防止你的代码被后面的代码(或别人的代码)覆盖。但这也会引起另一个不良的现象,可能会在代码中新增很多带有!important的样式规则,这本身就会引起更多的问题,比如!important在CSS样式表中随处可见,需要覆盖的时候难以被覆盖。 使用较低权重的选择器又很容易被后面的代码(或别人的代码)覆盖。比如你在引入第三方代码库或组件时,自己的代码可能被覆盖。 这两个现象也是编写CSS代码,特别是在一个大型项目或多人协作的项目中常出现。也给很多CSS开发者带来很多困扰。 虽然社区有很多第三方方案,如CSSinJS、CSSModules和CSSScoped等来协助解决级联所带来的问题,但由于源码顺序(打包产物)仍然起着决定性的作用,顺序带来的覆盖和冲突依旧未真正的解决,而且选择器权重仍然比层的顺序(源码顺序)更重要。 这样的背景促进了layer的出现,要真正的解决级联带来的这些问题。 layer的出现,也要求我们对以往css级联有个新的了解, 可以看出CSS的级联层一般位于Style属性(StyleAttribute)和CSS选择器权重(Specificity)之间。 使用CSS级联层,可以通过layeratrule将CSS分成多个层。 与CSS属性来源在用户样式表和作者样式表风格之间提供权衡的方式相同,CascadeLayers提供了一种结构化的方式来组织和权衡单个来源内的关注点 如何使用创建级联层 级联层可以通过多种方式声明: 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} 按照它们的声明顺序,层顺序变为: reset base theme utilities 重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序: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。如果没有匹配,则不定义层。结语 随着CascadeLayers的出现,我们的开发人员将拥有更多的工具来控制Cascade。CascadeLayers的真正力量来自它在Cascade中的独特位置:Style属性(StyleAttribute)和CSS选择器权重(Specificity)之间。因此,我们不需要担心其他层中使用的CSS的选择器特异性,也不需要担心我们将CSS加载到这些层中的顺序。 了解到这里,是不是觉得layer相当地cool,迫不及待地想去使用了,我们看一下caniuselayer的兼容情况, 很遗憾,支持程度惨不忍睹,想真正使用可能还要再等等,对于明年三月份Chromium99,发布我们拭目以待。 当然现在如果想尝鲜,对于社区也有给出一些办法, 大家也可以试一试,感谢阅读!