CSS“叠叠乐”——WEB开发系列16

在现代前端开发中,CSS 是控制网页外观和布局的核心工具。随着项目的复杂化和样式规则的增加,CSS 层叠(cascade)变得更加重要。为了更好地管理和控制样式规则的应用,CSS 引入了层叠层(cascade layers)的概念。

 

262575065af3bcd4db122cb0e83fa1ac.jpeg


层叠层

CSS 层叠层(cascade layers)是CSS层叠算法的新机制,允许开发者更精确地控制样式规则的优先级。这些层为不同来源的样式声明提供了分离的上下文,使我们能够在处理多个样式表时,更好地管理它们的优先权。

与传统的优先权规则(如特异性和来源顺序)不同,层叠层为样式规则的应用引入了新的维度。通过层叠层,开发者可以定义哪些层优先于其他层,从而更好地控制样式的层叠顺序。

示例:

/* Global styles */
@layer reset {
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
}

/* Base styles */
@layer base {
    body {
        font-family: Arial, sans-serif;
    }
}

/* Component styles */
@layer components {
    .btn {
        padding: 10px 20px;
        background-color: blue;
        color: white;
        border-radius: 5px;
    }
}

/* Override styles */
@layer overrides {
    .btn {
        background-color: red; /* This will take precedence */
    }
}

在以上代码中,四个层分别定义了不同的样式规则。​​overrides​​ 层中的 ​​.btn​​ 样式将优先于 ​​components​​​ 层中的相同样式声明。


层叠层的优先权顺序

层叠层的优先权顺序是基于层的声明顺序来决定的。默认情况下,后声明的层具有更高的优先权。因此,在多个层中定义相同选择器时,最后一个层中的样式将生效。

示例:

@layer reset, base, components, overrides; /* 设置层的顺序 */

/* Component styles */
@layer components {
    .header {
        background-color: yellow;
    }
}

/* Override styles */
@layer overrides {
    .header {
        background-color: green; /* 由于 overrides 层在 components 层之后声明,此样式生效 */
    }
}

在以上代码中,虽然 ​​.header​​ 在两个层中都被定义了背景颜色,但由于 ​​overrides​​ 层具有更高的优先权,最终 ​​.header​​​ 的背景颜色将是绿色。


层叠层可以解决的问题

在开发大型项目时,通常会遇到样式冲突和管理难题。例如,当多个开发者参与项目时,维护不同的样式表可能会导致不可预测的样式覆盖问题。层叠层能够帮助解决以下问题:

  1. 样式冲突:通过将不同来源的样式放置在不同的层中,可以有效减少样式冲突。
  2. 样式管理:层叠层使得样式优先权变得更加清晰和可控。
  3. 模块化:通过将样式分层,可以更轻松地管理不同模块的样式规则。

示例:

/* Reset styles */
@layer reset {
    * {
        margin: 0;
        padding: 0;
    }
}

/* Theme styles */
@layer theme {
    body {
        color: #333;
        background-color: #f4f4f4;
    }
}

/* Custom user styles */
@layer custom {
    body {
        background-color: #000;
        color: #fff; /* 覆盖 theme 层中的样式 */
    }
}

在这个例子中,​​custom​​ 层中的样式可以覆盖 ​​theme​​​ 层中的样式,从而实现用户定制样式的功能。


嵌套层叠层可以解决的问题

除了基本的层叠层,CSS 还支持嵌套层叠层。嵌套层叠层允许开发者将层叠层组织成层次结构,从而进一步细化样式规则的应用顺序。这在处理复杂的样式系统时尤其有用,例如在组件库中不同的主题或样式变体之间切换时。

示例:

@layer framework {
    @layer reset, components;

    @layer reset {
        * {
            margin: 0;
            padding: 0;
        }
    }

    @layer components {
        .btn {
            padding: 8px 16px;
            background-color: blue;
        }
    }
}

@layer theme {
    @layer light, dark;

    @layer light {
        body {
            background-color: #fff;
            color: #000;
        }
    }

    @layer dark {
        body {
            background-color: #000;
            color: #fff;
        }
    }
}

在这个示例中,我们创建了两个顶层 ​​framework​​ 和 ​​theme​​​,并在它们内部嵌套了子层。这样可以有效地管理样式的优先级,并根据需求灵活切换不同的样式设置。


创建层叠层

在CSS中创建层叠层非常简单。你可以使用 ​​@layer​​ 规则为样式声明指定一个具名层,也可以在样式规则中直接使用匿名层。

示例:

@layer reset {
    /* 这是一个具名层,名为 reset */
    h1 {
        font-size: 2rem;
    }
}

