选择器 第 5 级

W3C 首份公开工作草案,

关于本文件的更多细节
本版本:
https://www.w3.org/TR/2026/WD-selectors-5-20260217/
最新发布版本:
https://www.w3.org/TR/selectors-5/
编辑草案:
https://drafts.csswg.org/selectors-5/
历史:
https://www.w3.org/standards/history/selectors-5/
反馈:
CSSWG 问题仓库
规范内联
编辑:
Elika J. Etemad / fantasaiApple
Tab Atkins Jr.Google
为本规范建议编辑:
GitHub 编辑器
差异规范(Delta Spec):
测试套件:
https://wpt.fyi/results/css/selectors/

摘要

选择器是在树中与元素匹配的模式,因此构成了可用于在文档中选择节点的若干技术之一。选择器已针对 HTML 与 XML 的使用进行了优化,并被设计为可用于性能关键的代码中。它们是 CSS(层叠样式表)的核心组件,CSS 使用选择器将样式属性绑定到文档中的元素上。 《选择器 第 5 级》描述了 [selectors-4] 中已存在的选择器,并进一步为 CSS 以及其他可能需要它们的语言引入了新的选择器。

CSS 是一种用于描述结构化文档 (如 HTML 和 XML) 在屏幕、纸张等介质上的呈现方式的语言。

本文档状态

本节描述本文档在发布时的状态。 当前 W3C 出版物列表 以及本技术报告的最新修订版 可在 W3C 标准与草案索引 中找到。

本文档由 CSS 工作组 按照 推荐标准 轨道 发布为 首份公开工作草案。 作为首份公开工作草案发布 并不意味着 W3C 及其成员的认可。

这是一份草案文档, 并且可能随时被更新、替换 或被其他文档废止。 不应将本文档作为除“进行中的工作”之外的内容来引用。

请通过 在 GitHub 中提交 issue(推荐) 发送反馈, 并在标题中包含规范代码 “selectors”,例如: “[selectors] …评论摘要…”。 所有 issue 与评论都会被归档。 或者,也可以将反馈发送到(已归档的)公开邮件列表 www-style@w3.org

本文档受 2025 年 8 月 18 日《W3C 流程文档》 的约束。

本文档由一个在 W3C 专利政策 下运作的工作组编制。 W3C 维护一份与该工作组交付成果相关的任何专利披露的公开列表; 该页面也包含披露专利的说明。 任何个人若实际知悉其认为包含必要权利要求的专利, 必须依照 W3C 专利政策第 6 节 披露相关信息。

1. 引言

这是相对于 选择器 第 4 级 的差异规范。

1.1. 模块交互

本模块扩展了在 [selectors-4] 中为 CSS 定义的选择器集合。

2. 位置伪类

2.1. 本地链接伪类 :local-link

:local-link 伪类允许作者基于用户在站点内的当前位置来为 超链接设置样式,并区分站点内部链接与站点外部链接。

(非函数式的):local-link 伪类表示这样一个元素:它是某个超链接的源锚点,且该超链接目标的绝对 URL 与该元素自身文档的 URL 相匹配。 在将文档 URL 与链接 URL 进行匹配之前,会先去除任何片段标识符(fragment identifier); 否则将考虑 URL 的所有部分。

例如,下面这条规则会阻止当导航列表中的链接指向当前页面时出现下划线:
nav :local-link { text-decoration: none; } 

作为函数式伪类,:local-link() 也可以接受一个非负整数作为其唯一参数; 若文档 URL 属于层级式(hierarchical)方案,则该参数表示要匹配的路径层级数量:

下面的示例会将所有站点外部链接设置为虚线下划线。
:not(:local-link(0)) { text-decoration-style: dashed; } 

路径片段是 URL 路径中由正斜杠(/)分隔的部分。 若文档 URL 中缺少某个片段,则要求该片段匹配的伪类将不会匹配任何元素。

