媒体查询 第 5 级

W3C 工作草案,

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2026/WD-mediaqueries-5-20260219/
最新发布版本:
https://www.w3.org/TR/mediaqueries-5/
编辑草案:
https://drafts.csswg.org/mediaqueries-5/
先前版本:
历史:
https://www.w3.org/standards/history/mediaqueries-5/
反馈:
CSSWG 议题仓库
规范内联
编辑:
Florian Rivoal (受邀专家)
Tab Atkins Jr. (Google)
Daniel Libby (Microsoft)
Luke Warlow (Igalia)
前任编辑:
Dean Jackson (Apple)
为本规范建议编辑:
GitHub 编辑器
测试套件:
https://wpt.fyi/results/css/mediaqueries/

摘要

媒体查询 允许作者测试 并查询用户代理或显示设备的值或特性,而不依赖于 正在被渲染的文档。它们用于 CSS 的 @media 规则中,以有条件地 将样式应用到文档上,并用于各种 其他上下文与语言中,例如 HTML 与 JavaScript。

《媒体查询 第 5 级》描述了媒体查询、媒体类型与媒体特性的机制与语法。 它扩展并取代《媒体查询 第 4 级》中定义的特性。

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

本文档状态

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

本文档由 CSS 工作组 作为 工作草案 发布, 并使用 推荐轨道。 作为工作草案发布 并不意味着 W3C 及其成员的认可。

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

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

本文档受 2025 年 8 月 18 日 W3C 过程文档 约束。

本文档由一个在 W3C 专利政策 下运作的工作组产出。 W3C 维护一份 公开列表, 列出与该工作组交付物相关的任何专利披露; 该页面也包含披露专利的说明。 任何个人若实际知悉某专利,并认为该专利包含 必要权利要求(Essential Claim(s)), 必须依据 W3C 专利政策第 6 节 披露相关信息。

以下特性处于 at-risk 状态,并可能在 CR 期间被移除:

“At-risk” 是 W3C 过程中的术语,并不一定意味着该特性确实面临被移除或延期的风险。 它表示工作组认为该特性可能难以及时实现跨实现互操作, 将其标记为 at-risk 使工作组在必要时 可在过渡到拟推荐(Proposed Rec)阶段时移除该特性, 而无需先发布一个不包含该特性的新的候选推荐(Candidate Rec)。

1. 引言

本节为非规范性内容。

在 1997 年,HTML4 [HTML401] 定义了一种机制,用于支持依赖于媒体的样式表, 以适配不同的 媒体类型。 例如,一个文档可能为屏幕与打印使用不同的样式表。 在 HTML 中,可以这样写:

<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<link rel="stylesheet" type="text/css" media="print" href="print.css">

CSS 通过其 @media@import 规则适配并扩展了这一功能, 增加了查询单个特性值的能力:

在 CSS 样式表中, 可以声明某些章节适用于某些 媒体类型
@media screen {
  * { font-family: sans-serif }
}

类似地,也可以基于媒体查询有条件地导入样式表:

@import "print-styles.css" print;

媒体查询 可与 HTML、XHTML、XML [xml-stylesheet] 以及 CSS 的 @import 与 @media 规则一起使用。

下面是将同一个示例分别用 HTML、XHTML、XML、 @import 与 @media 写出的形式:
<link media="screen and (color), projection and (color)"
      rel="stylesheet" href="example.css">

<link media="screen and (color), projection and (color)"
      rel="stylesheet" href="example.css" />

<?xml-stylesheet media="screen and (color), projection and (color)"
                 rel="stylesheet" href="example.css" ?>

@import url(example.css) screen and (color), projection and (color);

@media screen and (color), projection and (color) { … }

1.1. 模块交互

本模块扩展并取代 [MEDIAQUERIES-4] 以及其前身 [MEDIAQUERIES-3], 而它们又是建立在并替代 CSS 2 § 7 媒体类型 之上。

1.2.

本规范未定义的值类型,例如 <integer><number><resolution>, 定义于 [CSS-VALUES-4]。 其他 CSS 模块可能会扩展这些值类型的定义。

1.3. 单位

媒体查询中使用的单位与 CSS 的其他部分相同,如 [CSS-VALUES-4] 中所定义。 例如,像素单位表示的是 CSS 像素, 而不是物理像素。

相对长度 单位在媒体查询中是基于 初始值 的, 这意味着单位永远不会基于声明的结果。

注:例如在 HTML 中, em 单位相对于 初始值font-size, 该初始值由用户代理或用户偏好定义, 而不是页面上的任何样式设置。 请注意,这也会考虑用户可能施加的附加限制, 例如最小字体大小。

测试

2. 媒体 查询

一个 媒体查询 是一种用于测试用户代理 或文档所在显示设备某些方面的方法。媒体查询(几乎)总是独立于文档内容、 其样式, 或任何其他内部方面; 除非另一个特性明确指定它会影响媒体查询的解析结果,否则它们只依赖于“外部”信息。

媒体查询 的语法由以下部分组成: 一个可选的 媒体查询修饰符, 一个可选的 媒体类型, 以及零个或多个 媒体特性

media condition only not media type and media condition

一个 媒体查询 是一个逻辑表达式, 其结果为真或假。 媒体查询为真当且仅当:

本节中关于媒体查询的陈述假定遵循 语法章节。 不符合语法的媒体查询在 § 3.2 错误处理 中讨论。 即:语法优先于本节中的要求。

下面是一个用 HTML 写的简单示例:
<link rel="stylesheet" media="screen and (color)" href="example.css" />

此示例表示某个样式表 (example.css)适用于某类媒体类型的设备 (screen), 并且具备某项特性(必须是彩色屏幕)。

下面是在 CSS 的 @import 规则中写出同一个媒体查询:

@import url(example.css) screen and (color);

用户代理必须在其所知的用户环境发生变化时重新求值 媒体 查询, 例如当设备从横向(landscape)切换到纵向(portrait)时, 并相应改变依赖这些 媒体查询 的任何结构的行为。

除非另一个特性明确指定它会影响媒体查询的解析结果,否则不需要为了对表达式求值而应用样式表。

测试

2.1. 组合媒体查询

若干 媒体查询 可以组合成一个以逗号分隔的 媒体查询列表

media query ,

媒体查询列表 为真当且仅当其组成部分中的 任意一个 媒体 查询 为真; 并且只有当其组成部分中的 全部 媒体查询 都为假时才为假。

例如,下面的 媒体查询列表 在以下任一情况为真: 媒体类型screen 且是彩色设备, 媒体类型projection 且是彩色设备:
@media screen and (color), projection and (color) { … }

空的 媒体查询列表 求值为真。

例如,以下两者等价:
@media all { … }
@media { … }

2.2. 媒体查询修饰符

一个 媒体查询 可以选择性地以前缀形式带有一个 媒体查询修饰符, 它是一个单独的关键字,用于改变后续 媒体 查询 的含义。

2.2.1. 否定媒体查询:not 关键字

单个 媒体查询 可以通过在其前添加关键字 not 来对其结果取反。 如果该 媒体查询 正常情况下求值为真, 那么加上 not 前缀会使其求值为假; 反之亦然。

例如,以下样式将应用于除具备彩色能力的屏幕之外的所有情况。 注意,这里取反的是整个媒体查询, 而不仅仅是 媒体类型
<link rel="stylesheet" media="not screen and (color)" href="example.css" />

2.2.2. 对旧版用户代理隐藏媒体查询:only 关键字

媒体查询 的概念源自 HTML4 [HTML401]。 该规范只定义了 媒体类型, 但具有一种向前兼容的语法,能容纳未来概念(例如 媒体特性)的加入: 它会读取 媒体查询 中直到第一个非字母数字字符之前的所有字符, 并将其解释为一个 媒体类型, 其余部分则被忽略。 例如,媒体查询 screen and (color) 会被截断为仅 screen

不幸的是,这意味着采用此错误处理行为的旧版用户代理 会忽略 媒体特性媒体查询 中的任何出现, 即便这些特性在查询中远比 媒体类型 更重要。 这可能导致样式在不合适的情形中被意外应用。

为将这些 媒体查询 对旧版用户代理隐藏, 可以在 媒体查询 前加上关键字 onlyonly 关键字对 媒体查询 的结果没有影响, 但会导致旧版用户代理将该 媒体查询 解析为指定了未知的 媒体类型 “only”, 从而将其忽略。

在此示例中,由 <link> 元素指定的样式表 将不会被旧版用户代理使用, 即便它们通常会匹配 screen 媒体类型
<link rel="stylesheet" media="only screen and (color)" href="example.css" />

注:请注意,only 关键字 只能用于 媒体类型 之前。 仅由 媒体特性 构成的 媒体查询, 或带有另一个 媒体查询修饰符(如 not)的查询, 将会被旧版用户代理自动视为假。

注:在发布本规范时, 此类旧版用户代理极其罕见, 因而使用 only 修饰符很少(若有的话)是必要的。

2.3. 媒体类型

媒体类型 是一类宽泛的用户代理设备类别, 文档可以在其上显示。 最初的一组 媒体类型 在 HTML4 中定义, 用于 <link> 元素的 media 属性。

不幸的是,媒体类型 事实证明不足以 区分具有不同样式需求的设备。 一些最初相当不同的类别, 例如 screenhandheld, 在其发明后的这些年里已经显著融合。 另一些,例如 ttytv, 暴露了与功能齐全的计算机显示器这一常态相比的有用差异, 因而在理论上可用于用不同样式进行针对性处理; 但由于 媒体类型 的定义是互斥的, 使得以合理方式使用它们变得困难; 相反,它们的排他性方面更适合通过 媒体特性, 例如 gridscan

因此,以下 媒体类型 被定义用于 媒体 查询

all
匹配所有设备。
print
匹配打印机,以及旨在复现打印显示的设备, 例如以“打印预览”显示文档的网页浏览器。
screen
匹配所有不被 print 匹配的设备。

此外,还定义了以下已弃用媒体类型。 作者不得使用这些 媒体类型; 相反,建议他们选择能更好代表其试图针对进行样式设置的设备方面的、适当的 媒体特性

用户代理必须将以下 媒体类型 识别为有效, 但必须使它们不匹配任何内容。

注:预计所有媒体类型也会在未来适时弃用, 因为将会定义出适当的 媒体特性, 用以捕捉其重要差异。

测试

2.4. 媒体特性

媒体特性 是比 媒体类型 更细粒度的测试, 用于测试用户代理或显示设备的一项单独、特定的特性。

从语法上讲,媒体特性 类似于 CSS 属性: 它们由特性名称、冒号,以及要测试的值组成。 它们也可以仅以特性名称书写为布尔形式, 或使用比较运算符以范围形式书写。

( feature name : feature value feature name range form (see below) )

不过,属性与媒体特性之间有若干重要差异:

如果某个 媒体特性 引用的概念 在 UA 运行所在设备上并不存在 (例如,语音 UA 没有“宽度(width)”这一概念), 则该 媒体特性 必须始终求值为假。

媒体特性 device-aspect-ratio 仅适用于 视觉设备。在 speech 设备上,涉及 device-aspect-ratio 的表达式因此将始终为假:
<link media="speech and (device-aspect-ratio: 16/9)"
      rel="stylesheet" href="example.css">

2.4.1. 媒体特性类型:“range” 与 “discrete”

每个媒体特性在其定义表中将其“类型”定义为 “range” 或 “discrete”。

“Discrete” 媒体特性, 例如 pointer,其值来自一个集合。 这些值可以是关键字 或布尔数字(0 与 1), 但共同点在于它们没有内在的“顺序”——这些值彼此之间不存在“更小”或“更大”的关系。

另一方面,“Range” 媒体特性(例如 width)的值来自一个范围。 任意两个值都可以被比较,以确定哪个更小、哪个更大。

这两种类型之间唯一显著的差异在于: 类型为 “range” 的 媒体特性 可以在 范围上下文 中求值, 并且可以在其名称上接受 “min-” 与 “max-” 前缀。 执行其中任一操作都会改变该特性的含义——不再是当特性恰好匹配给定值时为真, 而是在该特性值大于/小于/等于给定值时匹配。

(width >= 600px) 这一 媒体特性 在视口宽度为 600px 或更大 时为真。

另一方面,单独的 (width: 600px) 仅在视口宽度恰好600px 时为真。 若其小于或大于 600px,则为假。

2.4.2. 在布尔上下文中求值媒体特性

虽然 媒体特性 通常具有类似 CSS 属性的语法, 但它们也可以更简单地只写特性名称, 例如 (color)

当以这种方式书写时,该 媒体 特性 会在 布尔上下文 中被求值。 如果该特性在除以下值之外的任意值下都会为真:数字 0、 值为 0<dimension>、 关键字 none、 或该媒体特性明确定义为在布尔上下文中求值为假的某个值, 则该 媒体特性 求值为真。 否则,求值为假。