@layer {
    /* 这是一个匿名层 */
    p {
        font-size: 1rem;
    }
}

具名层和匿名层都可以用于控制样式的层叠顺序,但具名层更适合在大型项目中使用,因为它们可以更清晰地表达不同样式块的用途和优先级。


使用 ​​@layer​​ 声明具名层

​@layer​​ 规则用于声明具名层,并可以在不同的样式表或样式块中引用这些层。通过指定具名层,你可以更好地组织和管理样式规则。

示例:

@layer typography {
    body {
        font-family: 'Helvetica Neue', sans-serif;
    }
}

@layer layout {
    .container {
        max-width: 1200px;
        margin: 0 auto;
    }
}

在这个示例中,我们创建了两个具名层 ​​typography​​​ 和 ​​layout​​,用于分别管理字体和布局相关的样式。


使用 ​​@layer​​ 块声明具名层和匿名层

​@layer​​ 块可以包含具名层和匿名层,允许你在一个块内定义多个层,从而更好地组织样式规则。

示例:

@layer {
    @layer reset, base, components;

    @layer reset {
        * {
            margin: 0;
            padding: 0;
        }
    }

    @layer base {
        body {
            font-family: Arial, sans-serif;
        }
    }

    @layer components {
        .btn {
            padding: 10px 20px;
            background-color: blue;
            color: white;
        }
    }
}

在这个示例中,用 ​​@layer​​​ 块定义了三个具名层,并在每个层中定义了不同的样式规则。


使用 ​​@import​​ 将样式表导入具名层和匿名层

你还可以使用 ​​@import​​ 规则将外部样式表导入到特定的层中,从而实现样式的模块化和复用。

示例:

@layer utilities {
    @import url('utilities.css');
}

@layer overrides {
    @import url('overrides.css');
}

在这个示例中,将两个外部样式表分别导入到了 ​​utilities​​ 和 ​​overrides​​​ 层,从而使得这些样式表中的规则按指定的层叠顺序应用。


嵌套层的概述与优点

嵌套层(nested layers)允许开发者在层中定义子层,从而进一步细化样式的层叠顺序。嵌套层的主要优点包括:

  1. 更好的组织结构:通过嵌套层,可以更清晰地表达不同样式块之间的关系。
  2. 灵活的样式管理:嵌套层可以根据需求调整优先级,从而实现更灵活的样式管理。

创建嵌套层叠层

创建嵌套层叠层非常简单,只需在一个层中定义其他层即可。

示例:

@layer theme {
    @layer light, dark;

    @layer light {
        body {
            background-color: #fff;
            color: #000;
        }
    }

    @layer dark {
        body {
            background-color: #000;
            color: #fff;
        }
    }
}

在这个示例中,在 ​​theme​​ 层中定义了 ​​light​​ 和 ​​dark​​​ 子层,从而可以根据不同的主题切换样式。


常规层叠层与嵌套层叠层的优先权顺序

常规层叠层的优先权顺序是基于层的声明顺序来决定的,即后声明的层优先级更高。而嵌套层叠层的优先权顺序则是基于其父层的顺序,在父层内部,子层之间的顺序依然起决定作用。

示例:

@layer framework {
    @layer reset, components;

    @layer reset {
        * {
            margin: 0;
        }
    }

    @layer components {
        .btn {
            padding: 8px 16px;
            background-color: blue;
        }
    }
}

@layer theme {
    @layer light, dark;

    @layer light {
        body {
            background-color: #fff;
        }
    }

    @layer dark {
        body {
            background-color: #000;
        }
    }
}

在这个示例中,​​theme​​ 层中的子层优先权顺序依赖于 ​​theme​​ 层的声明位置,而 ​​framework​​ 层中的子层优先级则取决于它们在 ​​framework​​​ 层中的顺序。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/871884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt入门学什么?

Qt是一个跨平台的C图形用户界面应用程序框架,它为应用程序开发者提供建立图形界面所需的所有功能。Qt框架以其面向对象、易于扩展的特性而受到广泛欢迎,并且支持多种平台,包括桌面、嵌入式和移动平台 。 对于Qt的入门学习,可以通过…

前端3d动画-----平移 transform: translate3d()

必须加这个属性&#xff1a;transform-style: preserve-3d; perspective: 900px; 设置了景深才能感到近大远小的感觉 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

ESP32 分区表介绍

前言 个人邮箱&#xff1a;zhangyixu02gmail.com关于分区表&#xff0c;很多人看了很多资料很可能依旧是一脸懵逼。不知道各位有没有玩过 EEPROM&#xff0c;他可以断电保存数据。这里你也可以理解为分区表将 Flash 中划分出来了一个 EEPROM。虽然这样说从专业的角度是毫无疑问…