因此,给定以下链接:
  1. <a href="http://www.example.com">主页</a>
  2. <a href="http://www.example.com/2011">2011</a>
  3. <a href="http://www.example.com/2011/03">三月</a>
  4. <a href="http://www.example.com/2011/03/">三月</a>
  5. <a href="http://www.example.com/2011/03/21">3 月 21 日</a>
  6. <a href="https://www.example.com/2011/03/">三月</a>
  7. <a href="http://example.com/2011/03/">三月</a>

以及以下样式:

  1. a:local-link {...}
  2. a:local-link(0) {...}
  3. a:local-link(1) {...}
  4. a:local-link(2) {...}
  5. a:local-link(3) {...}
  6. a:local-link(4) {...}

若文档 URL 为 http://www.example.com/2011/03/

  1. 链接 1 将应用样式 B
  2. 链接 2 将应用样式 B 与 C
  3. 链接 3 将应用样式 B、C 与 D
  4. 链接 4 也将应用样式 A、B、C、D 与 E
  5. 链接 5 将应用样式 B、C 与 D
  6. 链接 6 将保持无样式
  7. 链接 7 将保持无样式
  8. 样式 F 不会应用到任何元素

URL 的“源”(origin)由 RFC 6454 第 4 节 定义。 当与 :local-link(n) 进行匹配时,不考虑 URL 的用户名、密码、查询字符串与片段部分。 若文档 URL 不属于层级式方案,则该函数式伪类不匹配任何元素。

很明显,如果文档 URL 至少有 N 个片段, 那么 :local-link(N) 只会匹配 URL 至少有 N 个片段的链接。 (这让你可以为 :local-link 赋予一致的语义,例如,:local-link(2) 在 GitHub 上表示“仓库内”链接。) 但如果文档 URL 的片段数少于 N, 且链接是同页链接呢? “空片段(null segments)”应该算作匹配,还是不算?

3. 用户行为伪类

3.1. 兴趣伪类::interest-source:interest-target

一种常见的 UI 特性是允许用户对某些元素“显示兴趣” (兴趣源), 并让 UI 对该兴趣作出响应, 通过在另一个元素中显示额外信息 (兴趣目标), 通常是一个弹出层(popup)。 例如,将鼠标悬停在页面中的用户名上 可能会弹出该用户的信息卡片; 或者长按一个链接 可能会弹出该链接目标的预览。 每当发生这种情况时,第一个元素

注:究竟哪些元素能够成为 兴趣源, 它们如何与 兴趣目标 关联, 以及“兴趣”如何展示, 都由宿主语言定义。 例如在 HTML 中, 通过 interestfor 属性 来指示一个能够“显示兴趣”的元素 (即成为一个 兴趣源), 并且该属性指向另一个元素, 该元素用于显示额外信息 (即关联的 兴趣目标) (通常是一个 popover 元素)。

:interest-source 伪类 适用于用户当前正在“显示兴趣”的某个 兴趣源 元素; 而 :interest-target 伪类 适用于与匹配 :interest-source 的元素相关联的 兴趣目标

注::interest-source 只会匹配用户当前感兴趣的某个 兴趣源, 而不是任何潜在能够被显示兴趣的元素。 例如在 HTML 中, 仅仅拥有 interestfor 属性并不会让元素匹配该伪类; 用户还必须实际对其表示兴趣。 同样,:interest-target 只会匹配一个 兴趣目标:它必须与用户当前感兴趣的元素相链接, 而不是任何被 interestfor 属性指向的元素。

4. 输入伪类

4.1. 输入值校验

4.1.1. 空值伪类::blank

:blank 伪类 适用于用户输入元素:其输入值为空 (由空字符串构成或为其他空输入)。

大体来说,如果一个人查看表单的打印稿 会说它是空白的, 那它就匹配 :blank

用于解释表单控件上 :blank 的一个经验法则是:

宿主语言可以为表单控件何时匹配 :blank 指定更精确的规则。

5. 时间维度伪类