一些 媒体特性 就是为了以这种方式书写而设计的。

例如,update 通常写作 (update),用于测试是否存在任何形式的更新能力; 或写作 not (update) 来检查相反情况。

它也仍然可以指定显式值, 其中 (update: fast) or (update: slow) 等价于 (update), 而 (update: none) 等价于 not (update)

一些数值型 媒体特性,例如 width, 几乎从不(如果有的话)在 布尔上下文 中求值时有用, 因为它们的值几乎总是大于零。 另一些,例如 color,则具有有意义的零值: (color) 等同于 (color > 0), 表示设备是否具备任何显示颜色的能力。
只有一部分接受关键字的 媒体特性布尔 上下文 中才有意义。

例如,(pointer) 是有用的, 因为 pointer 有一个 none 值, 用于表示设备上根本没有指点设备。 另一方面,(scan) 要么始终为真、要么始终为假 (取决于它是否适用于该设备), 因为它没有任何值表示“假”。

2.4.3. 在范围上下文中求值媒体特性

类型为 “range” 的 媒体特性 也可以改写为 范围上下文 形式,利用其值具有顺序这一事实, 使用普通的数学比较运算符:

( feature name/value > <= < = >= feature value/name value < <= feature name < <= value value > >= feature name > >= value )

注:此语法在《媒体查询》第 4 级中是新增的, 因而目前其支持程度不如 min-/max- 前缀那样广泛。

基本形式由特性名称、 比较运算符 以及一个值组成; 当该关系成立时返回真。

例如,(height > 600px)(或 (600px < height)) 当视口高度大于 600px 时返回真。

其余形式中, 特性名称嵌套在两个值比较之间; 当两次比较都为真时返回真。

例如,(400px < width < 1000px) 当视口宽度介于 400px1000px 之间(但不等于任一边界)时返回真。

一些 “range” 类型的媒体特性被称为 在负值范围内为假。 这意味着负值是有效的且必须被解析,并且 查询该媒体特性是否等于、小于、或小于等于 任意这样的负值时必须求值为假。 查询该媒体特性是否大于、或大于等于某个负值时, 若该关系成立则求值为真。

注:如果在解析阶段就拒绝负值, 那么根据错误处理规则, 它们会被当作 unknown 来处理。 但在现实中, 设备的 resolution 是否为 -300dpi 并非未知, 而是已知为假。 同样地,对于任何视觉设备而言,被目标化的显示区域的 width 已知大于 -200px。 上述规则反映了这一点, 使直觉与 UA 的行为保持一致。

以下示例会在所有视觉设备上得到绿色背景:
@media not (width <= -100px) {
  body { background: green; }
}
@media (height > -100px) {
  body { background: green; }
}
@media not (resolution: -300dpi) {
  body { background: green; }
}
这与《媒体查询》第 3 级 [MEDIAQUERIES-3] 相比是一项行为变更: 在第 3 级中,这些属性上的负值会导致语法错误。 在第 3 级里,语法错误——包括被禁止的值——会使整个 媒体查询 为假, 而不是像本级定义的那样按 unknown 处理。 从第 3 级升级的实现应确保: 当它们为 § 2.5 组合媒体特性 中定义的更丰富语法添加支持时, 要相应更改相关属性对负值的处理方式, 以避免引入非预期语义。
测试

2.4.4. 在范围特性上使用 “min-” 与 “max-” 前缀

与其如上所述在范围上下文中对一个 “range” 类型的 媒体特性 求值, 该特性也可以写作普通的 媒体特性, 但在特性名称上加上 “min-” 或 “max-” 前缀。

这等价于在 范围上下文 中对该特性求值,如下:

注:因为 “min-” 与 “max-” 都等价于包含边界值的范围比较, 所以在某些情况下它们可能会带来限制。

例如, 作者若试图用 “min-” 与 “max-” 基于视口宽度的断点定义不同样式, 通常会对其比较的值作偏移, 以确保两个查询不会同时求值为真。 假设断点在 320px,作者在概念上会使用:
@media (max-width: 320px) { /* 适用于视口 <= 320px 的样式 */ }
@media (min-width: 321px) { /* 适用于视口 >= 321px 的样式 */ }

虽然这确保当视口宽度为 320px 时两组样式不会同时应用, 但它没有考虑到可能出现小数视口尺寸的情况——这可能由非整数像素密度导致 (例如高 DPI 显示器,或缩放/比例变换的结果)。 任何落在 320px 与 321px 之间的视口宽度都会导致两边样式都不生效。

绕过这一问题的一种方法是提高用于比较的值的精度。基于上面的示例, 将第二个比较值改为 320.01px 会显著降低设备上的视口宽度落在缝隙中的概率。

@media (max-width: 320px) { /* 适用于视口 <= 320px 的样式 */ }
@media (min-width: 320.01px) { /* 适用于视口 >= 320.01px 的样式 */ }

不过,在这些情况下,范围上下文 查询(其并不限于“>=”与“<=” 比较)提供了更合适的解决方案:

@media (width <= 320px) { /* 适用于视口 <= 320px 的样式 */ }
@media (width > 320px) { /* 适用于视口 > 320px 的样式 */ }

“Discrete” 类型的属性不接受 “min-” 或 “max-” 前缀。 将此类前缀添加到一个 “discrete” 类型的 媒体特性 上,只会导致特性名称未知。

例如,(min-grid: 1) 是无效的, 因为 grid 是一个 “discrete” 媒体特性, 因而不接受这些前缀。 (即便 grid 媒体特性 看起来是数值型的, 因为它接受 01 作为值。)

尝试在 布尔上下文 中求值一个带 min/max 前缀的 媒体特性 是无效的,并会导致语法错误。

2.5. 组合媒体特性

多个 媒体特性 可以通过完整的布尔代数 (not、and、or)组合成一个 媒体 条件

在媒体查询的同一“层级”中混用 andor 以及 not无效的。 例如,(color) and (pointer) or (hover) 是非法的, 因为其意图不清。 相反,可以用括号将使用某个连接关键字的内容分组, 得到 (color) and ((pointer) or (hover))((color) and (pointer)) or (hover)。 这两者含义差异很大: 若仅 (hover) 为真, 第一个求值为假, 而第二个求值为真。

测试

3. 语法

前文各节中的行文与铁路图中给出了媒体查询语法的非正式描述。 本节描述正式的媒体查询语法, 其中规则/属性的文法语法定义于 [CSS-SYNTAX-3][CSS-VALUES-4]

要解析一个 <media-query-list> 产生式, 先 解析一个以逗号分隔的组件值列表, 然后将返回列表中的每个条目解析为一个 <media-query>。 其值为据此产生的 <media-query> 的列表。

注:<media-query-list> 解析的这一显式定义 对于使 媒体查询列表 的错误恢复行为有明确定义是必要的。

注:<media-query-list> 解析定义 有意接受空列表。

注:根据 [CSS-SYNTAX-3], token 是 ASCII 不区分大小写 的。

<media-query> = <media-condition>
             | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?
<media-type> = <ident>

<media-condition> = <media-not> | <media-in-parens> [ <media-and>* | <media-or>* ]
<media-condition-without-or> = <media-not> | <media-in-parens> <media-and>*
<media-not> = not <media-in-parens>
<media-and> = and <media-in-parens>
<media-or> = or <media-in-parens>
<media-in-parens> = ( <media-condition> ) | <media-feature> | <general-enclosed>

<media-feature> = ( [ <mf-plain> | <mf-boolean> | <mf-range> ] )
<mf-plain> = <mf-name> : <mf-value>
<mf-boolean> = <mf-name>
<mf-range> = <mf-name> <mf-comparison> <mf-value>
           | <mf-value> <mf-comparison> <mf-name>
           | <mf-value> <mf-lt> <mf-name> <mf-lt> <mf-value>
           | <mf-value> <mf-gt> <mf-name> <mf-gt> <mf-value>
<mf-name> = <ident>
<mf-value> = <number> | <dimension> | <ident> | <ratio>
<mf-lt> = '<' '='?
<mf-gt> = '>' '='?
<mf-eq> = '='
<mf-comparison> = <mf-lt> | <mf-gt> | <mf-eq>

<general-enclosed> = [ <function-token> <any-value>? ) ] | [ ( <any-value>? ) ]

<media-type> 产生式不包含关键字 onlynotandorlayer

注:排除 layer 是因为 否则在用于 级联层@import url() layer; 语法中使用时会产生歧义。 参见 [CSS-CASCADE-5]

若出现的话, “<” 或 “>” 的 <delim-token> 与其后续的 “=” <delim-token> 之间不允许出现空白字符。

注:notandor 关键字与其后续的 ( 字符之间必须有空白字符, 因为若没有空白字符,它将被解析为 <function-token>。 这并未被显式定义为无效,因为它已被上述文法所覆盖。 不过,在 ) 与后续关键字之间可以有空白字符。

在解析 <media-in-parens> 产生式时, 只有当输入不匹配前两个分支时, 才必须选择 <general-enclosed> 分支。<general-enclosed> 的存在是为了允许未来以合理兼容的方式扩展文法。

测试

3.1. 求值媒体查询

<media-condition><media-condition-without-or> 的每个主要子表达式 都关联一个布尔结果,如下:

<media-condition>
<media-condition-without-or>
结果为其子表达式的结果。
<media-in-parens>
结果为其子项的结果。
<media-not>
结果为该 <media-in-parens> 项的否定。 unknown 的否定仍为 unknown。
<media-in-parens> <media-and>*
若该 <media-in-parens> 子项 以及所有 <media-and> 子项中的 <media-in-parens> 子项都为真,则结果为真; 若其中至少一个 <media-in-parens> 项为假,则结果为假; 否则为 unknown。
<media-in-parens> <media-or>*
若该 <media-in-parens> 子项 以及所有 <media-or> 子项中的 <media-in-parens> 子项都为假,则结果为假; 若其中至少一个 <media-in-parens> 项为真,则结果为真; 否则为 unknown。
<general-enclosed>
结果为 unknown。

作者不得在其样式表中使用 <general-enclosed>它仅为向前兼容而存在, 以便新的语法扩展不会在旧版用户代理中使 <media-condition> 的太大部分变为无效。

<media-feature>
结果为对指定媒体特性求值得到的结果。

如果上述任一产生式的结果 被用于任何期望二值布尔(true/false)的上下文中, 则必须将 “unknown” 转换为 “false”。

注:这意味着,例如, 当 媒体查询 用于 @media 规则中时, 若其解析为 “unknown”,它将被当作 “false” 处理并且不会匹配。

媒体查询使用三值逻辑:项可以为 “true”、“false” 或 “unknown”。 具体而言,它使用 Kleene 三值逻辑。 在该逻辑中,“unknown” 的含义是“要么为真、要么为假,但我们尚不确定是哪一个”。

一般来说,公式中出现 unknown 值,会导致公式本身也为 unknown, 因为将 unknown 替换为 “true” 得到的结果可能不同于替换为 “false” 得到的结果。 消除 unknown 值的唯一方式是:在一个公式中使用它,使得无论 unknown 被替换为 true 还是 false,公式结果都相同。 这发生在 “false AND unknown”(无论如何都为 false) 与 “true OR unknown”(无论如何都为 true)这两种情况。

之所以采用该逻辑,是因为 <general-enclosed> 需要被赋予一个真值。 在标准布尔逻辑中,唯一合理的值是 “false”, 但这会导致 not unknown(function) 为真, 这可能令人困惑且不受欢迎。 Kleene 三值逻辑确保未知事物会阻止 媒体查询 匹配, 除非其值与最终结果无关。

3.2. 错误处理

不匹配前一节文法的媒体查询在解析时必须被替换为 not all

注:请注意:文法不匹配不会抹除整个 媒体查询列表, 而只会抹除有问题的那个 媒体查询。 上述定义的解析行为会在下一个顶层逗号处自动恢复。

@media (example, all,), speech { /* only applicable to speech devices */ }
@media &test, speech           { /* only applicable to speech devices */ }

以上两个 媒体 查询列表 在解析时都会被转为 not all, speech, 其真值等同于仅 speech

注意:错误恢复只发生在 媒体查询 的顶层; 任何无效括号块内部的内容 都会作为一组被转为 not all。 例如:

@media (example, speech { /* rules for speech devices */ }

由于括号块未闭合, 它将包含从该处开始样式表的全部剩余内容 (除非样式表中碰巧遇到某个不匹配的 “)” 字符), 并将整个内容都转为一个 not all 媒体查询

未知的 <media-type> 必须被当作不匹配来处理。

例如,媒体查询 unknown 为假, 因为 unknown 是一个未知的 媒体类型

not unknown 为真,因为 not 对该为假的媒体类型取了反。

请记住:有些关键字不允许作为 <media-type>, 并会导致解析完全失败: 媒体查询 or and (color) 在解析时会被转为 not all, 而不是仅把 or 当作未知的 媒体类型 来处理。

