【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

news/2024/11/1 22:58:41/

1024程序员节活动图片

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 【第三部分 现代 CSS 代码组织】 ✔️
  • 【第八章 层叠图层及其嵌套】 ✔️
    • 8.1 用 layer 图层来操控层叠规则(上篇)
      • 8.1.1 图层的定义(上篇)
      • 8.1.2 图层的顺序与优先级(下篇)
      • 8.1.3 revert-layer 关键字(下篇)
    • 8.2 层叠图层的推荐组织方案
    • 8.3 伪类 :is() 和 :where() 的用法 ✔️
    • 8.4 CSS 嵌套的使用(精译中 ⏳)

文章目录

    • 8.3 伪类 :is() 和 :where() 的用法 The :is() and :where() pseudo-classes
      • 8.3.1 更宽容的选择器 More forgiving selectors
      • 8.3.2 对优先级的调控 Manipulating specificity

《CSS in Depth》新版封面

《CSS in Depth》新版封面

8.3 伪类 :is() 和 :where() 的用法 The :is() and :where() pseudo-classes

CSS 有两个相对较新的伪类选择器可用于代码的组织::is():where()。先来看看 :is() 伪类。

该伪类可以让大量选择器的书写变得简洁高效。为演示说明,考虑以下未使用 :is() 的 CSS 样式代码:

css">.contact-form input,
.contact-form textarea,
.contact-form select,
.contact-form button {padding: 5px 10px;border: 1px solid var(--brand-color);border-radius: 5px;
}

这段样式代码中,选择器存在明显重复,并且可读性也不强;而伪类 :is() 可以将所有内容合并为一个选择器,在实现同样效果的基础上让代码更加简洁明了。以下代码同之前的样式等效:

css">.contact-form :is(input, textarea, select, button) {padding: 5px 10px;border: 1px solid var(--brand-color);border-radius: 5px;
}

准确地说,:is() 伪类是一个函数,它接受一系列选择器作为参数,并匹配所有与给定选择器中的任意一个匹配的元素。

:is() 的优先级是由传入参数的最高优先级决定的。因此,:is(input, textarea, select, button) 的优先级为 0, 0, 1;而 :is(input, #login-password) 的优先级则为 1, 0, 0。无论最终匹配到的是哪个选择器参数,:is() 的优先级都固定不变。

警告

:is() 伪类选择器的参数不能是伪元素选择器(pseudo-element selectors)。所以类似 :is(div::before, div::after) 这样的写法是无效的;另一方面,传入另一个伪类作参数则是合法的。例如,写作 :is(:first-child) 则是有效的。

8.3.1 更宽容的选择器 More forgiving selectors

:is() 的另一个好处是它对无效或未识别的选择器更加宽容。考虑以下选择器:

css">input.invalid,
input:user-invalid {border: 1px solid red;
}

上述代码中,伪类 :user-invalid 相对较新,浏览器支持有限,因此在某些浏览器中,即使其他选择器匹配成功,整个选择集也会被忽略。这一限制偶尔会让开发者感到意外;为此,:is() 在设计时便尤为注重其对无效选择器的宽容性。上述代码可以改成下面这样,实现更符合预期的效果:

css">input:is(.invalid, :user-invalid) {border: 1px solid red;
}

按照这样修改后,不支持 :user-invalid 伪类的浏览器仍然可以让匹配样式类 .invalid 的部分生效,从而在样式表中以更优雅的方式实现新伪类的渐进式增强。

8.3.2 对优先级的调控 Manipulating specificity

:where() 伪类在功能上与 :is() 完全相同,唯一的区别在于 :where() 的优先级 始终为零。也就是说 :where() 可用于调低之前优先级较高的选择器。

