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

news2024/9/25 17:14:31

在现代前端开发中,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.coloradmin.cn/o/2077688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 获取文件、文件夹和驱动器的信息详解与示例

文章目录 二、获取文件夹信息三、获取驱动器信息四、示例:文件、文件夹和驱动器信息工具五、异常处理六、总结 在C#中,文件、文件夹和驱动器是文件系统操作的基本元素。了解如何获取这些元素的信息对于开发文件处理和管理工具至关重要。本文将详细介绍如…

JAVA基础:文件字符流

目录 前言 文件字符流的创建 文件字符流的使用 前言 上一篇我们知道了如果在使用输入流读取数据时,数据中含有中文就会出现乱码的情况,这时就要使用字节字符转换流这个过程流来处理一下,针对这种情况我们可以直接使用文件字符流来读取数据…

计算机毕业设计hadoop++hive微博舆情预测 微博舆情分析 微博推荐系统 微博预警系统 微博数据分析可视化大屏 微博情感分析 微博爬虫 知识图谱

1.selenium爬取微博热搜、文章、评论数据存入mysql数据库,对评论lstm情感分析模型建模分析; 2.使用mapreduce对mysql中微博数据清洗,转为.csv文件上传hdfs文件系统; 3.使用hive建库建表,导入.csv数据集; 4.一半指标hive_sql进行离…

3_1_PID控制原理

自从计算机进入控制领域以来,用数字计算机代替模拟计算机调节器组成计算机控制系统,不仅可以用软件实现PID控制算法,而且可以利用计算机的逻辑功能,使PID控制更加灵活。数字PID控制在生产过程中是一种最普遍采用的控制方法&#x…

AI-Talk开发板外设测试

一、说明 需要先测试各外设的功能正常,再开发正式应用。SDK提供了两个测试工程,测试工程A和测试工程B。 二、测试工程 1、多模态开发板硬件检测工程A 检测的模块包括: - 摄像头 - 显示屏 - 触摸屏 - USB口(csk_usb)…

张宇36讲+1000题重点强化!保100冲120速刷攻略

如果你选择考研时全程跟随张宇的课程,基础阶段使用《张宇30讲》,强化阶段跟着《张宇36讲》,并且还要完成《张宇1000题》,那么你的任务量将非常大。尤其是今年,张宇老师的课程体系发生了重大调整: 张宇老师…

【字符串连接】输入两个字符串,将其进行连接然后输出

输入两个字符串&#xff0c;将其进行连接然后输出 使用C语言代码实现&#xff0c;具体代码&#xff1a; #include<stdio.h>int main(){char str1[100],str2[100];int i0,j0;printf("请输入第一个字符串:");scanf("%s",&str1);printf("请输…

SSRF漏洞与redis未授权访问的共同利用

1.利用靶场Pikachu来认识SSRF漏洞 1.什么是SSRF SSRF漏洞允许攻击者通过向服务器发起请求来伪造请求。这种漏洞的核心在于攻击者能够控制服务器向任意目标地址发起请求&#xff0c;而这些请求通常是攻击者无法直接从客户端发起的。 简单来说&#xff0c;假设你的网站有一个功能…

代谢组数据分析(十九):随机森林构建代谢组预后模型

介绍 建立胃癌(GC)预后模型时,从队列3中的181名患者中,使用右删失结果数据进行了随机分层抽样,分为训练数据集(n = 121)和测试数据集(n = 60)。训练了一个包含1000棵树的随机生存森林(RSF)模型,根据它们基于排列的特征重要性来选择突出的特征。通过再次训练随机生…

探索c++中的类型转化

文章目录 相关引入c中的转化机制const_castreinterpret_caststatic_castdynamic_cast 其他 相关引入 C语言中的类型转换: 有相关性的类型之间才能转换: 非相关性不能转换: c中的转化机制 const_cast 去掉常量属性 指针相同, 值不相同, 本质是编译器对这个常属性的a做了…

关键点检测——HRNet原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

pycharm2024.1.1配置已有的pytorch环境

在pycharm中也可以创建jupyter notebook. 本人最近尝试了2024.2.0.1和2024.1.1&#xff0c;这两种的配置方式略有不同。本文介绍2024.1.1版本的配置方法 新建一个项目 注意这里选择自定义环境和选择现有&#xff0c;并类型是conda 路径选择 这里的路径是我安装的conda目录的S…

甄选范文“NoSQL数据库技术及其应用”,软考高级论文,系统架构设计师论文

论文真题 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL(Not only SQL )的产生就是为了解…

【STM32】RTT-Studio中HAL库开发教程六:IIC通信--GZP6877D气压传感器

文章目录 一、简介二、寄存器操作三、硬件IIC通信四、模拟IIC通信五、测试验证 一、简介 GZP6877D 型压力传感器采用 SOP6 封装形式&#xff0c;倒钩管的设计可以保证安装的密封性。内有封装的压力传感器与信号调理芯片&#xff0c;对传感器的偏移、灵敏度、温漂和非线性进行数…

(二十)Flink Paimon

数据湖、湖仓一体是当前大数据领域技术发展的重要趋势。近几年开源数据湖技术如 Apache Hudi、Apache Iceberg、Apache Paimon、DeltaLake 等不断涌现,基于湖仓一体架构的统一元数据管理、数据治理也越来越受到关注。从传统数仓到数据湖、湖仓一体架构,从流批一体计算到基于数…

【内网渗透】最保姆级的春秋云镜Brute4Road打靶笔记

目录 ①fcan扫外网&#xff0c;redis主从复制拿shell&#xff0c;suid提权 ②wget下载frp&#xff0c;内网穿透&#xff0c;fscan扫内网 ③wpscan扫wordpress RCE写webshell ④配置文件泄露&#xff0c;连数据库读敏感信息 ⑤fscan爆破MSSQLSERVER密码&#xff0c;MDUT连接…

MyBatis 通用 Mapper5 来了

通用 Mapper 是一个发布于 2014 年的开源项目&#xff0c;是第一个在 MyBatis 中实现了通用 DAO 的开源框架&#xff0c;发布距今接近 10 年&#xff0c;仍然有一部分开发者在使用&#xff0c;项目仍然在维护&#xff0c;主要通过开发者提交 PR 来进行维护。 基于 JDK 17 Jaka…

【Linux】05.Linux 下的编辑器——vim

vim是一个多模式的编辑器。 一、vim的模式 我们主要介绍 vim 的三种模式&#xff0c;分别是命令模式、插入模式和底行模式&#xff0c;各模式的功能区分如下&#xff1a; 命令模式&#xff08;Normal mode&#xff09; 控制屏幕光标的移动&#xff0c;字符、字或行的删除&am…

NOsql数据库Redis

关系型数据库和 NoSQL 数据库 Redis的源码安装 编译 vim /etc/redis/6379.conf bind改成* -::* 关闭protected模式 Redis 主从复制 主从同步过程 环境配置 redis-node1 master redis-node2 slave1 redis-node3 slave2 slave中配置 vim /etc/redis/6379.conf master中操…

设计模式25-访问器模式

设计模式25-访问器模式 访问者模式的动机定义与结构定义结构访问者模式概述结构图解析总结 C代码推导原理代码实例代码 优缺点应用总结 访问者模式的动机 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行为方法。此时如果直接在基…