未知的 <mf-name><mf-value>, 或不匹配该 媒体特性 的值语法的特性值, 会导致结果为 “unknown”。 值为 “unknown” 的 <media-query> 必须被替换为 not all

<link media="screen and (max-weight: 3kg) and (color), (color)"rel="stylesheet" href="example.css" />

由于 max-weight 是一个未知的 媒体特性, 该 媒体查询 列表 在解析时会被转为 not all, (color), 其等价于仅 (color)

@media (min-orientation:portrait) { … }

orientation 特性不接受前缀, 因而这会被视为未知的 媒体特性, 并被转为 not all

媒体查询 (color:20example)color 媒体特性指定了未知值, 因而会被转为 not all
请注意,媒体查询 也受宿主语言的解析规则约束。 例如,考虑以下 CSS 片段:
@media test;,all { body { background:lime } }

媒体查询 test;,all 单独解析时, 等价于 not all, all,它始终为真。 然而,CSS 的解析规则会使 @media 规则, 因而也使 媒体查询, 在分号处结束。 余下文本会被当作一个样式规则来处理, 其选择器与内容均无效。

测试

4. 视口/页面特征媒体特性

4.1. 宽度:width 特性

名称: width
用于: @media
值: <length>
类型: range

width 媒体特性描述输出设备的目标显示区域的宽度。 对于 连续媒体, 这指视口的宽度 (如 CSS2 第 9.1.1 节所述 [CSS2]), 包括已渲染滚动条的尺寸(若有)。 对于 分页媒体,这指页面框的宽度 (如 CSS2 第 13.2 节所述 [CSS2])。

<length> 的解释方式遵循 § 1.3 单位

width负值范围内为假

例如,以下媒体查询表示该样式表用于宽于 25cm 的打印输出:
<link rel="stylesheet" media="print and (min-width: 25cm)" href="http://…" />
以下媒体查询表示该样式表用于视口 (屏幕/纸张中用于渲染文档的部分) 宽度介于 400 到 700 像素之间的设备:
@media (400px <= width <= 700px) { … }
以下媒体查询表示当视口宽度大于 20em 时使用该样式表。
@media (min-width: 20em) { … }

em 的值相对于 初始值font-size

测试

4.2. 高度:height 特性

名称: height
用于: @media
值: <length>
类型: range

height 媒体特性描述输出设备的目标显示区域的高度。 对于 连续媒体, 这指视口的高度,包括已渲染滚动条的尺寸(若有)。 对于 分页媒体,这指页面框的高度。

<length> 的解释方式遵循 § 1.3 单位

height负值范围内为假

4.3. 纵横比:aspect-ratio 特性

名称: aspect-ratio
用于: @media
值: <ratio>
类型: range

aspect-ratio 媒体特性定义为 width 媒体特性的值 与 height 媒体特性的值之比。

测试

4.4. 方向:orientation 特性

名称: orientation
用于: @media
值: portrait | landscape
类型: discrete
portrait
height 媒体特性的值大于或等于 width 媒体特性的值时, orientation 媒体特性为 portrait
landscape
否则,orientationlandscape
以下媒体查询测试 “portrait”(纵向)方向, 类似于手机竖直握持时的状态。
@media (orientation:portrait) { … }

4.5. 块轴溢出:overflow-block 特性

名称: overflow-block
用于: @media
值: none | scroll | paged
类型: discrete

overflow-block 媒体特性描述当内容在 块轴 上溢出初始包含块时, 设备的行为。

none
块轴 上不存在处理溢出的手段; 任何溢出的内容都将直接不显示。 示例:广告牌
scroll
通过允许用户滚动来暴露 块轴 上的溢出内容。 示例:计算机屏幕
paged
内容被拆分为离散页面; 在 块轴 上溢出某页的内容 将显示在下一页。 示例:打印机、电子书阅读器

匹配 nonescroll 的媒体称为 连续 媒体, 而匹配 paged 的媒体称为 分页媒体

注:未来可能会为此媒体特性添加额外值, 以描述具有混合行为(结合了 连续分页媒体 方面特征)的用户代理类别。 例如,Presto 排版引擎(现已停止维护)曾带有一种半分页的展示模式, 其行为类似于 continuous,但会遵循强制分页符。 由于目前未知有任何仍在发布的用户代理具有这种行为类型, 工作组决定在本级中不添加此类值, 以避免对任何此类用户代理作出不恰当的描述。 任何实现了上述取值都无法充分描述的用户代理者, 鼓励联系工作组, 以便考虑对该媒体特性的扩展。

测试

4.6. 行内轴溢出:overflow-inline 特性

名称: overflow-inline
用于: @media
值: none | scroll
类型: discrete

overflow-inline 媒体特性描述当内容在 行内轴 上溢出初始包含块时, 设备的行为。

none
行内 轴 上不存在处理溢出的手段; 任何溢出的内容都将直接不显示。
scroll
通过允许用户滚动来暴露 行内 轴 上的溢出内容。

注:目前未知存在对行内方向溢出内容进行分页(paged overflow)的实现, 并且这一概念本身似乎也不太合理, 因此对于 overflow-inline, 有意不提供 paged 值。

4.7. 水平视口分段:horizontal-viewport-segments 特性

名称: horizontal-viewport-segments
用于: @media
值: <integer>
类型: range

horizontal-viewport-segments 媒体特性描述 视口在水平方向上的逻辑分段数量。

horizontal-viewport-segments 媒体特性在 负值范围内为假

当视口被一个或多个硬件特性(例如折痕或位于不同显示屏之间的铰链)分割, 且这些硬件特性作为逻辑分隔符时,分段指的是视口中可被页面视为逻辑上彼此独立的区域。

4.8. 垂直视口分段:vertical-viewport-segments 特性

名称: vertical-viewport-segments
用于: @media
值: <integer>
类型: range

vertical-viewport-segments 媒体特性描述 视口在垂直方向上的逻辑分段数量。

vertical-viewport-segments 媒体特性在 负值范围内为假

该媒体查询检测一个恰好具有两个并排分段的视口。
@media (horizontal-viewport-segments: 2) and (vertical-viewport-segments: 1) { … }

4.9. 显示模式:display-mode 媒体 特性

名称: display-mode
用于: @media
值: fullscreen | standalone | minimal-ui | browser | picture-in-picture
类型: discrete

display-mode 媒体特性描述当前 浏览上下文 目前呈现给最终用户的模式。在子浏览上下文中,显示模式 必须与 顶层浏览上下文 的显示模式一致。

该特性主要用于确定用户代理对某个 应用上下文 应用了哪一种 显示模式。 因此,该特性的取值与 [APPMANIFEST] 中定义的 显示模式 相对应。 不过,它也可用于非应用上下文中,以确定视口是否处于其他模式,例如 全屏或画中画。

fullscreen
浏览上下文在隐藏浏览器 UI 元素的情况下显示,并占据全部可用显示区域。全屏上下文可能由 fullscreen 显示模式(在 应用清单 中)导致, 或由 Fullscreen API 中元素的 requestFullscreen() 方法触发, 或通过其他方式(例如用户使用用户代理内置控件手动激活全屏模式)。

对应于 fullscreen 显示模式。

standalone
正在使用 standalone 显示模式。仅适用于 应用上下文
minimal-ui
正在使用 minimal-ui 显示模式。仅适用于 应用上下文
browser
浏览上下文使用平台特定的惯例来打开用户代理中的超链接 (例如在浏览器标签页中,或带有地址栏等控件的网页浏览器窗口中)。 这应当用于不适合任何其他显示模式的非 应用上下文

对应于 browser 显示模式。

picture-in-picture
该模式允许用户在与设备上的其他站点或应用交互时继续观看媒体内容。 浏览上下文显示在一个浮动且始终置顶的窗口中。 用户代理可能会包含其他平台特定的 UI 元素, 例如 “back-to-tab” 与 “site information” 按钮, 或平台与用户代理的惯常做法中的其他元素。
例如,应用清单 可以按如下方式请求 standalone 显示模式
{
  "display": "standalone"
}

该媒体查询可用于确定用户代理是否确实应用了 standalone 模式:

@media (display-mode: standalone) {}

用户代理可以将 display-mode 设为其他任一值, 取决于当前实际使用的模式。

fullscreen 显示 模式不同于 Fullscreen API

fullscreen 作为 display-mode 的取值, 与 CSS 的 :fullscreen 伪类 并无直接关系。 :fullscreen 伪类仅在某元素被置入全屏元素栈时才匹配该元素。 然而,对某元素调用 requestFullscreen() 方法(使用 Fullscreen API)的副作用之一, 可能是浏览器进入操作系统层面的全屏模式; 在这种情况下,:fullscreen(display-mode: fullscreen) 都会匹配。

在某些平台上, 用户——或 Web Application Manifest——可以在不调用 Fullscreen API 的情况下, 将 Web 应用置于全屏。 发生这种情况时, :fullscreen 伪类不会匹配, 但 (display-mode: fullscreen) 会匹配。 以下 CSS 代码示例体现了这一点:
/* 当视口处于全屏时生效 */
@media (display-mode: fullscreen) {}

/* 当某个元素处于全屏时生效 */
#game:fullscreen {}

注:未来可能会为此媒体特性添加额外值, 以匹配 [APPMANIFEST] 中新增的 显示模式

测试

5. 显示质量媒体特性

5.1. 显示分辨率:resolution 特性

名称: resolution
用于: @media
值: <resolution> | infinite
类型: range

resolution 媒体特性描述输出 设备的分辨率,即像素密度;它会考虑 页面缩放,但假定 缩放因子 为 1.0。

resolution 媒体特性 在负值范围内为假

在查询像素非正方形的媒体时,resolution 查询的是垂直维度上的密度。

对于打印机,这对应于加网分辨率 (用于打印任意颜色打印点的分辨率)。 打印机可能具有不同的灰度打印分辨率。

对于不受分辨率物理约束的输出介质 (例如输出到矢量图形), 此特性必须匹配 infinite 值。 为了在 范围上下文 中对该媒体特性求值, infinite 必须被视为大于任何可能的 <resolution>。 (也就是说,类似 (resolution > 1000dpi) 这样的查询 在 infinite 媒体上将为真。)

该媒体查询仅用于检测“高分辨率”屏幕 (其硬件像素与 CSS px 的比值至少为 2):
@media (resolution >= 2dppx)
例如,该媒体查询表示样式表用于分辨率大于每 CSS in 300 个点的设备:
@media print and (min-resolution: 300dpi) { … }

该媒体查询等价,但使用了 CSS cm 单位:

@media print and (min-resolution: 118dpcm) { … }
<resolution> 并不指每物理长度单位内的设备像素数量, 而是指每个 css 单位内的设备像素数量。 这种映射由用户代理完成, 因此对用户代理来说始终是已知的。

如果用户代理要么不了解物理像素的几何形状, 要么了解物理像素的几何形状且它们(足够接近)为正方形, 那么它不会在每个轴向上将不同数量的设备像素映射为 css 像素, 因而垂直与水平分辨率之间也就没有差异。

否则,如果 UA 选择在每个轴向上映射不同的数量, 那么这将是为了响应物理像素并非正方形这一事实。UA 如何获得此知识超出范围,但 在拥有足够信息以作出该决定的情况下, 当设备旋转 90 度时,它可以反转该映射。

5.2. 显示类型:scan 特性

名称: scan
用于: @media
值: interlace | progressive
类型: discrete

scan 媒体特性描述某些输出设备的扫描过程。

interlace
CRT 与某些类型的等离子电视屏幕使用“隔行”渲染, 视频帧在仅指定屏幕上的“偶数”行与仅指定“奇数”行之间交替, 利用多种自动的心理图像校正能力来产生平滑运动。 这使它们能够以一半的带宽成本模拟更高 FPS 的广播。

在隔行屏幕上显示时, 作者应避免在屏幕上进行非常快速的移动,以避免产生“梳状(combing)”, 并应确保屏幕上的细节宽度大于 1px,以避免 “twitter”

progressive
使用“逐行”渲染的屏幕会完整显示每一帧, 无需特殊处理。

大多数现代屏幕,以及所有计算机屏幕,都使用逐行渲染。

例如,衬线字体中字母的“脚(feet)”是非常小的特征, 可能在隔行设备上引发 “twitter”。 scan 媒体特性可用于检测这一点, 并改用更不易出现 “twitter” 的替代字体:
@media (scan: interlace) { body { font-family: sans-serif; } }

注:在撰写本文时,所有已知实现都匹配 scan: progressive,而不是 scan: interlace

5.3. 检测控制台显示:grid 特性

名称: grid
用于: @media
值: <mq-boolean>
类型: discrete

grid 媒体特性用于查询输出设备是网格(grid)还是位图(bitmap)。 如果输出设备基于网格 (例如 “tty” 终端,或仅提供一种固定字体的手机显示器), 其值为 1。 否则,其值为 0。

