CSS新特性@layer(层叠样式表)

html-css066

CSS新特性@layer(层叠样式表),第1张

如果我们的页面上存在非常多的样式,譬如有我们开发页面的时候的自定义样式,也有引入的组件库样式。这时候样式将会非常混乱难以管理。

当我们想覆盖一些本身非我们书写的样式时候,往往不得不通过使用优先级权重更高的样式名,去覆盖那些样式。

同时,当样式优先级感到难以控制时,开发者习惯滥用 !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。如果没有匹配,则不定义层。

的确如此,因为浏览器解析CSS选择器是从右向左的,形如.class1 .class2 .class3 { /* 样式 */ } 这样的选择器(后代选择器),浏览器会先将页面中所有含class3这个类名的标签渲染一遍,然后再读取.class2,将.class2下包含.class3类名的标签渲染一遍,最后再将.class1下.class2下包含.class3类名的标签渲染一遍。这样一来浏览器渲染了三次,性能肯定比直接.class3效率低(由于渲染是毫秒级别就完成的,所以肉眼无法察觉),无疑直接单类名的效率更佳,但如果用单类名的话对类名命名的要求较高(要避免样式类名重复),而且会增加CSS文件的代码量,所以具体用单类名还是后代选择器要根据实际情况去定,如果用了后代选择器,推荐最好不要超过2层。

和第1个问题原理相同,你的后一种写法更好。

对,一般是这样的。无论是js还是css,id选择器的效率是最高的,但id选择器在页面中不能重复,这一点会影响到css代码的重用度,所以写css采用class类名的方法要更好。

加不加class要从性能和维护两个方面去考虑,例如 .class1 ul li p 和 .head .photo-title 这样的类名,前者的效率比后者低,且时间一久,你根本不知道这里这个p是干嘛的了。

1、”当用表格定位网页,当网页被打开时,只有当表格内所有元素被加载完后,表格里内容才会显示,因此,不能把所有内容放在一个表格里,这样超级影响网页打开速度“不推荐表格布局的原因不是在这里,css布局代替table布局是基于内容样式分离、标签语义、代码可读性等多方面考虑的。

2、"是否要id=1下的所有div加载完后,整个div才会显示出来?"这个我真不明白是什么意思,浏览器渲染网页先构建dom树,然后加载内容。多层div嵌套显然会影响加载速度(虽然相比请求加载资源相比微不足道),所以我们一般要避免。

3、“另外嵌套层数太多,是否会影响到被搜索引擎搜到的机率?”这个完全不会,搜索引擎在处理数据是首先要过滤标签;

4、“div被吹的很强大”这个?div+css布局和table布局一样是极端情况,是不好的。div并不强大。要根据语义用。