对于llama3.1 8B模型,FP32和BF16混合精度训练,用的是AdamW优化器,模型训练时占用显存分析

目录 为什么先不考虑激活值的显存占用 1. 模型参数 含义 计算 2. 梯度参数 含义 3. 优化器参数 含义 4. 较固定总显存占用 计算 详细解释 5. 激活值计算&#xff1a; 计算公式 插入数值 计算步骤 结论 显存主要被用在四个模块上&#xff1a; 模型权重本身 梯度…

C语言基础(十一)

1、指针&#xff1a; C语言中的指针是一种非常重要的数据类型&#xff0c;可以直接访问和操作内存地址。指针存储变量的内存地址&#xff0c;而不是变量的值本身。通过使用指针&#xff0c;可以灵活地控制数据的存储和访问&#xff0c;实现复杂的数据结构如链表、树。 定义指…

Redis (day 3)

一、通过jedis连接数据库 1.首先导入依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.0</version></de…

Mac系统安装Homebrew【已成功】

1、正常安装失败原因 1.1命令行安装失败 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 原因 没挂&#x1fa9c;&#xff0c;不过我挂了梯子安装很多次也还是失败&#xff0c;所以可能是网站原因 1.2、网…

MyBatis进阶-1-面向接口编程

通过 MyBatis 底层自动创建接口实现类&#xff0c;我们可以直接对接口的方法进行编程 若简单的 sql 语句可以使用注解的方式进行&#xff0c;复杂的查询建议使用 xml 文件编写语句 注解使用时直接在接口的方法上加上对应语句的注解即可&#xff0c;而使用 xml 需要在文件中的…

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录 全面掌握&#xff1a;JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…

Jenkins汉化配置详解

Window安装构建神器Jenkins Window安装构建神器Jenkins详细教程-CSDN博客DevOps&#xff0c;CI&#xff0c;CD&#xff0c;自动化简单介绍选择其他需要和Jenkins一起安装的服务&#xff0c;点击Next。https://blog.csdn.net/qq_37237487/article/details/141299623 登录进入J…

【机器学习】CNN的基本架构模块

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CNN的基本架构模块1. 引言2. 卷积层2.1 基本原理2.2 卷积层的特性2.3 卷积层的超…

SQL,解析 json

Google BigQuery数据库的data表存储了若干多层的Json串&#xff0c;其中一条形如&#xff1a; [{"active":true,"key":"key1","values":[{"active":true,"value":"value1"}]},{"active":tru…

Java巅峰之路---进阶篇---面向对象(二)

Java巅峰之路---进阶篇---面向对象&#xff08;二&#xff09; 多态介绍多态调用成员的特点多态的优势、弊端以及解决方案综合练习 包和final包的介绍使用其他类的规则&#xff08;导包&#xff09;final关键字final的用途常量 权限修饰符和代码块权限修饰符的介绍四个权限修饰…

Halo个人博客Docker部署结合内网穿透为本地站点配置公网地址远程访问

文章目录 前言1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 前言 本文主要介绍如何在Cen…

C#学习第二节课 ,伤害计算

伤害计算 我一直好奇游戏的伤害计算是怎么计算并输出的,这第二节课利用学过的初级语法,Console.WriteLine,Console.ReadLine(),以及基础变量,int,string 和if 判断 组合,来实现打印一下伤害计算吧! 老规矩 先上结果图 代码区域 namespace hello01 {internal class Program …

望繁信科技荣膺上海市浦东新区博士后创新实践基地称号

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;凭借在大数据流程智能领域的卓越表现&#xff0c;成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可&#xff0c;也标志着公司在推动产学…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

Qt 学习第六天:页面布局

如何设计页面&#xff1f; 有个类似沙盒模式的玩法&#xff0c;Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局&#xff1a; 四种布局 &#xff08;一&#xff09;水平布局horizontalLayout&#xff1a;QHBoxLayout H 是 hori…

算法之工程化内容(3)—— Docker常用命令

目录 1. 配置docker镜像加速 2. 创建镜像docker-name 3. 查看正在运行的镜像 4. 拉取镜像 5. 运行镜像 6. 停止/启动指定 id 的容器 7. 删除指定 id 的镜像/容器 8. docker发布和部署 (推荐教程&#xff1a;&#x1f69a; 发布和部署 - Docker 快速入门) 1. 配置docke…

【蓝桥杯集训100题】scratch时间计算 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第26题

目录 scratch时间计算 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…