<mq-boolean> 值类型是取值为 01<integer>。 任何其他整数值都是无效的。注意:在 CSS 中 -0 总是等价于 0, 因此它也被接受为一个有效的 <mq-boolean> 值。

注:<mq-boolean> 类型仅为兼容旧有用途而存在。 如果今天再设计这个特性, 它将会为其取值使用规范的具名关键字。

下面是一个检测窄控制台屏幕的示例:
@media (grid) and (max-width: 15em) { … }

注:在撰写本文时,所有已知实现都匹配 grid: 0,而不是 grid: 1

5.4. 显示更新频率:update 特性

名称: update
用于: @media
值: none | slow | fast
类型: discrete

update 媒体特性用于查询输出设备在内容渲染后 修改其外观的能力。 它接受以下值:

none
一旦渲染完成,布局将无法再更新。 示例:打印在纸上的文档。
slow
布局可以按照 CSS 的通常规则动态变化, 但输出设备无法足够快速地渲染或显示变化, 从而使其被感知为平滑动画。 示例:电子墨水屏或性能严重不足的设备。
fast
布局可以按照 CSS 的通常规则动态变化, 且输出设备在速度上没有异常限制, 因此可以使用诸如 CSS Animations 这类需要定期更新的效果。 示例:计算机屏幕。
例如,如果某页面将链接样式设置为仅在悬停时添加下划线, 那么在打印时它可能希望始终显示下划线:
@media (update) {
  a { text-decoration: none; }
  a:hover, a:focus { text-decoration: underline; }
}
/* In non-updating UAs, the links get their default underline at all times. */
测试

5.5. 检测显示技术: environment-blending 特性

名称: environment-blending
用于: @media
值: opaque | additive | subtractive
类型: discrete

environment-blending 媒体特性用于查询用户显示设备的特征, 以便作者可以调整文档的样式。 作者可能会根据显示技术选择调整页面的视觉效果和/或布局, 以增强吸引力或提高可读性。

以下取值有效:

opaque
文档渲染在不透明介质上,例如传统显示器或纸张。 黑色是暗的,白色是 100% 亮度。
additive
显示设备使用加色混合将画布的颜色与现实世界融合。 黑色是完全透明的,白色是 100% 亮度。

例如:汽车中的平视显示器。

subtractive
显示设备使用减色混合将画布的颜色与现实世界融合。 白色是完全透明的,而深色具有最高对比度。

例如:嵌入浴室镜中的 LCD 显示屏。

是否需要 subtractive 这个值?

body { background-color: white; }
p { color: black; }

@media(environment-blending: additive) {
  body { background-color: black; }
  p { color: white; font-size: 16px; font-weight: 1000; }
}

6. 颜色媒体特性

6.1. 色彩深度:color 特性

名称: color
用于: @media
值: <integer>
类型: range

color 媒体特性描述输出设备每个颜色分量的位数。 如果设备不是彩色设备,其值为零。

color 在负值范围内为假

例如,下面两个媒体查询都表示样式表适用于所有彩色设备:
@media (color) { … }
@media (min-color: 1) { … }
该媒体查询表示样式表适用于 每个颜色分量至少为 8 位的彩色设备:
@media (color >= 8) { … }

如果不同颜色分量用不同的位数表示, 则使用其中最小的位数。

例如,如果一个 8 位色彩系统 用 3 位表示红色分量、用 3 位表示绿色分量、用 2 位表示蓝色分量, 则 color 媒体特性的值将为 2。

在使用索引色的设备中, 使用查找表中每个颜色分量的最小位数。

注:所描述的功能只能在较浅层面上描述颜色能力。 color-gamut 通常更符合作者需求。 如果需要进一步功能, RFC2879 [RFC2879] 提供了更具体的媒体特性, 这些特性可能在后续阶段得到支持。

6.2. 调色板彩色屏幕:color-index 特性

名称: color-index
用于: @media
值: <integer>
类型: range

color-index 媒体特性描述输出设备颜色查找表中的条目数量。 如果设备不使用颜色查找表,其值为零。

color-index 在负值范围内为假

例如,下面两种写法都可以表达样式表适用于所有索引色设备:
@media (color-index) { … }
@media (color-index >= 1) { … }
该媒体查询表示样式表适用于颜色查找表条目数为 256 或更多的索引色设备:
<?xml-stylesheet media="(min-color-index: 256)"
  href="http://www.example.com/…" ?>

6.3. 单色屏幕:monochrome 特性

名称: monochrome
用于: @media
值: <integer>
类型: range

monochrome 媒体特性描述单色帧缓冲区中每像素的位数。 如果设备不是单色设备, 输出设备的值将为 0。

monochrome 在负值范围内为假

例如,以下写法表示样式表适用于所有单色设备:
@media (monochrome) { … }
表达样式表适用于每像素位数大于 2 的单色设备:
@media (monochrome >= 2) { … }
表达彩色页面使用一份样式表,而单色页面使用另一份:
<link rel="stylesheet" media="print and (color)" href="http://…" />
<link rel="stylesheet" media="print and (monochrome)" href="http://…" />

6.4. 色彩显示质量:color-gamut 特性

名称: color-gamut
用于: @media
值: srgb | p3 | rec2020
类型: discrete

color-gamut 媒体特性描述 UA 与输出设备所支持的近似颜色范围。 也就是说,如果 UA 接收到指定色彩空间中的颜色内容, 它可以促使输出设备渲染出对应的颜色, 或者渲染出足够接近的颜色。

注:该查询使用近似范围有几个原因。 首先,显示硬件存在大量差异。 例如,某设备可能声称支持 “Rec. 2020”,但实际上其渲染能力显著低于完整色域。 其次,不同设备支持的色彩范围非常多,逐一列举会很繁琐。 在大多数情况下,作者不需要知道显示器的精确能力, 只需要知道它是否优于 sRGB, 或是否显著优于 sRGB。 这样他们就可以向用户提供带有色彩配置文件标记的合适图像。

srgb
UA 与输出设备能支持近似 sRGB 色域或更大范围。

注:预计绝大多数彩色显示器 都能够对这类查询返回真。

p3
UA 与输出设备能支持近似 Display P3 [Display-P3] 色彩空间所指定的色域或更大范围。

注:p3 色域 大于且包含 srgb 色域。

rec2020
UA 与输出设备能支持近似 ITU-R Recommendation BT.2020 色彩空间所指定的色域或更大范围。

注:rec2020 色域 大于且包含 p3 色域。

下表以色彩空间色度坐标的形式列出了这些色彩空间的原色, 如 [COLORIMETRY] 中所定义。

色彩空间 白点 原色
绿
xW yW xR yR xG yG xB yB
srgb 0.3127 0.3290 0.640 0.330 0.300 0.600 0.150 0.060
p3 0.3127 0.3290 0.680 0.320 0.265 0.690 0.150 0.060
rec2020 0.3127 0.3290 0.708 0.292 0.170 0.797 0.131 0.046

注:上表不包含足以完整描述这些色彩空间的信息, 但足以用于确定输出设备是否近似覆盖其各自的色域。 参见 [SRGB] 以了解更多 sRGB 信息,参见 [Display-P3] 以了解更多 Display P3 信息, 以及参见 [ITU-R-BT-2020-2] 以了解更多关于 ITU-R Recommendation BT.2020 的信息。

例如,当显示器支持 Display P3 范围内的颜色时, 该媒体查询将生效:
@media (color-gamut: p3) {}

注:如果输出设备的完整输出色域足够大, 或者一个色域是另一个受支持色域的子集, 那么输出设备可能会对该媒体特性的多个取值返回真。 因此,最佳用法是按“递增”方式使用该特性——当 (color-gamut: srgb) 为真时设置一个基础值, 然后在 (color-gamut: p3) 为真时覆盖它,依此类推。

注:某些输出设备, 例如单色显示器, 甚至无法支持 srgb 色域。 要测试这些设备, 你可以在否定的布尔上下文形式中使用该特性:not (color-gamut)

测试

6.5. 动态范围:dynamic-range 特性

名称: dynamic-range
用于: @media
值: standard | high
类型: discrete

dynamic-range 表示由用户代理与输出设备所支持的最大亮度、 色彩深度与对比度(contrast ratio)的组合。

high
用户代理与输出设备满足以下全部条件:

注:某些设备具备高动态范围能力, 但该能力并非始终开启, 需要被激活 (有时通过编程、有时由用户、有时基于内容)。 该媒体特性不测试此类模式是否处于激活状态, 只测试设备是否具备高动态范围视觉能力。

standard
该值匹配任何视觉设备, 而不匹配缺乏视觉能力的设备。

注:该媒体特性的多个值可以同时匹配: 匹配 high 的用户代理也将匹配 standard

6.5.1. 确定显示器的对比度与亮度

峰值亮度 指最亮点能达到的亮度: 对于诸如 LCD 屏幕这类发光设备,指其可产生的最亮点; 对于诸如纸张或电子墨水屏这类反光设备, 则指其对光吸收最少的点。

注:某些设备只能在短时间内,或在其表面某个较小区域内, 产生其 峰值亮度

对比度(contrast ratio) 是 系统所能产生的最亮颜色的亮度 与最暗颜色的亮度之比。

本规范未定义可用于测量这些特性的精确方法; 它也允许用户代理自行决定 何为 对比度, 以及何为 峰值亮度。 不过,用户代理仍必须尝试符合以下意图: 具备 高峰值亮度 的设备能够显示“亮于白色”的高光, 而在具备此能力的同时还能呈现深黑 (而不是整体很亮但发灰的图像), 则表明其具备 高对比度

注:dynamic-rangevideo-dynamic-range 的判定会因用户代理而异, 但预计其语义总体上是可依赖的。

测试

6.6. 检测显示器上的反色:inverted-colors 特性

名称: inverted-colors
用于: @media
值: none | inverted
类型: discrete

inverted-colors 媒体特性表明内容是正常显示, 还是颜色已被反转。

注:这表示用户代理或底层操作系统已强制反转所有颜色, 而不是请求作者这么做。 这有时作为一种简单的无障碍功能提供, 允许用户在浅底深字与深底浅字之间切换。 然而,这会产生令人不悦的副作用, 例如反转图片, 或将阴影变成高光, 从而降低内容的可读性。

none
颜色正常显示。
inverted
显示区域内的所有像素都已被反转。

如果用户代理做了某种内容感知的反转 (例如能保留图像的反转), 则该值不得匹配。

注:这是因为该媒体特性的目标是使作者能够缓解 “非内容感知”的方式所带来的不良影响——这种方式会反转全部像素。 如果作者即使在内容感知的情形下也采取对策, 则作者的对策与 UA 的对策可能相互抵消。

取决于其样式表, 作者可能希望反转图像与视频:
@media (inverted-colors) {
  img:not(picture > img), picture, video {
    filter: invert(100%);
  }
}

作者也可以反转通过 CSS 注入的图像(例如背景), 或禁用阴影:

@media (inverted-colors) {
  * {
    text-shadow: none !important;
    box-shadow: none !important;
  }
}
测试

7. 交互媒体特性

“交互(interaction)”媒体特性反映用户与页面交互方式的各个方面。

匹配 pointerhover 组合的设备典型示例:
pointer: none pointer: coarse pointer: fine
hover: none 仅键盘控制、顺序式/空间式(方向键 d-pad)焦点导航 智能手机、触摸屏 基础触控笔数字化设备(Cintiq、Wacom 等)
hover: hover Nintendo Wii 控制器、Kinect 鼠标、触控板、高级触控笔数字化设备(Surface、Samsung Note、Wacom Intuos Pro 等)

pointerhover 特性与“主要(primary)”指点设备的特性相关, 而 any-pointerany-hover 可用于查询所有可能可用的指点设备的属性。

注:虽然本规范未定义用户代理应如何决定何者为“主要(primary)”指点设备, 但预期用户代理应通过综合以下因素来做出判断: 其运行所在的设备/环境信息、 可用指点设备的数量与类型、 以及这些设备通常和/或当前正在被使用的程度。 在某些情形下,设备的主要输入机制并非指点设备, 但存在一个作为次要输入、且使用频率较低的指点设备输入, 用户代理可以决定将非指点设备视为主要输入机制(从而得到 'pointer: none')。 用户代理也可以决定动态更改被视为主要指点设备的类型, 以响应用户环境的变化 或用户与 UA 交互方式的变化。

注:pointerhoverany-pointerany-hover 特性仅与指点设备的特征(或完全不存在)相关, 不能用于检测诸如键盘等非指点设备输入机制的存在。 作者应当考虑到非指点设备输入的潜在存在, 而不应仅根据查询这些特性匹配到的取值来推断。

虽然 pointerhover 可用于根据主要输入机制的特性(或主要指点设备的完全缺失) 来设计页面的主要样式与交互模式, 但作者应强烈考虑使用 any-pointerany-hover,以将检测到的所有可能类型的指点设备纳入考虑。