这些伪类根据某个时间线中 当前显示或处于活动状态的位置来对元素进行分类,例如 在文档的语音渲染过程中, 或者在使用 WebVTT 渲染字幕的视频播放过程中。

CSS 不定义这条时间线; 宿主语言必须定义它。 若某个元素未定义时间线, 这些伪类就不得匹配该元素。

注::current 元素的祖先元素也同样是 :current, 但 :past:future 元素的祖先元素不一定也同样是 :past:future。 给定元素最多只能匹配 :current:past:future 之一。

5.1. 当前元素伪类::current

:current 伪类表示当前正在显示的元素,或该元素的某个祖先元素。

其另一种形式 :current() 接受一个由 复合选择器 组成的列表作为参数: 它表示匹配该参数的 :current 元素; 或者若其不匹配,则表示匹配该参数的 :current 元素的最内层祖先元素。 (如果 :current 元素及其祖先都不匹配参数,则该选择器不表示任何元素。)

例如,下面这条规则会高亮文档语音渲染中正在被朗读的段落或列表项:
:current(p, li, dt, dd) {
  background: yellow;
}

5.2. 过去元素伪类::past

:past 伪类表示任何被定义为完全发生在某个 :current 元素之前的元素。 例如,WebVTT 规范定义了 :past 伪类是相对于媒体元素当前播放位置而言的。 若文档语言未定义基于时间的元素顺序, 则它表示任何作为 :current 元素的(可能为间接的)前一个兄弟元素的元素。

5.3. 未来元素伪类::future

:future 伪类表示任何被定义为完全发生在某个 :current 元素之后的元素。 例如,WebVTT 规范定义了 :future 伪类是相对于媒体元素当前播放位置而言的。 若文档语言未定义基于时间的元素顺序, 则它表示任何作为 :current 元素的(可能为间接的)后一个兄弟元素的元素。

6. 暴露自定义状态::state() 伪类

:state( <ident> ) 伪类 匹配那些 自定义元素:其 状态集合(states set) 包含某个字符串, 该字符串 选择器参数值的字符串。

Tests

注:is” 的匹配行为按码点比较字符串; 需要注意的是,它区分大小写。 因此,如果 “foo” 在 状态集合 中,:state(FOO)不会匹配。

:state() 伪类的精确匹配行为 由宿主语言定义。 为清晰起见,用于解释该伪类的概念链接到 HTML 的定义; 更多细节请参见 HTML 的定义。 其他宿主语言必须定义该伪类如何匹配。

7. 标题结构:标题伪类 :heading:heading()

(非函数式的):heading 伪类 匹配具有某个 标题级别(heading level) 的元素(相对于文档语言所定义的语义,例如 [HTML5])。

特异性(specificity)之于 :heading 等同于一个类。

例如,下面的样式表包含一条规则,用于应用到当前页面中的所有标题元素:
:heading { text-decoration: underline; }

作为函数式伪类,:heading() 记法表示这样一些元素:其 标题级别 在所提供的若干 integer 值中匹配任意一个。 其语法为:

