【CSS in Depth2精译】1.1.4 源码顺序

解决层叠冲突的最后一环叫做 源码顺序,有时又称为 出现顺序(order of appearance。如果其他判定规则均一致,则样式表中后出现的、或者在页面较晚引入的样式表声明,将最终胜出。

也就是说,可以通过控制源码出现的顺序来给示例中的特色链接添加样式。如果两个存在冲突的选择器优先级也相同 ,则出现较晚的一方将胜出。再来看看下面给出的第四种样式实现方案。这里用到了一个复合选择器 a.featured,中间没有空格。该选择器指向同时满足两个条件的元素:带 featured 类的 <a>

代码清单 1.10 试行方案四

.nav a {color: white;background-color: #13a4a4;padding: 5px;border-radius: 2px;text-decoration: none;
}a.featured {  /* 优先级变为 (0,1,1) */background-color: orange;
}

该方案中的两个选择器优先级相等,源码顺序决定了哪个声明实际作用于特色链接,最终获得一个橙黄色背景。

问题看似解决了,但也引入了一个潜在的新问题:如果想在页面其他位置(导航菜单之外)沿用 featured 类,情况又如何呢?如图 1.7 所示,在页面其他位置添加一段内容 <a class="featured">our specials</a> ,会得到一种奇怪的混合样式:背景还是橙黄色,但导航链接的文字颜色、内边距及圆角半径信息都丢失了。

图 1.7 在导航之外使用 featured 类产生的怪异样式

图 1.7 在导航之外使用 featured 类产生的怪异样式

代码清单 1.11 给出了上述效果的 HTML 代码。目标元素仅被第二个选择器命中,而不受第一个影响,因此最终效果未能如愿。是否希望这个橙黄色按钮的样式在导航菜单以外的地方生效,得由您自己来定。如果确实需要,就必须把相关的样式一并带上。

代码清单 1.11 导航菜单外部的特色链接样式

<header class="page-header"><h1 id="page-title" class="title">Wombat Coffee Roasters</h1><nav><ul id="main-nav" class="nav"><li><a href="/">Home</a></li><li><a href="/coffees">Coffees</a></li><li><a href="/brewers">Brewers</a></li><li><a href="/specials" class="featured">Specials</a></li></ul></nav>
</header>
<main><p>Be sure to check out<!-- nav 外的特色链接只保留了部分样式 --><a href="/specials" class="featured">our specials</a>.  </p>
</main>

除非网站有其他需求,否则我更倾向于第三种方法(代码清单 1.9)。理想情况下,您可以对其他位置可能出现的样式需求做出合理的预判,比如确定在别处也会用到这个特色链接,这种情况下,方案四(代码清单 1.10)也许更合适,当然也要注意补全 featured 类缺失的样式。

正如之前所说,在 CSS 中最好的答案通常是“这要看情况”。很多样式的效果都是一题多解,找出不同的实现方法并知晓每种方法的利弊,是非常有价值的。面对同一个样式问题,通常我会分两步来处理:首先找出能达到效果的几个方案,然后再思考其对应的选择器结构,并选出最符合需求的那个方案。

1 链接样式和源码顺序

在您刚开始学习 CSS 时可能就已经了解,要给链接设计样式,书写选择器时就必须遵循特定的顺序。这是因为源码顺序影响了层叠。以下代码给出了链接样式设计的正确打开方式。将它们添加到样式表的开头、nav 样式的前面:

代码清单 1.12 超链接样式

a:link {background-color: blue;color: white;text-decoration: none;padding: 2px;
}
a:visited {background-color: purple;
}
a:hover {background-color: transparent;color: blue;text-decoration: underline;
}
a:active {color: red;
}

层叠才是链接顺序之所以重要的核心本质:在优先级相同的情况下,靠后的样式会覆盖靠前的样式。如果一个元素同时拥有多个状态,则最后那个状态的样式会覆盖其他的状态。比如当用户悬停在已访问的链接上,则悬停样式生效;当用户在悬停状态下激活(activate,即点击它)该链接,激活样式会最终生效。

这个顺序有个不错的记忆口诀:LoVe/HAte (爱/恨法则)—— 即 link(链接)、visited(已访问)、hover(悬停)、active(激活)。注意,如果当中选择器的优先级改得与其他选择器不同,这个规则就会遭到破坏,并得到意想不到的结果。

小贴士

您还可以用 :any-link 伪类来匹配 :link:visited 状态下的链接。

2 层叠值

浏览器按照上面介绍的这些规则来解析页面上每个元素的每个 property 属性。在层叠规则中胜出的样式声明,称为一个 层叠值。元素的每个属性最多只有一个层叠值。例如页面上一个特定的段落,它可以拥有一上一下两个外边距,但不能同时具有两个不同的上外边距,下外边距也一样。如果 CSS 为同一个属性指定了不同的值,层叠规则最终会选出一个值来渲染元素,这个值就是层叠值。

层叠值

即作为层叠结果最终应用到某元素特定属性上的具体取值。

如果一个元素从未指定某个属性值,则该属性没有层叠值。还是以段落为例,可能就没有特定的边框或内边距。

3 越用越顺手的层叠规则

在处理层叠时曾经有两条通用的经验法则:一是不要在选择器中使用 ID;二是不要使用 !important 注解。一旦今后要覆盖这些样式,这两条经验法则似乎都只能帮倒忙。

它们看似没多大用处,但事无绝对。在当前的许多情况下实践这两条经验法则反而反响良好,尤其是在需要考虑图层和作用域的场景下;另一方面也要牢记,切莫为了赢得优先级的“军备之争”而习惯性地套用这两种方法。本书第三部分还将探讨一些控制层叠规则的现代化工具,并展示几个可以打破这些规则的示例。

关于重要性的一则重要提醒

当创建一个像 NPM 包这样的用于分发的 JavaScript 模块时,强烈建议尽量避免在 JavaScript 里使用行内样式。要是这样做了,那就相当于强迫调用该模块的开发人员站队:要么照单全收里面的所有样式,要么给每个需要修改的 property 属性统一添加 !important 标记。

正确的做法是在包内放一张样式表。如果组件需要频繁修改样式,通常最好是用 JavaScript 给元素添加或移除某个样式类。这样用户就可以放心使用您提供的样式,并根据需要做一些调整,而不用担心优先级带来的竞争问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastapi+vue3+primeflex前后端分离开发项目第一个程序

安装axios axios是用来请求后端接口的。 https://www.axios-http.cn/docs/intro pnpm 是一个前端的包管理工具&#xff0c;当我们需要给前端项目添加新的依赖的时候&#xff0c;就可以使用pnpm install 命令进行安装。 pnpm install axios安装 primeflex primeflex是一个cs…

fastapi+vue3+primeflex前后端分离开发项目环境搭建

创建后端项目 创建文件夹&#xff1a; mkdir backend创建python虚拟环境&#xff1a; python -m venv venv使用Pycharm打开文件夹&#xff0c;然后配置python解释器为venv虚拟环境。 安装fastapi&#xff1a; pip install "fastapi[all]"编写第一个程序&#xf…

嵌入式通信协议----Wi-Fi协议详解(二)(基于STM32+有人物联网WIFI模块)

四、有人WIFI模块 1.模块介绍 Wi-Fi 模块用于实现串口到 Wi-Fi 数据包的双向透明转发&#xff0c;模块内部完成协议转换&#xff0c;通 过该模块&#xff0c;客户可以将物理设备连接到 Wi-Fi 网络上&#xff0c;从而实现物联网的控制与管理。 2.模块参数 Wi-Fi 模块的…

音频信号分析

目录 一&#xff0c;音频获取 二&#xff0c;信号的基本形态 三&#xff0c;衰减信号的频域信号 四&#xff0c;低频信号 五&#xff0c;高频信号 六&#xff0c;七个音节的频率 一&#xff0c;音频获取 我用电子琴&#xff08;音色模式是卧式钢琴&#xff09;&#xff…

软件测试----用例篇(设计测试用例保姆级教程✅)

文章目录 前言一、测试用例概念 二、如何设计测试用例三、设计测试用例的方法3.1基于需求的设计方法3.2具体的设计方法等价类边界值正交法判定表法场景法错误猜测法 前言 在软件开发过程中&#xff0c;测试用例是至关重要的一环。它们帮助软件开发人员和测试人员确定软件是否按…

5.什么是C语言

什么是 C 语言? C语言是一种用于和计算机交流的高级语言, 它既具有高级语言的特点&#xff0c;又具有汇编语言的特点 非常接近自然语言程序的执行效率非常高 C语言是所有编程语言中的经典&#xff0c;很多高级语言都是从C语言中衍生出来的&#xff0c; 例如:C、C#、Object-C、…

Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解

定时任务 在Java EE企业级开发中&#xff0c;定时任务&#xff08;也称为后台调度或周期性任务&#xff09;是非常常见的一种功能&#xff0c;主要用于执行那些不需要用户交互&#xff0c;但需要按照预定时间间隔或事件触发的任务。Java EE提供了几个框架和API来处理这种需求&…

库卡机器人减速机维修齿轮磨损故障

一、KUKA机器人减速器齿轮磨损故障的原因 1. 润滑不足&#xff1a;润滑油不足或质量不佳可能导致齿轮磨损。 2. 负载过重&#xff1a;超过库卡机械臂减速器额定负载可能导致齿轮磨损。 3. 操作不当&#xff1a;未按照说明书操作可能导致KUKA机器人减速器齿轮磨损。 4. 维护不足…

【docker安装rabbitmq】

docker安装rabbitmq 1.查阅rabbitmq的Dokcer Hub官方说明 rabbitmq地址&#xff0c;因为我们需要使用的是带管理界面的rabbitmq服务。所以我们需要下载的rabbitmq:management镜像 docker pull rabbitmq:management2.启动rabbitmq 2.1.快速启动 One of the important thing…

[吃瓜教程]概览西瓜书+南瓜书第3章线性回归

第三章 线性模型 3.0 机器学习三要素 模型&#xff1a;根据问题&#xff0c;确定假设空间策略&#xff1a;根据评价标准&#xff0c;确定选取最优模型的策略&#xff08;通常会产出一个损失函数&#xff09;算法&#xff1a;求解损失函数&#xff0c;确定最优模型。 3.1基本…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

“打造智能售货机系统,基于ruoyi微服务版本开源项目“

目录 # 开篇 售货机术语 1. 表设计说明 2. 页面展示 2.1 区域管理页面 2.2 合作商管理页面 2.3 点位管理页面 3. 建表资源 3.1 创建表的 SQL 语句&#xff08;包含字段备注&#xff09; 1. Region 表 2. Node 表 3. Partner 表 4. 创建 tb_vending_machine 表的 S…

Netty 入门实例

文章目录 1. 概述2. 代码实例2.1 服务端2.2 客户端2.3 运行截图 3. 整体结构4. 重要组件4.1 EventLoopGroup、EventLoop4.2 Handler & Pipeline4.3 ByteBuf 参考文献 1. 概述 Netty 是一款用于高效开发网络应用的 NIO 网络框架&#xff0c;它大大简化了网络应用的开发过程…

【鸿蒙】创建第⼀个鸿蒙项⽬

点击 Create Project 配置项目 开发工具界面 工程介绍

C语言第17篇:预处理详解

1、预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用。预定义符号也是在预处理期间处理的。 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他&#xff1a;下载预览浏览器下载终端插件想用uni-ui 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏&#xff0c;mian中的点击浏览 选择已经安装到本地的uniapp项目&#…

常用的设计模式

常用设计模式 ①单例模式&#xff08;始终使用同一个对象&#xff09;饿汉式&#xff0f;懒汉式DCL. synchronized. volatile(多线程可见性,不保原子性禁止指令重排&#xff09; ②原型模式&#xff1a;&#xff08;深拷贝和浅拷贝&#xff09;使用深拷贝创建对象&#xff08…

本科生大厂算法岗实习经验复盘:从投递到面试的底层思维!

目录 投递渠道boss直聘官网邮箱内推 面试准备leetcode八股深挖项目自我介绍mock面试技巧答不出来怎么办coding反问 复盘技术交流群用通俗易懂方式讲解系列 节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面…

2021-03-29:加密与解密

前段时间导师分配的任务主要是看《加密与解密》这本书&#xff0c;“书本写的很详细&#xff0c;认真看会看懂的&#xff01;” 是的啊&#xff0c;书本写的很详细&#xff0c;可是作为一个没基础的小白看起来还是挺吃力的&#xff0c;概念一个接一个的出现&#xff0c;虽然看…

【Gradio】表格数据科学与图表-连接到数据库

简介 本指南解释了如何使用 Gradio 将您的应用程序连接到数据库。我们将连接到托管在 AWS 上的 PostgreSQL 数据库&#xff0c;但 gradio 对您连接到的数据库类型及其托管位置完全不可知。因此&#xff0c;只要您能够编写 Python 代码来连接到您的数据&#xff0c;您就可以使用…