7.1. 指点设备质量:pointer 特性

名称: pointer
用于: @media
值: none | coarse | fine
类型: discrete

pointer 媒体特性用于查询诸如鼠标之类的指点设备的存在与精确度。 若存在多个指点设备, pointer 媒体特性必须反映用户代理所确定的“主要(primary)”指点设备的特征。 (若要查询可用的任意指点设备的能力, 参见 any-pointer 媒体特性。)

none
设备的主要输入机制不包含指点设备。
coarse
设备的主要输入机制包含精确度有限的指点设备。 示例包括触摸屏与动作检测传感器(例如 Xbox 的 Kinect 外设)。
fine
设备的主要输入机制包含精确的指点设备。 示例包括鼠标、触控板与绘图触控笔。

coarsefine 都表示存在指点设备, 但在精确度上有所不同。 若在缩放因子为 1 时,很难或不可能可靠地点选多个彼此相邻且较小的目标之一, 则该指点设备可被归类为 coarse。 更改缩放级别不会影响该媒体特性的值。

注:由于 UA 可能为用户提供缩放能力, 或次要指点设备可能具备不同精确度, 即便该媒体特性的值为 coarse,用户仍可能进行精确点击。 该媒体特性并不表示用户永远无法精确点击, 只表示对他们而言这样做不方便。 预期作者在遇到 coarse 值时, 应通过设计不依赖精确点击即可操作的页面来作出响应。

出于无障碍原因, 即便在其指点设备可描述为 fine 的设备上, UA 也可以对该媒体查询给出 coarsenone 的值, 以表明用户在精确操纵指点设备方面存在困难,或完全无法操纵。 此外,即便主要指点设备具备 fine 指点精度, 用户也可能额外拥有可用的 coarse 指点设备。 作者可能希望查询 any-pointer 媒体特性,以将这些其他潜在的 coarse 指点设备纳入考虑。

/* 如果主要指点设备精度不足,则放大单选按钮与复选框 */
@media (pointer:coarse) {
  input[type="checkbox"], input[type="radio"] {
    min-width:30px;
    min-height:40px;
    background:transparent;
  }
}

7.2. 悬停能力:hover 特性

名称: hover
用于: @media
值: none | hover
类型: discrete

hover 媒体特性用于查询用户是否能够使用主要指点设备在页面元素上悬停。 如果设备有多个指点设备, hover 媒体特性必须反映用户代理所确定的“主要(primary)”指点设备的特征。 (若要查询可用的任意指点设备的能力, 参见 any-hover 媒体特性。)

none
表示主要指点设备无法悬停, 或者根本没有指点设备。 示例包括触摸屏与使用基础绘图触控笔的屏幕。

能够悬停但悬停操作不方便、且不是其正常使用方式的指点设备, 也匹配该值。 例如,对触摸屏而言,若将长按视作悬停, 则它会匹配 hover: none

hover
表示主要指点设备可以轻松地在页面局部区域上悬停。 示例包括鼠标与可对屏幕进行物理指向的设备,例如 Nintendo Wii 控制器。
例如,在一台触摸屏设备上,如果它还可以由可选的鼠标控制, 那么 hover 媒体特性 应当匹配 hover: none, 因为主要指点设备(触摸屏)不允许用户悬停。

然而,尽管如此,可选鼠标仍允许用户悬停。 因此作者应谨慎,不要假定在 'hover:none' 为真的设备上 :hover 伪类 永远不会匹配; 但他们应当设计不依赖悬停也能完全可用的布局。

出于无障碍原因,即便设备确实支持悬停, UA 也可能对该媒体查询给出 hover: none 的值, 以选择使用无需悬停也能良好工作的布局。 注意:即便主要输入机制具备 'hover: hover' 能力, 用户也可能拥有额外的输入机制,它们并不提供悬停能力。

/* 仅在能方便悬停的设备上使用悬停触发的下拉菜单。 */
@media (hover) {
  .menu > li        {display:inline-block;}
  .menu ul          {display:none; position:absolute;}
  .menu li:hover ul {display:block; list-style:none; padding:0;}
  /* ... */
}

7.3. 所有可用交互能力:any-pointerany-hover 特性

名称: any-pointer
用于: @media
值: none | coarse | fine
类型: discrete
名称: any-hover
用于: @media
值: none | hover
类型: discrete

any-pointerany-hover 媒体特性与 pointerhover 媒体特性相同, 但它们对应于用户所有可用指点设备能力的并集。 对于 any-pointer, 如果不同指点设备的特征不同,则可能有多个取值同时匹配。

any-pointerany-hover 只有在以下情况才必须匹配 none全部指点设备在对应查询下都将匹配 none, 或者根本不存在任何指点设备。

any-pointer 用于查询指点设备的存在与精确度。 它不考虑任何额外的非指点设备输入, 也不能用于测试其他输入机制(如方向键 d-pad 或仅键盘控制)的存在, 因为这些机制不会移动屏幕上的指针。 'any-pointer:none' 仅在完全不存在任何指点设备时才会求值为真。
在传统桌面环境中(有鼠标与键盘), 'any-pointer:none' 将为假(因为存在鼠标), 即便也存在非指点输入(键盘)。
'any-hover:none' 仅在不存在指点设备时才会求值为真, 或者当前存在的全部指点设备都缺乏悬停能力时才会为真。 因此,应将其理解为用于测试是否存在任意具备悬停能力的指点设备, 而不是用于判断是否存在任意不具备悬停能力的指点设备。 后一种情况目前无法通过 any-hover 或任何其他交互媒体特性确定。 此外,它也不考虑任何非指点设备输入, 如方向键 d-pad 或仅键盘控制, 而这些输入机制按其本质也不具备悬停能力。
在一台支持触控的笔记本电脑上(带鼠标与触摸屏), 'any-hover:none' 会求值为假(因为存在具备悬停能力的鼠标), 即便也存在不具备悬停能力的指点设备(触摸屏)。 目前无法针对不同指点设备具有不同悬停能力的情况提供不同样式。
仅因为 any-hoverany-pointer 指示至少有一种可用输入机制具备这些能力, 就设计依赖悬停或精确指点的页面, 很可能会导致糟糕体验。 不过,作者可以使用此信息来辅助其关于样式与功能的决策, 以基于用户可用的额外指点设备来提供相应能力。
许多智能电视都提供控制屏幕光标的方式, 但往往是相当基础的控制器,难以精确操作。

此类智能电视中的浏览器会以 coarse 作为 pointerany-pointer 的取值,使作者能够提供具有较大、易于触达的点击目标的布局。

用户也可能将蓝牙鼠标与电视配对, 并偶尔为了方便而使用它, 但鼠标并不是操作电视的主要方式。 pointer 仍匹配 coarse, 而 any-pointer 现在同时匹配 coarsefine

仅基于 (any-pointer: fine) 现在为真这一事实而切换到小型点击目标是不合适的。 这不仅会让用户感到意外——因为体验与他们在电视上的预期不一致, 还可能非常不便: 鼠标并非控制电视的主要方式,可能够不着, 被藏在沙发的某个坐垫下面……

相比之下,再考虑在同一台电视上的滚动操作。 没有精确指点设备时,滚动条很难操控。 在已基于 (pointer: coarse) 为真而准备了替代方式来提示还有更多内容可见之后, 作者可能仍希望在 (any-pointer: fine) 为真时额外显示滚动条; 或者在 (any-pointer: fine) 为假时彻底隐藏滚动条,以减少视觉杂乱。

名称: nav-controls
用于: @media
值: none | back
类型: discrete

nav-controls 媒体特性使作者能够了解: 用户代理是否在其用户界面中提供 显而易见(obviously discoverable)的导航控件。

注:传统浏览器通常确实会提供此类控件, 网页通常也无需关心这一点; 但在某些上下文中, Web 应用会通过所谓的 web-view 运行, 而这类环境并不总是具备完整的用户界面。 因此,让作者知道用户代理提供了哪些能力是有用的, 以便他们考虑是否需要提供一种易于发现的替代方案。

在此上下文中,显而易见(obviously discoverable) 指的是以下控件: 要么在用户界面中直接可见(例如按钮), 要么是该设备用户界面中典型的其他形式控件,且用户可轻易识别。 在视觉用户界面的情形下, 这通常是一个可见控件; 不过在音频或触觉用户界面中也可能是其他东西。 重要的是, 这并非指键盘快捷键或手势; 即便它们很方便, 但仅通过观察(在视觉 UI 的情况下)用户代理本身并不能显而易见地发现它们。

以下取值有效:

none
用户代理没有任何 显而易见(obviously discoverable)的导航控件, 尤其是不包含使用户代理返回到页面之前的 会话历史条目 的控件。
back
用户代理提供导航控件, 包括至少一个 显而易见(obviously discoverable)的控件, 使用户代理返回到页面之前的 会话历史条目 (通常为“返回”按钮)。
作者可以在其 Web 应用中包含一个返回按钮, 并在用户代理已提供该功能时有条件地将其隐藏:
@media (nav-controls: back) {
  #back-button {
    display: none;
  }
}

由于该媒体特性可用于 布尔上下文, 同一示例可用更短语法书写:

@media (nav-controls) {
  #back-button {
    display: none;
  }
}

注:理论上两者并非严格等价, 因为该媒体特性在未来扩展中可能会出现除 back 之外的新取值, 并且这些取值可能在 back 不匹配时仍能匹配。 在这种情况下,在布尔上下文中使用 nav-controls 特性可能会产生误导。 不过,鉴于导航返回可以说是最基础的导航操作, CSS 工作组预计不会出现“有显式导航控件但没有返回按钮”的用户界面, 因此预计这一问题在实践中不会发生。

显而易见(obviously discoverable)控件是否处于激活状态,不影响该媒体特性的求值。

如果页面没有之前的 会话历史条目, 具有“返回”按钮的用户代理可能会将其切换为禁用状态, 在确实存在可返回的历史之前都无法与之交互。 在这种情况下,仍预期 @media (nav-controls: back) { … } 能够匹配。

8. 视频前缀特性

一些用户代理,包括许多电视,会在两个独立的“平面”(双平面)中呈现视频和图形,这些平面具有不同的屏幕特性。提供了一组视频前缀特性用于描述视频平面。

任何双平面实现必须基于视频平面返回以下特性的值: video-color-gamut; video-dynamic-range. 所有其他特性必须基于图形平面返回值。

非双平面实现必须为视频前缀特性及其无前缀对应项返回相同的值。

8.1. 视频色域显示质量:video-color-gamut 特性

名称: video-color-gamut
适用: @media
取值: srgb | p3 | rec2020
类型: 离散

The video-color-gamut 媒体特性描述 UA 和输出设备的视频平面所支持的近似颜色范围。也就是说,如果 UA 接收到指定色彩空间的内容,它可以使输出设备渲染适当的颜色,或者渲染一个足够接近的颜色。

取值和色彩空间定义与 color-gamut 相同。

8.2. 视频动态范围: video-dynamic-range 特性

名称: video-dynamic-range
适用: @media
取值: standard | high
类型: 离散

video-dynamic-range 表示 UA 和输出设备的视频平面所支持的最大亮度、色深和对比度的组合。

支持的值与 dynamic-range 相同。

9. 脚本化媒体特性

9.1. 脚本支持: scripting 特性

名称: scripting
适用: @media
取值: none | initial-only | enabled
类型: 离散

The scripting 媒体特性用于查询当前文档是否支持脚本语言,例如 JavaScript。

enabled
表示用户代理支持页面脚本,并且当前文档在其生命周期内脚本是启用的。
initial-only
表示用户代理支持页面脚本,并且当前文档在初始页面加载期间脚本是启用的,但之后不再支持。 例如用于打印的页面,或在服务器上渲染页面并向用户发送近乎静态版本页面的预渲染网络代理。

