Menu

CSS 选择器:类型、组合器与属性选择器

CSS 选择器决定一条规则要给哪些元素设置样式。本文讲解各种选择器类型、四种组合器(后代、子元素、相邻兄弟、通用兄弟)、属性选择器和分组,并让你在线测试选择器。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

CSS 选择器是什么

选择器是规则中花括号之前的部分。它决定声明要应用到哪些元素上。

p.note { color: #2563eb; }
/* selector: p.note    declaration: color: #2563eb */

五种基本选择器就能覆盖实际样式表中的大部分需求:

选择器类型一览

选择器示例匹配
通配符选择器*每一个元素
元素选择器p每一个 <p>
类选择器.tip带有 class="tip" 的元素(可以同时有其他类)
ID 选择器#main-titleid="main-title" 的元素
属性选择器[type="email"]属性匹配的元素
伪类a:hover、li:first-child处于某种状态或位置的元素
伪元素p::first-line、.x::before元素的某个部分
分组h1, h2, h3匹配列表中任意一项的元素
复合选择器p.tip同时带有该类的 <p>

类和 ID 有专门的页面:CSS 类选择器。:nth-child() 和 :not() 等伪类在伪类页面中介绍。

组合器:后代与子元素

组合器根据两个选择器在 HTML 树中的关系把它们连接起来。一共有四种。

组合器语法何时匹配 B
后代组合器A B(空格)B 位于 A 内部的任意位置
子元素组合器A > BB 的父元素是 A
相邻兄弟组合器A + BB 紧跟在 A 后面,父元素相同
通用兄弟组合器A ~ BB 位于 A 之后的某处,父元素相同

空格和 > 是大家最容易混淆的一对。后代选择器可以深入任意层级;子元素选择器只往下找一层:

兄弟组合器:+ 与 ~

兄弟组合器只向后查找。没有“前一个兄弟”组合器,不过可以用 :has() 来表达:h2:has(+ p) 匹配紧接着跟有一个 p 的 h2。

属性选择器

方括号根据属性及其值进行匹配:

选择器匹配
[disabled]带有该属性,值任意
[type="email"]值正好是 email
[href^="https"]值以 https 开头
[href$=".pdf"]值以 .pdf 结尾
[class*="icon"]值中任意位置包含 icon
[lang|="en"]值是 en,或以 en- 开头
[data-state="open" i]完全匹配,忽略大小写

针对 data-* 属性的属性选择器,是给 JavaScript 设置的状态添加样式的简洁方式,不用另外发明类名。

测试任意选择器

在输入框中输入一个选择器。它匹配到的每个元素都会加上琥珀色轮廓,下方会显示匹配的数量。

试试 #demo a、ul > li、h2 ~ *、a[href^="https"]、li:not(.active)。

复合选择器与后代选择器:空格很关键

p.note 和 p .note 只差一个空格,含义却完全不同。

浏览器如何读取选择器

当多条规则匹配同一个元素并设置同一个属性时,优先级更高的选择器胜出;优先级相同时,后写的规则胜出。一个 ID 的分量超过任意数量的类,一个类的分量超过任意数量的元素选择器;完整的优先级表见 !important 页面。

分组有一个陷阱:在普通的选择器列表中,只要有一个选择器无效,整条规则都会被丢弃。在 a, b:unknown { } 中,连链接都不会应用样式。把列表包在 :is() 里就能容错,所以 :is(a, b:unknown) 仍然会给链接设置样式。

常见错误

  • 漏写了点号或井号。 tip { } 针对的是 <tip> 元素,而不是 class="tip"。应写成 .tip。
  • 复合选择器中多了空格。 p .note 不等于 p.note。
  • 以为 > 能选到孙元素。 要匹配任意层级,请用空格。
  • 一个拼写错误毁掉整个分组。 在 h1, h2:hovr, h3 中,什么样式都不会生效。
  • 选择器写得太长。 body div.wrapper ul li a 既难读又难覆盖。通常一个类就够了。

常见问题

CSS 选择器是什么?

CSS 规则中 { 之前的部分,它说明声明要应用到哪些元素上。在 p.note { color: blue; } 中,选择器 p.note 匹配每一个带有 note 类的 <p>。

CSS 选择器中的空格和 > 有什么区别?

空格是后代组合器:nav a 匹配 nav 内部任意层级的每一个链接。> 是子元素组合器:nav > a 只匹配直接父元素是 nav 的链接。

CSS 中的 + 是什么意思?

+ 是相邻兄弟组合器。h2 + p 匹配紧跟在 <h2> 后面、并且拥有同一个父元素的 <p>。~ 更宽松:h2 ~ p 匹配之后的每一个 <p> 兄弟元素。

CSS 中如何按属性选择元素?

把属性写在方括号里:[disabled] 匹配带有该属性的元素,[type="email"] 匹配完全相等的值,[href^="https"] 匹配以某个字符串开头的值,[href$=".pdf"] 匹配以它结尾的值,[class*="btn"] 匹配包含它的值。

CSS 能选择父元素吗?

能,使用 :has() 伪类,当前的 Chrome、Firefox 和 Safari 都支持它。li:has(> a.active) 匹配直接包含激活链接的列表项。

Coddy 编程语言插图

和 Coddy 一起学编程

开始