假设想根据 ID 值来选中元素,但又不希望它覆盖掉同一图层(layer)上的其他样式,就可以编写一个像这样的选择器::where(#login-form) input。该选择器的优先级为 0, 0, 1 —— 它是 :where(#login-form) 的优先级 0, 0, 0input 的优先级 0, 0, 1 的结合。此外还可以将多个 :where() 伪类链接在一起(译注:如 :where(.class1) :where(.class2) { ... })。

在本章之前的一个示例中,我们希望用 .button 来覆盖选择器 a:any-link。这里也可以使用 :where() 伪类实现相同的效果,如代码清单 8.12 所示。当按钮样式(button styles)应用于同一元素时,链接样式(link styles)将被覆盖。

代码清单 8.12 利用 :where() 来调低优先级

css">a:where(:any-link) { /* 优先级为 0,0,1 */color: var(--brand-blue);font-weight: bold;
}
.button { /* 优先级为 0,1,0 */display: inline-block;padding: 0.5rem;color: white;background-color: var(--brand-blue);font-weight: normal;text-decoration: none;
}

在层叠图层推出以前,这是一种控制冗长选择器优先级的非常有用的写法;虽然目前 :where() 的使用频率不高,但在某些场合,尤其是在管理位于同一图层上的样式时,仍然很有用。

同理,也可以给 :is() 选择器传入一个优先级较高的选择器参数来有意调高该选择器的整体优先级。例如 :is(.button, #fake-id) 就人为创建了一个优先级为 1, 0, 0 的选择器;但我并不推荐这样写,毕竟选择器优先级还是应该尽量保持低位运行。



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
  • 第七章 响应式设计(已完结)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局
    • 7.4 响应式图片
    • 7.5 本章小结

http://www.ppmy.cn/news/1543708.html

相关文章

Python+Appium+Pytest+Allure自动化测试框架-安装篇

文章目录 安装安装ADT安装NodeJs安装python安装appium安装Appium Server(可选)安装Appium-Inspector(可选)安装allure安装pytest PythonAppiumPytestAllure框架的安装 Appium是一个开源工具,是跨平台的,用于…

如何通过自签名证书让本地环境变为 https

生成一个自签名的证书密钥对,并将其存储在一个PKCS12格式的密钥库文件 命令解释 keytool -genkeypair -alias testCert -keyalg RSA -storetype PKCS12 -keystore keystore.p12 -storepass password 将生成的 keystore 文件放在“resources”文件夹中。 keytool…

【Spring源码核心篇-01】精通Spring的bean的生命周期

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012 spring的bean的生命周期 一,spring中bean的生命周期1,生成BeanDefinition1.1,初始化context和BeanFacto…

YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

前言 在目标检测领域,小目标检测一直是一个具有挑战性的问题。YOLO系列算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在YOLOv11中添加小目标检测层,以提高对小目标的检测能力。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、…

CSS3简介(一)

1、CSS3简介 CSS3(层叠样式表3级)是用于控制网页外观设计的一种样式表语言,它是CSS2的继承者,并且是目前最为先进的版本之一。CSS3为Web设计师提供了更多功能强大的工具来创建更加动态和美观的网站。 以下是一些CSS3的主要特点和新…

安达发|零部件APS车间排程系统销售预测的优点

2024制造业面临着前所未有的挑战与机遇。为了保持竞争力,企业必须确保其生产系统能够高效、灵活地运作。在这方面,采用高级计划与排程系统,特别是零部件APS车间排程系统的预测方法,已成为提升生产效率和响应能力的关键策略。这种系…

Apple iap2协议栈在蓝牙中的移植及MFi认证的实现

资料准备:iap2协议栈源码以及MFi Accessory spec规格书 一、iap2协议栈在蓝牙中的移植: 1,rfcomm注册iap2协议栈数据收发回调函数 iap2协议栈和hfp,spp一样都是基于rfcomm实现的,因此需要在rfcomm中单独注册一个数据…

Linux版更新流程

一.下载更新包 下载地址:https://www.nvisual.com/%e4%b8%8b%e8%bd%bd/ 二.更新包组成 更新包由三部分组成: 前端更新包:压缩的ZIP文件,例如:dist-2.2.26-20231227.zip (2.2.26是版本号 20231227是发布日期)后端更…