是否应该为 UA 在声称 initial-only 之前设置一个明确的最低阈值?有一个阈值会让作者知道他们可以依赖什么,并据此调整脚本。另一方面,确定该阈值很困难:如果设置得太低,作者可以依赖的脚本功能可能被限制到不实用的程度,即便实际的 UA 可能支持更多。但将其设得更高可能导致我们排除在某些情况下确实在加载时支持脚本但基于复杂启发式而限制它的 UA。例如,保守的定义可能至少包括运行所有内联脚本并触发 DOMContentLoaded 事件。但如果大多数(或可能全部)initial-only UA 也加载外部脚本(包括 asyncdefer)并触发 load 事件,那么让作者仅约束自己依赖于前述情况并不有用。另一方面,要求加载外部脚本并触发 load 事件可能会排除像 Opera mini 这样的 UA,它们通常会运行这些脚本,但可能基于超时和其他启发式决定不运行它们。 [Issue #503]

none
表示用户代理不会为该文档运行脚本;要么它不支持脚本语言,要么当前文档没有激活支持。

一些用户代理能够按脚本或按域关闭脚本支持,允许在特定文档中仅运行部分脚本。scripting 媒体特性不允许细粒度地检测哪些脚本被允许运行。在这种情形下,如果允许与文档同域的脚本运行,则 scripting 媒体特性的值应为 enabledinitial-only,否则为 none

注: 将来某一级别的 CSS 可能扩展该媒体特性以允许细粒度检测哪些脚本被允许运行。

测试

10. 自定义媒体查询

在设计使用媒体查询的文档时,相同的媒体查询可能在多个地方使用,例如用于限定多个 @import 语句。重复多次相同的媒体查询是一种编辑隐患;作者在修改时必须以相同方式编辑每一处拷贝,否则会在 CSS 中产生难以发现的错误。

为帮助缓解这个问题,本规范定义了一种定义 自定义媒体查询 的方法,所谓自定义媒体查询就是对更长更复杂媒体查询的简单命名别名。通过这种方式,在多处使用的媒体查询可以赋予一个 自定义媒体查询 名称,在各处使用该名称,编辑媒体查询只需修改一行代码。

一个 自定义媒体查询 使用 @custom-media 规则来定义:

@custom-media = @custom-media <extension-name> [ <media-query-list> | true | false ] ;
测试

The <extension-name> 然后可以在 媒体特性 中使用。 它 必须布尔上下文 中使用;在普通或 范围上下文 中使用它们是语法错误。如果给定了 <media-query-list>,则该 自定义媒体查询 在其所代表的 <media-query-list> 评估为 true 时评估为 true,否则为 false。如果给定了 truefalse,则该 自定义媒体查询 分别评估为 true 或 false。

The custom media query is evaluated logically, not treated as a textual substitution. Take the following code snippet for instance:
/* --modern targets modern devices that support color or hover */
@custom-media --modern (color), (hover);

@media (--modern) and (width > 1024px) {
  .a { color: green; }
}

It is equivalent to:

@media ((color) or (hover)) and (width > 1024px) {
  .a { color: green; }
}

Processing it as if it meant the following would be incorrect:

@media (color), (hover) and (width > 1024px) {
  .a { color: green; }
}

一个 @custom-media 规则可以引用其他 自定义媒体查询。然而,禁止循环,自定义媒体查询 不得以自身或直接或间接引用它的另一个 自定义媒体查询 为定义依据。任何试图以循环依赖定义 自定义媒体查询 的行为必须导致循环中的所有 自定义媒体查询 无法被定义。

如果多个 @custom-media 规则声明相同的 <extension-name>,则真假值以最后一个声明为准,忽略之前对相同 <extension-name> 的所有声明。

注: 为了错误处理的目的,未定义的 媒体特性 不同于评估为 false 的 媒体特性。详情见 Media Queries 4 § 3.2 错误处理

例如,如果一个响应式站点在多个地方使用特定的断点,它可以用一个合适的名称为其取别名:
@custom-media --narrow-window (max-width: 30em);

@media (--narrow-window) {
  /* 窄窗口样式 */
}
@media (--narrow-window) and (script) {
  /* 在允许脚本时的特殊样式 */
}
/* 等等 */

10.1. 基于脚本的自定义媒体查询

为 JS 定义一个名称到值的映射。值可以是 MediaQueryList 对象或布尔值(在这种情况下与上述相同处理),也可以是数字或字符串(在这种情况下将被视为普通 MQ,并可使用普通或范围上下文语法)。例如:
<script>
CSS.customMedia.set('--foo', 5);
</script>
<style>
@media (_foo: 5) { ... }
@media (_foo < 10) { ... }
</style>

11. CSSOM

The CSSCustomMediaRule 接口表示一个 @custom-media 规则。

typedef (MediaList or boolean) CustomMediaQuery;

[Exposed=Window]
interface CSSCustomMediaRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CustomMediaQuery query;
};
name, 类型为 CSSOMString, 只读
返回一个 CSSOMString,表示 <extension-name>(@custom-media 规则的名称)。
query, 类型为 CustomMediaQuery, 只读
表示 自定义媒体查询 的值。 返回的 CustomMediaQuery 将为以下之一:
  • 如果规则以 <media-query-list> 定义,则为 MediaList 对象。
  • 如果规则以值 true 定义,则为布尔值 true。
  • 如果规则以值 false 定义,则为布尔值 false。
测试

12. 用户偏好媒体特性

12.1. 检测页面上对较少动画的需求: the prefers-reduced-motion feature

名称: prefers-reduced-motion
适用: @media
取值: no-preference | reduce
类型: 离散

The prefers-reduced-motion 媒体特性用于检测用户是否请求系统将其使用的非必要运动量最小化。

no-preference
表示用户未向系统表明任何偏好。此关键字值在 布尔上下文 中评估为 false。
reduce
表示用户已通知系统他们偏好一个移除或替换那些会触发前庭运动敏感者不适或使注意力缺陷者分心的基于运动的动画的界面。
测试

12.2. 检测页面上对减少透明效果的需求: the prefers-reduced-transparency feature

名称: prefers-reduced-transparency
适用: @media
取值: no-preference | reduce
类型: 离散

The prefers-reduced-transparency 媒体特性用于检测用户是否请求系统将其使用的透明或半透明图层效果的数量最小化。

no-preference
表示用户未向系统表明任何偏好。此关键字值在 布尔上下文 中评估为 false。
reduce
表示用户已通知系统他们偏好一个将透明或半透明图层效果数量最小化的界面。

这如何与例如图案填充和背景等偏好交互?它们不是关于透明度,也会干扰形状识别。

测试

12.3. 检测页面上对元素颜色对比度增加或减少的需求: the prefers-contrast feature

名称: prefers-contrast
适用: @media
取值: no-preference | less | more | custom
类型: 离散

The prefers-contrast 媒体特性用于检测用户是否请求页面具有更高或更低的对比度。响应方式例如可以通过调整相邻颜色之间的对比度,或通过改变元素的视觉突出程度(例如调整边框)来实现。

no-preference
表示用户未向系统表明任何偏好。此关键字值在 布尔上下文 中评估为 false。
less
表示用户已通知系统他们偏好具有较低对比度的界面。
more
表示用户已通知系统他们偏好具有较高对比度的界面。
custom
表示用户已指明希望使用一组特定颜色,但这些特定颜色所隐含的对比度既不属于 more 也不属于 less

注: 该值将匹配选择了既非特别高对比也非特别低对比的调色板的 强制颜色模式 的用户。见 § 12.4 检测强制颜色模式: the forced-colors feature

一个要求 青色文字配铁锈色背景 的用户(至少在光度方面)并不是在表达特别高或低的对比需求,但这也不是没有偏好。
注: 作者可以使用 prefers-contrast: moreprefers-contrast: less 来响应用户对更多或更少对比度的具体偏好,视情况而定。

使用未限定的 @media (prefers-contrast) {} 来应用高对比样式是不正确且对用户不友好的,因为这样也会把高对比样式强加给那些请求相反设置的人。

然而,为了减少视觉杂乱和颜色复杂度以响应高低对比偏好也是常见做法。在这种情况下,使用 @media (prefers-contrast) {} 而不指定 moreless 是合适的,用于例如用纯色替换背景图像、关闭装饰性渐变、或用简单的实线边框替换边框图像或盒阴影。由于 prefers-contrast: custom(像 prefers-contrast: moreprefers-contrast: less)在 布尔上下文 中评估为 true,这些简化也会使使用 强制颜色模式 的用户受益,即使他们选择的颜色并不导致特别高或低的对比度。这是可取的,因为 强制颜色模式 强制的减少调色板也需要对页面做某些视觉简化。

对更高或更低对比度的偏好可能来自多种不同情况。以下是一些例子:

这份列表应当被细化和扩展。

测试

12.4. 检测强制颜色模式: the forced-colors feature

名称: forced-colors
适用: @media
取值: none | active
类型: 离散
active
表示 强制颜色模式 已激活:用户代理在页面上强制应用用户选择的有限调色板。UA 将通过 CSS 系统颜色关键字向作者提供该调色板。详情见 CSS Color Adjustment 1 § 3 强制颜色调色板
这并不一定表示对更高对比度的偏好。颜色已被强制调整以匹配用户的偏好,但该偏好可以是更低或更高对比度,或某种既非高亦非低的配置。

除了 forced-colors: active 外,如果用户选择的强制颜色调色板可以确定为具有特别高或低的对比度,用户代理还必须匹配 prefers-contrast: moreprefers-contrast: less 之一,否则应使 prefers-contrast: custom 匹配。

类似地,如果用户所选的强制颜色调色板符合 prefers-color-scheme 描述的某一颜色方案,则相应的值也必须匹配。

none
强制颜色模式 未激活。
强制颜色模式 激活时,作者仅能使用 系统颜色。用户代理将自动强制应用此有限调色板,但作者也可以选择不同的使用方式,并使用 forced-colors 媒体特性检测何时适合这样做。
测试

12.5. 检测对浅色或深色配色方案的偏好: the prefers-color-scheme feature

名称: prefers-color-scheme
适用: @media
取值: light | dark
类型: 离散

The prefers-color-scheme 媒体特性反映了用户希望页面使用浅色或深色主题的偏好。

light
表示用户已表达对浅色主题(浅底上深色文字)的偏好,或未表达积极偏好(因此应获得“网页默认”的浅色主题)。
dark
表示用户已表达对深色主题(深底上浅色文字)的偏好。

注: 此特性的取值将来可能扩展(例如表达对浅色配色方案的更积极偏好,或对“褐色”等其他配色方案的偏好)。因此,使用该媒体特性的最具未来兼容性的方式是通过否定形式,例如 (prefers-color-scheme: dark)(not (prefers-color-scheme: dark)),这能确保新值至少落入其中一个样式块。

用户表达偏好的方式可以不同。可能是操作系统暴露的系统范围设置,或由用户代理控制的设置。

注: 用户偏好也可能因介质而异。例如,用户可能在发光屏幕上偏好深色主题,但在打印时偏好浅色主题(以节省墨水和/或因为在纸上印刷时,墨色背景中挖空文字的可读性不如空白纸上的墨色文字)。UA 应考虑此类差异,以便 prefers-color-scheme 反映适合于介质的偏好,而不是脱离上下文的偏好。

如果在使用“安全动画”(Secure Animated)嵌入模式的嵌入 SVG 文档中评估,优选的配色方案必须反映嵌入文档中嵌入节点的 used color scheme 的值。

为什么要这样做?

尽管最外层文档需要直接获取用户的偏好,但对嵌入文档而言,使用其周围嵌入上下文的配色方案更有用,这样它就与周围内容匹配。

然而,这会使嵌入文档能从嵌入文档接收信息传达给嵌入的文档,因此目前仅限于使用“安全动画”模式的 SVG,这种模式不能加载外部资源或运行脚本,因此不能对配色方案做出外部可观察的响应。

是否以及在何种条件下对 iframe 做类似处理,正在 Issue 7213 中讨论。

该特性,像其他 prefers-* 特性一样,之前有一个 no-preference 值用于表示作者未表达积极偏好。然而,用户代理已经趋向于将“默认”行为表示为 light 偏好,并从不匹配 no-preference

如果未来有用户代理希望区分“无偏好”与“确实想要浅色显示”之间的差异,请联系 CSSWG 进行讨论。

测试

12.6. 检测在加载页面时减少数据使用的偏好: the prefers-reduced-data feature