:heading() = :heading( <level># )

其中 <level> 是一个 <number-token>,并且其类型标志被设置为 “integer”。

:heading()特异性(specificity) 等同于一个类。

下面的示例将级别在 1 到 3 之间的标题设置为 900 的字重,而将 6 及之后级别的标题设置为 500 的字重;此外,标题级别 1 与 2 会有下划线,而 3 及之后将没有 text-decoration:
:heading(1, 2, 3) { font-weight: 900; }
:heading(6, 7, 8, 9) { font-weight: 500; }
:heading(1, 2) { text-decoration: underline; }
:heading(3, 4, 5, 6, 7, 8, 9) { text-decoration: none; }

注:标题级别 可能与元素的 类型选择器 不同。因此,选择器 h1:heading(3) 会匹配任何暴露出的标题级别为 3 的 h1 标签。

Tests

8. 网格结构选择器

二维网格中的单元格具有双重关联(关联到其行与列), 这种关联无法通过层级式标记语言中的亲子关系来表示。 其中只有一种关联可以以层级方式表示:另一种必须在文档语言的语义中显式或隐式定义。 在 HTML 与 DocBook 这两种最常见的层级式标记语言中,标记是“以行优先”的(也就是说,行关联以层级方式表示);列必须通过推断得出。 为了能够表示这种隐式的、基于列的关系,定义了 列组合符 以及 :nth-col():nth-last-col() 伪类。 在以列优先的格式中,这些伪类则改为匹配行关联。

8.1. 列组合符(||

列组合符由两个竖线组成(||), 表示列元素与属于该列的单元格元素之间的关系。 列成员关系仅依据文档语言的语义来确定: 不考虑元素是否以及如何呈现。 若某个单元格元素属于多个列, 则由一个指示属于其中任意列的选择器来表示。

下面的例子会让单元格 C、E 与 G 变为灰色。
col.selected || td {
  background: gray;
  color: white;
  font-weight: bold;
}
<table>
  <col span="2">
  <col class="selected">
  <tr><td>A <td>B <td>C
  <tr><td colspan="2">D <td>E
  <tr><td>F <td colspan="2">G
</table>

8.2. :nth-col() 伪类

:nth-col(An+B) 伪类记法表示这样的单元格元素:它属于某个列, 并且在它之前有 An+B-1 个列,其中 n 可以取任意正整数或零。 列成员关系仅依据文档语言的语义来确定:不考虑元素是否以及如何呈现。 若某个单元格元素属于多个列,则由一个指示属于其中任意列的选择器来表示。

CSS Syntax Module [CSS3SYN] 定义了 An+B 记法

8.3. :nth-last-col() 伪类

:nth-last-col(An+B) 伪类记法表示这样的单元格元素:它属于某个列, 并且在它之后有 An+B-1 个列,其中 n 可以取任意正整数或零。 列成员关系仅依据文档语言的语义来确定:不考虑元素是否以及如何呈现。 若某个单元格元素属于多个列,则由一个指示属于其中任意列的选择器来表示。

CSS Syntax Module [CSS3SYN] 定义了 An+B 记法

9. 组合符

9.1. 引用组合符 /ref/

引用组合符由两个斜杠组成, 中间夹着一个 CSS 限定名称, 并分隔两个 复合选择器, 例如 A /attr/ B。 第一个 复合选择器所表示的元素显式引用 第二个 复合选择器所表示的元素。 除非宿主语言为表达该关系定义了不同语法, 否则当第一个元素上指定属性的值为 IDREF 或者为引用第二个元素的 ID 选择器 时, 视为该关系存在。

引用组合符的属性匹配遵循与 属性选择器 相同的规则。

下面的例子会在其 input 元素的 <label> 获得焦点或被悬停时,高亮该 input 元素:
label:is(:hover, :focus) /for/ input,       /* 通过 "for" 属性关联 */
label:is(:hover, :focus):not([for]) input { /* 通过包含关系关联 */
  box-shadow: yellow 0 0 10px;
}

10. 变更

10.1. 自第 4 级以来的变更

第 4 级 以来新增内容:

11. 致谢

CSS 工作组希望感谢多年来为 此前的选择器 规范做出贡献的所有人, 因为这些规范构成了本规范的基础。 尤其是,工作组希望就以下人士对《选择器 第 5 级》的具体贡献致以特别感谢: Joey Arhar。

隐私注意事项

在适当时应从第 4 级复制。

安全注意事项

在适当时应从第 4 级复制。

一致性

文档约定

一致性要求通过描述性断言与 RFC 2119 术语的组合来表达。关键词 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”,以及 “OPTIONAL” 在本文档规范性部分中 应按 RFC 2119 中所述进行解释。 然而,为了便于阅读,这些词在本规范中并未全部以全大写字母出现。

除非某些章节被明确标记为非规范性内容、示例和注释之外,本规范的全部文本均为规范性内容。 [RFC2119]

本规范中的示例以 “例如” 等词引入, 或者使用 class="example" 将其与规范性文本区分开来, 如下所示:

这是一个资料性示例的示例。

资料性注释以 “注” 一词开头,并使用 class="note" 将其与规范性文本区分开来, 如下所示:

注,这是一条资料性注释。

提示(Advisements)是以特殊样式呈现、用于引起特别注意的规范性章节,并且 使用 <strong class="advisement"> 将其与其他规范性文本区分开来,例如: 用户代理必须提供一种无障碍替代方案。

测试

与本规范内容相关的测试 可以像本块这样记录在 “测试” 区块中。 任何此类区块均为非规范性内容。


一致性类别

对本规范的一致性 为以下三类一致性类别定义:

样式表
CSS 样式表
渲染器
解释样式表语义并渲染使用这些语义的文档的 UA
创作工具
编写样式表的 UA

若某样式表中所有使用本模块定义语法的声明 都符合通用 CSS 语法以及本模块中每个特性各自的语法, 则该样式表符合本规范。

若某渲染器除了按相应规范解释样式表之外, 还能通过正确解析并相应渲染文档来支持本规范定义的所有特性, 则该渲染器符合本规范。然而,UA 因设备限制而无法正确渲染文档 并不会使该 UA 不符合规范。(例如,UA 不要求在单色显示器上渲染颜色。)

若某创作工具编写的样式表在语法上符合通用 CSS 语法以及本模块中各特性的各自语法, 并满足本模块所述的样式表的所有其他一致性要求, 则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定回退值, CSS 渲染器 必须 将其不具备可用支持级别的任何 at 规则、属性、属性值、关键字 以及其他语法结构视为无效(并 按需忽略)。 尤其是,用户代理 不得 在单个多值属性声明中选择性忽略不支持的组件值而对支持的值予以认可: 若任一值被视为无效(不支持的值必须如此),CSS 要求忽略整条声明。

不稳定与专有特性的实现

为避免与未来稳定的 CSS 特性发生冲突, CSSWG 建议在实现 不稳定 特性以及 CSS 的 专有扩展遵循最佳实践

非试验性实现

当某规范达到候选推荐(Candidate Recommendation)阶段后, 就可能出现非试验性实现,且实现者应发布其能够证明已按规范正确实现的任何 CR 级特性的无前缀实现。

为建立并维持 CSS 在不同实现之间的互操作性, CSS 工作组请求非试验性的 CSS 渲染器在发布任何 CSS 特性的无前缀实现之前, 向 W3C 提交实现报告(以及在必要时,用于该实现报告的测试用例)。 提交给 W3C 的测试用例将由 CSS 工作组进行审查与修正。

关于提交测试用例与实现报告的更多信息 可在 CSS 工作组网站 https://www.w3.org/Style/CSS/Test/ 上找到。 问题应发送至 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 12 March 2024. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS3SYN]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 22 January 2026. WD. URL: https://www.w3.org/TR/selectors-4/

资料性参考文献

[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS2/
[HTML5]
Ian Hickson; et al. HTML5. 27 March 2018. REC. URL: https://www.w3.org/TR/html5/
[WAI-ARIA-1.2]
Joanmarie Diggs; et al. Accessible Rich Internet Applications (WAI-ARIA) 1.2. 6 June 2023. REC. URL: https://www.w3.org/TR/wai-aria-1.2/

问题索引

这是相对于 选择器 第 4 级 的差异规范。
很明显,如果文档 URL 至少有 N 个片段, 那么 :local-link(N) 只会匹配 URL 至少有 N 个片段的链接。 (这让你可以为 :local-link 赋予一致的语义,例如,:local-link(2) 在 GitHub 上表示“仓库内”链接。) 但如果文档 URL 的片段数少于 N, 且链接是同页链接呢? “空片段(null segments)”应该算作匹配,还是不算?