该特性可能成为指纹识别的不良来源,并偏向于数据受限的低收入群体。 [Issue #10076]

名称: prefers-reduced-data
适用: @media
取值: no-preference | reduce
类型: 离散

The prefers-reduced-data 媒体特性用于检测用户是否偏好为页面提供使用更少数据的替代内容。

no-preference
表示用户未向系统表明任何偏好。此关键字值在 布尔上下文 中评估为 false。
reduce
表示用户已表达偏好接收精简的替代内容。

用户表达偏好的方式可以不同。它可能是操作系统暴露的系统范围设置,或由用户代理控制的设置。用户代理可以考虑基于用于设置 Save-Data HTTP 请求头的相同用户或系统偏好来设置此项。

注: 用户代理在处理该值的切换时(无论是在页面加载后切换还是在加载期间切换)被鼓励使用以用户为中心的自由裁量权。主要目标可以是不下载不必要的数据。考虑到如果页面已经用高质量资源加载并且用户将偏好切换为减少数据,页面可能不应立即更新文档,而是等待用户明确重新加载页面。同样,如果页面下载时间很长且用户将偏好切换为减少,这可能是立即切换到下载较小资源以节省带宽的好时机。用户代理可以根据他们认为合适的逻辑来处理此类情形,并且也应意识到这些情形的存在。

例如,站点可以尊重启用了数据节省模式的用户的偏好,通过提供更小的图片。
.image {
  background-image: url("images/heavy.jpg");
}

@media (prefers-reduced-data: reduce) {
  /* Save-Data: On */
  .image {
    background-image: url("images/light.jpg");
  }
}
测试

12.7. 用户偏好的自动处理

用户代理可能有允许用户指明其偏好的显式设置,或可能基于底层操作系统的设置来确定。用户代理也可能基于关于设备、环境等的知识自动推断用户的偏好。在这种情况下,建议它们也提供一种方式,让用户选择退出或覆盖自动确定的偏好。

除了允许用户在 lightdark 配色方案之间显式选择外,用户代理还可以有一种基于当前时间自动决定的模式,在日落到黎明之间表示对 dark 的偏好。
根据所用显示器类型,环境光水平的变化可能使阅读体验变得困难或不适。例如,液晶显示屏在强光环境下可能会被洗掉且难以阅读。

具有此类屏幕并配备环境光传感器的设备可能会自动将 prefers-contrast 切换为 more,以应对使屏幕难以阅读的条件。带电子墨水显示屏的用户代理则不会做出相同的调整,因为此类显示在强光下仍然可读。

相反的情况,运行在发光屏(LCD、OLED 等)并配备环境光传感器的用户代理可以在光线昏暗的环境中自动将 prefers-contrast 切换为 less 并将 prefers-color-scheme 切换为 dark,以在昏暗环境中减少过度对比和亮度带来的干扰或不适。

用户代理可以根据所用网络连接是否允许无限数据或在计量计划上,自动在 prefers-reduced-data: no-preferencereduce 之间切换。

13. 脚本控制用户偏好

网站作者通常希望在尊重用户系统偏好的同时允许覆盖这些偏好。为此,本规范定义了一种方法,允许作者使用 § 12 用户偏好媒体特性 通过 PreferenceManager 接口来覆盖这些偏好。

此覆盖允许偏好与受这些偏好影响的各种平台功能集成。

[Exposed=Window, SecureContext]
partial interface Navigator {
	[SameObject] readonly attribute PreferenceManager preferences;
};

13.1.1. preferences 属性

取用 preferences 属性时,应始终返回相同的 PreferenceManager 对象实例。

13.1.2. PreferenceManager 接口

[Exposed=Window, SecureContext]
interface PreferenceManager {
	readonly attribute PreferenceObject colorScheme;
	readonly attribute PreferenceObject contrast;
	readonly attribute PreferenceObject reducedMotion;
	readonly attribute PreferenceObject reducedTransparency;
	readonly attribute PreferenceObject reducedData;
};

13.1.3. colorScheme 属性

The colorScheme 属性是一个 PreferenceObject ,用于覆盖网站的配色方案用户偏好。本条建模参考了 § 12.5 检测对浅色或深色配色方案的偏好:prefers-color-scheme 特性

The get valid values for colorScheme algorithm, when invoked, must run these steps:
  1. Let validValues be a new empty sequence.

  2. Add light to validValues.

  3. Add dark to validValues.

  4. Return validValues.

如果为此偏好设置了覆盖:

13.1.4. contrast 属性

The contrast 属性是一个 PreferenceObject ,用于覆盖网站的对比度用户偏好。本条建模参考了 § 12.3 检测页面元素对提高或降低色彩对比度的偏好:prefers-contrast 特性

The get valid values for contrast algorithm, when invoked, must run these steps:
  1. Let validValues be a new empty sequence.

  2. Add more to validValues.

  3. Add less to validValues.

  4. Add no-preference to validValues.

  5. Return validValues.

如果为此偏好设置了覆盖:

注:与媒体特性不同,此偏好不能设置为 custom,因为它与 § 12.4 强制颜色模式检测:forced-colors 特性 紧密耦合。

13.1.5. reducedMotion 属性

The reducedMotion 属性是一个 PreferenceObject ,用于覆盖网站的减少动画(减少运动)用户偏好。本条建模参考了 § 12.1 检测页面上对更少运动的偏好:prefers-reduced-motion 特性

The get valid values for reducedMotion algorithm, when invoked, must run these steps:
  1. Let validValues be a new empty sequence.

  2. Add reduce to validValues.

  3. Add no-preference to validValues.

  4. Return validValues.

如果为此偏好设置了覆盖:

注:受此偏好影响的 UA 功能示例包括禁用平滑滚动,或暂停走马灯元素(marquee)。

13.1.6. reducedTransparency 属性

The reducedTransparency 属性是一个 PreferenceObject ,用于覆盖网站的减少透明度用户偏好。本条建模参考了 § 12.2 检测页面上对减少透明度的偏好:prefers-reduced-transparency 特性

The get valid values for reducedTransparency algorithm, when invoked, must run these steps:
  1. Let validValues be a new empty sequence.

  2. Add reduce to validValues.

  3. Add no-preference to validValues.

  4. Return validValues.

如果为此偏好设置了覆盖:

13.1.7. reducedData 属性

The reducedData 属性是一个 PreferenceObject ,用于覆盖网站的减少数据使用偏好。本条建模参考了 § 12.6 检测在加载页面时对减少数据使用的偏好:prefers-reduced-data 特性

The get valid values for reducedData algorithm, when invoked, must run these steps:
  1. Let validValues be a new empty sequence.

  2. Add reduce to validValues.

  3. Add no-preference to validValues.

  4. Return validValues.

如果为此偏好设置了覆盖:

13.1.8. PreferenceObject 接口

[Exposed=Window, SecureContext]
interface PreferenceObject : EventTarget {
	readonly attribute DOMString? override;
	readonly attribute DOMString value;
	readonly attribute FrozenArray<DOMString> validValues;

	undefined clearOverride();
	Promise<undefined> requestOverride(DOMString? value);

	attribute EventHandler onchange;
};
13.1.8.1. override 属性
The override attribute, when accessed, must run these steps:
  1. preference 设为该偏好对象的名称。

  2. override 设为 null。

  3. 如果存在针对 preference 的覆盖,则将 override 设为该覆盖的值。

  4. 返回 override

13.1.8.2. value 属性
The value attribute, when accessed, must run these steps:
  1. preference 设为该偏好对象的名称。

  2. value 设为 null。

  3. 如果存在针对 preference 的覆盖,则将 value 设为该覆盖的值。

  4. 如果 value 为 null,则将 value 设为该偏好的用户代理(UA)值。

  5. 返回 value

13.1.8.3. validValues 属性
The validValues attribute, when accessed, must run these steps:
  1. preference 设为该偏好对象的名称。
  2. 根据 preference 进行分支:
    "colorScheme"
    返回 get valid values for colorScheme 的结果。
    "contrast"
    返回 get valid values for contrast 的结果。
    "reducedMotion"
    返回 get valid values for reducedMotion 的结果。
    "reducedTransparency"
    返回 get valid values for reducedTransparency 的结果。
    "reducedData"
    返回 get valid values for reducedData 的结果。
13.1.8.4. onchange 事件处理器属性

The onchange attribute is an 事件处理器 IDL 属性,用于 onchange 事件处理器,其事件类型为 change

每当用户代理(user agent)知悉某个 PreferenceObject 实例的 value 已改变时,它运行 PreferenceObject 更新步骤
  1. preference 设为与 value 相关联的 PreferenceObject 对象。

  2. 如果 this相关全局对象 是一个 Window 对象,则:

    1. document 设为 preference相关全局对象关联 Document

    2. 如果 document 为 null 或 document 不是 完全活动(fully active),则终止本算法。

  3. preference 处触发名为 change 的事件。

13.1.8.5. requestOverride() 方法
The requestOverride(value) method, when invoked, must run these steps:
  1. Let result be a new promise.

  2. Let allowed be false.

  3. allowed 设为执行一个由用户代理定义的算法的结果,以决定该请求是否被允许。

  4. 如果 allowed 为 false,则返回一个被拒绝的承诺(promise),该承诺以一个 "NotAllowedError" DOMException 拒绝。

  5. value 设为该方法的参数。

  6. Let result be a new promise.

  7. 如果 value 为 null 或空字符串:

    1. 运行 clearOverride

    2. 解决(Resolve) 并返回 result

  8. Let currentValue be the preference object’s value.

  9. Let validValues be null.

  10. 根据 preference 进行分支:

    "colorScheme"
    validValues 设为 get valid values for colorScheme 的结果。
    "contrast"
    validValues 设为 get valid values for contrast 的结果。
    "reducedMotion"
    validValues 设为 get valid values for reducedMotion 的结果。
    "reducedTransparency"
    validValues 设为 get valid values for reducedTransparency 的结果。
    "reducedData"
    validValues 设为 get valid values for reducedData 的结果。
  11. 如果 value 不在 validValues 中:

    1. 拒绝(Reject) result,并以一个 "TypeError" DOMException 作为原因。

    2. 返回 result

  12. previousOverride 设为 null。

  13. 如果存在针对 preference 的覆盖,则将 previousOverride 设为该覆盖的值。

  14. 如果 valuepreviousOverride 不同:

    1. preference 的偏好覆盖设为 value

  15. 如果 previousOverride 为 null,则:

    1. 如果 valuecurrentValue 相同,则:

      1. 触发事件 名为 change 的事件, 在 this 上。

  16. 解决(Resolve) 并返回 result

此算法需要更多细节,说明设置偏好覆盖究竟会做什么。

这里使用 TypeError 是否正确?

注:当计算值发生变化时会触发 `change` 事件,但当设置新覆盖时,即使值没有变化也会触发该事件。

13.1.8.6. clearOverride() 方法
The clearOverride() method, when invoked, must run these steps:
  1. preference 设为该偏好对象的名称。

  2. override 设为 null。

  3. 如果存在针对 preference 的覆盖,则将 override 设为该覆盖的值。

  4. 如果 override 为 null,则返回。

  5. 清除针对 preference 的覆盖。

  6. newValue 设为该偏好对象的 value。

  7. 如果 newValue 等于 override,则:

  8. 触发事件 名为 change 的事件,在 this 上。

注:当计算值发生变化时会触发 `change` 事件,但当清除覆盖时,即使值没有变化也会触发该事件。

附录 A:已弃用的媒体特性

下列 媒体特性 已被弃用。它们保留以向后兼容,但不适合新编写的样式表。作者不得使用它们。用户代理必须按规范支持它们。

要查询视口大小(或页面媒体上的页面框大小),应使用 widthheightaspect-ratio 媒体特性,而不是 device-widthdevice-heightdevice-aspect-ratio,因为后者指的是设备的物理尺寸,而不管用于布局的文档可用空间大小。device-* 媒体特性有时也被用作检测移动设备的代理。相反,作者应使用更能代表其试图针对的设备方面的媒体特性。

device-width

Name: device-width
For: @media
Value: <length>
Type: range

device-width 媒体特性描述输出设备渲染表面的宽度。 对于 连续媒体, 这是 Web 暴露屏幕区域(Web-exposed screen area)的宽度。 对于 分页媒体,这是页面纸张尺寸的宽度。

device-width 在负范围内为 false

@media (device-width < 800px) { … }

在上例中,该样式表只适用于宽度小于 800px 的屏幕。px 单位为逻辑像素,正如 单位 部分所述。

注:如果设备可以在多种方向间切换(例如纵向和横向),则 device-* 媒体特性反映当前方向。

device-height

Name: device-height
For: @media
Value: <length>
Type: range

device-height 媒体特性描述输出设备渲染表面的高度。 对于 连续媒体, 这是 Web 暴露屏幕区域的高度。 对于 分页媒体,这是页面纸张尺寸的高度。

device-height 在负范围内为 false

<link rel="stylesheet" media="(device-height > 600px)" />

在上例中,该样式表只适用于高度大于 600 垂直像素的屏幕。注意 px 单位的定义与 CSS 其他部分相同。

device-aspect-ratio

Name: device-aspect-ratio
For: @media
Value: <ratio>
Type: range

device-aspect-ratio 媒体特性的定义为 device-widthdevice-height 媒体特性值的比率。

例如,如果一个屏幕设备在水平上有 1280 个像素、垂直上有 720 个像素(通常称为 “16:9”), 则以下媒体查询都将匹配该设备:
@media (device-aspect-ratio: 16/9) { … }
@media (device-aspect-ratio: 32/18) { … }
@media (device-aspect-ratio: 1280/720) { … }
@media (device-aspect-ratio: 2560/1440) { … }
Tests

变更

本节非规范性。

自 2021-12-18 工作草案以来的变更

除了编辑性更改和小幅澄清外,自 2021-12-18 工作草案 以来,本模块还做了以下更改和补充:

自 2020-07-31 工作草案以来的变更

除了编辑性更改和小幅澄清外,自 2020-07-31 工作草案 以来,本模块还做了以下更改和补充:

自 2020-07-15 工作草案以来的变更

2020-07-15 工作草案 以来,已作出以下补充:

自 2020-06-03 工作草案以来的变更

2020-06-03 工作草案 以来,已作出以下补充:

自 2020-03-18 工作草案以来的变更

2020-03-18 工作草案 以来,已作出以下补充:

自首次公开工作草案以来的变更

2020-03-03 首次公开工作草案 以来,已作出以下补充:

针对 FPWD 的更改(自 Media Queries Level 4 起)

为创建本模块的首次公开工作草案(FPWD),自 Media Queries Level 4 以来做出以下补充:

自 Media Queries Level 4 以来的变更

Media Queries Level 4 以来,本模块做出以下补充:

致谢

本节非规范性。

本规范由 W3C 层叠样式表工作组(Cascading Style Sheets Working Group)产生。

以下人员的评论改进了本规范: Adam Argyle, Amelia Bellamy-Royds, Andreas Lind, Andres Galante, Arve Bersvendsen, Björn Höhrmann, Chen Hui Jing, Chris Lilley, Chris Rebert, Christian Biesinger, Christoph Päper, Elika J. Etemad (fantasai), Emilio Cobos Álvarez, François Remy, Frédéric Wang, Fuqiao Xue, Greg Whitworth, Ian Pouncey, James Craig, Jay Harris, Jinfeng Ma, Kivi Shapiro, L. David Baron, Masataka Yakura, Matt Giuca, Melinda Grant, Michael Smith, Nicholas C. Zakas Patrick H. Lauke, Philipp Hoschka, Rick Byers, Rijk van Geijtenbeek, Rik Cabanier, Roger Gimson, Rossen Atanassov, Sam Sneddon, Sigurd Lerstad, Simon Kissane, Simon Pieters, Stephen Chenney, Steven Pemberton, Susan Lesch, Tantek Çelik, Thomas Wisniewski, Vi Nguyen, Xidorn Quan, Yves Lafon, akklesed, and 張俊芝 改进了本规范。

隐私考虑

本节非规范性。

本节是 不完整的

许多媒体特性会基于设备的显示和交互特性对用户进行指纹识别:

环境混合(environment-blending)特性尤其令人关注, 因为它暗示了用户可能所在的位置,并且可能出现在一小部分设备中。不常见的设备属性是更强的指纹特征,因为它们有助于将设备划分为更小的集合。

反映操作系统偏好的媒体特性是一个指纹识别风险,因为这些偏好与用户自身的特征相关联:

依赖于上述某些媒体查询的属性可能会被脚本访问:

当用户表示对跟踪敏感时,用户代理可以禁用这些媒体特性。或者,用户代理可以限制单一页面中可见的特性组合,以降低页面的指纹识别能力。

PreferenceManager 对象允许查询一些用户偏好的 媒体特性。这并不是隐私泄露,因为这些信息已经可以通过直接使用媒体特性本身轻易获得。

PreferenceManager 对象还允许覆盖这些用户偏好的 媒体特性;这也既不是隐私也不是可访问性方面的倒退,因为媒体特性本身已可被忽略(即根本不去查询它们)。

安全性考虑

本节非规范性。

本节是 不完整的

display-mode 媒体特性允许某一源访问用户本地计算环境的某些方面,尤其是当与 应用清单(manifest)display 成员一起使用时,允许某一源对用户代理的本机 UI 有一定程度的控制。通过 CSS 媒体查询,脚本可以知道 Web 应用的显示模式。在这种情况下,攻击者可能利用应用以全屏显示为由,模仿另一个应用的用户界面。

符合性

文档约定

符合性要求以描述性断言和 RFC 2119 术语的组合来表达。规范性部分中关键字 “MUST”、 “MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、 “RECOMMENDED”、“MAY” 和 “OPTIONAL” 应按 [RFC2119] 中的描述来解释。 但为了可读性,这些词在本规范中并不总是以全大写形式出现。

除非明确标注为非规范性、示例和注释外,本规范的所有文本均为规范性文本。 [RFC2119]

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

这是一个说明性示例。

说明性注释以 “Note” 一词开始,并用 class="note" 将其与规范性文本区分开来,如下所示:

注:这是一个说明性注释。

警示性条款为规范性部分,样式上用于引起特别注意,并用 <strong class="advisement"> 将其与其他规范性文本区分开来,例如: 用户代理必须提供可访问的替代方案。

Tests

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


符合性类别

本规范的符合性定义为三类符合性类:

style sheet
一个 CSS 样式表
renderer
一个解释样式表语义并呈现使用它们的文档的 用户代理
authoring tool
一个用于编写样式表的 用户代理

如果某个样式表中使用本模块定义的语法的所有语句均根据通用 CSS 语法和本模块中每个特性各自的语法有效,则该样式表符合本规范。

如果渲染器在解释样式表时,除了按相应规范解释样式表之外,还能通过正确解析并据此渲染文档来支持本规范定义的所有特性,则该渲染器符合本规范。然而,用户代理由于设备限制而无法正确渲染文档,并不意味着该用户代理不符合规范。(例如,在单色显示器上,用户代理不要求必须呈现彩色。)

如果作者工具能生成在语法上符合通用 CSS 语法及本模块中每个特性的各自语法的样式表,并满足本模块对样式表所述的所有其他符合性要求,则该作者工具符合本规范。

部分实现

为了让作者可以利用向前兼容的解析规则分配回退值,CSS 渲染器必须将其没有可用支持级别的 at-rule、属性、属性值、关键字和其他语法结构视为无效(并在适当时忽略)。特别地,用户代理不得在单个多值属性声明中选择性地忽略不受支持的组件值并接受受支持的值:如果任何值被视为无效(如不受支持的值必须被视为的),CSS 要求整个声明被忽略。

不稳定与专有特性的实现

为避免与将来稳定的 CSS 特性发生冲突,CSS 工作组建议在实现 不稳定 特性和对 CSS 的 专有扩展 时遵循 最佳实践

非试验性实现

一旦规范达到候选推荐(Candidate Recommendation)阶段,就可以有非试验性实现,实施者应当发布任何他们能够证明已根据规范正确实现的 CR 级特性的无前缀实现。

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

关于提交测试用例和实施报告的更多信息,请参阅 CSS 工作组网站: https://www.w3.org/Style/CSS/Test/。 如有问题,请发送邮件到 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[APPMANIFEST]
Marcos Caceres; et al. Web Application Manifest. 29 January 2026. WD. URL: https://www.w3.org/TR/appmanifest/
[COLORIMETRY]
Colorimetry, Fourth Edition. CIE 015:2018. 2018. URL: http://www.cie.co.at/publications/colorimetry-4th-edition
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 13 January 2022. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS Color Adjustment Module Level 1. 16 December 2025. CR. URL: https://www.w3.org/TR/css-color-adjust-1/
[CSS-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS Conditional Rules Module Level 3. 15 August 2024. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-EXTENSIONS-1]
CSS Extensions Module Level 1. Editor's Draft. URL: https://drafts.csswg.org/css-extensions-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[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/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 30 July 2019. CR. URL: https://www.w3.org/TR/css-writing-modes-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/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 26 August 2021. WD. URL: https://www.w3.org/TR/cssom-1/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 16 September 2025. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[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/
[MEDIAQUERIES-3]
Florian Rivoal. Media Queries Level 3. 21 May 2024. REC. URL: https://www.w3.org/TR/mediaqueries-3/
[MEDIAQUERIES-4]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 25 December 2021. CRD. URL: https://www.w3.org/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Dean Jackson; et al. Media Queries Level 5. 18 December 2021. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[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
[SAVEDATA]
Save Data API. Editor's Draft. URL: https://wicg.github.io/savedata/
[USER-PREFERENCE-MEDIA-FEATURES-HEADERS]
User Preference Media Features Client Hints Headers. Draft Community Group Report. URL: https://wicg.github.io/user-preference-media-features-headers/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

说明性参考文献

[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 24 April 2025. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 1 February 2024. WD. URL: https://www.w3.org/TR/css-fonts-4/
[Display-P3]
A; et al. Display P3. 2022-02. URL: https://www.color.org/chardata/rgb/DisplayP3.xalter
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 27 March 2018. REC. URL: https://www.w3.org/TR/html401/
[ITU-R-BT-2020-2]
Parameter values for ultra-high definition television systems for production and international programme exchange. October 2015. URL: https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre. Content Feature Schema for Internet Fax (V2). August 2000. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2879
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 22 January 2026. WD. URL: https://www.w3.org/TR/selectors-4/
[SRGB]
Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB. URL: https://webstore.iec.ch/publication/6169
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. Associating Style Sheets with XML documents 1.0 (Second Edition). 28 October 2010. REC. URL: https://www.w3.org/TR/xml-stylesheet/

属性索引

未定义任何属性。

@media 描述符

Name Value Initial Type
any-hover none | hover discrete
any-pointer none | coarse | fine discrete
aspect-ratio <ratio> range
color <integer> range
color-gamut srgb | p3 | rec2020 discrete
color-index <integer> range
device-aspect-ratio <ratio> range
device-height <length> range
device-width <length> range
display-mode fullscreen | standalone | minimal-ui | browser | picture-in-picture discrete
dynamic-range standard | high discrete
environment-blending opaque | additive | subtractive discrete
forced-colors none | active discrete
grid <mq-boolean> discrete
height <length> range
horizontal-viewport-segments <integer> range
hover none | hover discrete
inverted-colors none | inverted discrete
monochrome <integer> range
nav-controls none | back discrete
orientation portrait | landscape discrete
overflow-block none | scroll | paged discrete
overflow-inline none | scroll discrete
pointer none | coarse | fine discrete
prefers-color-scheme light | dark discrete
prefers-contrast no-preference | less | more | custom discrete
prefers-reduced-data no-preference | reduce discrete
prefers-reduced-motion no-preference | reduce discrete
prefers-reduced-transparency no-preference | reduce discrete
resolution <resolution> | infinite range
scan interlace | progressive discrete
scripting none | initial-only | enabled discrete
update none | slow | fast discrete
vertical-viewport-segments <integer> range
video-color-gamut srgb | p3 | rec2020 discrete
video-dynamic-range standard | high discrete
width <length> range

IDL 索引

typedef (MediaList or boolean) CustomMediaQuery;

[Exposed=Window]
interface CSSCustomMediaRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CustomMediaQuery query;
};

[Exposed=Window, SecureContext]
partial interface Navigator {
	[SameObject] readonly attribute PreferenceManager preferences;
};

[Exposed=Window, SecureContext]
interface PreferenceManager {
	readonly attribute PreferenceObject colorScheme;
	readonly attribute PreferenceObject contrast;
	readonly attribute PreferenceObject reducedMotion;
	readonly attribute PreferenceObject reducedTransparency;
	readonly attribute PreferenceObject reducedData;
};

[Exposed=Window, SecureContext]
interface PreferenceObject : EventTarget {
	readonly attribute DOMString? override;
	readonly attribute DOMString value;
	readonly attribute FrozenArray<DOMString> validValues;

	undefined clearOverride();
	Promise<undefined> requestOverride(DOMString? value);

	attribute EventHandler onchange;
};

问题索引

是否需要 subtractive 值?
是否应对在允许 UA 声称 initial-only 之前要求一个明确的最低阈值? 设定该阈值可以让作者知道他们可以依赖什么, 并据此调整他们的脚本。 另一方面,确定该阈值是困难的: 如果设得太低, 作者可依赖的脚本功能可能被限制得不实用, 即便实际的用户代理可能支持显著更多功能。 但若尝试设得更高,可能会把那些确实在加载时支持脚本但基于复杂启发式在某些情况下限制脚本的用户代理排除在外。 例如,保守的定义可能至少包括运行所有内联脚本并触发 DOMContentLoaded 事件。 但如果大多数(或可能所有)initial-only 的 UA 也加载外部脚本(包括 asyncdefer) 并触发 load 事件,则对作者来说仅约束到前者并无太大用处。 另一方面, 要求加载外部脚本并触发 load 事件 可能会排除像 Opera mini 这样的 UA, 它们通常确实会运行外部脚本, 但可能基于超时和其他启发式决定不运行它们。 [Issue #503]
为 JS 定义一个名称到值的映射。 值可以是 MediaQueryList 对象或布尔值, 在这种情况下其处理方式与上述相同, 或可以是数字或字符串, 在这种情况下其被当作普通的媒体查询处理, 并可以使用普通或范围上下文语法。 比如:
<script>
CSS.customMedia.set('--foo', 5);
</script>
<style>
@media (_foo: 5) { ... }
@media (_foo < 10) { ... }
</style>
这如何与例如图案填充和背景的偏好交互? 它们不是关于透明性的,但也会干扰形状识别。
该列表应当被细化和扩展。
该特性可能成为一个不希望出现的指纹识别来源, 并且在偏向低收入且数据受限的人群方面存在偏差。 [Issue #10076]
该算法需要更多细节,说明设置偏好覆盖究竟会做什么。
这里使用 TypeError 是否正确?
本节是 不完整的
本节是 不完整的