媒体查询 第 4 级

W3C 候选推荐草案,

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2026/CRD-mediaqueries-4-20260219/
最新发布版本:
https://www.w3.org/TR/mediaqueries-4/
编辑草案:
https://drafts.csswg.org/mediaqueries-4/
先前版本:
历史:
https://www.w3.org/standards/history/mediaqueries-4/
实现报告:
https://wpt.fyi/results/css/mediaqueries
反馈:
CSSWG 问题仓库
编辑:
Florian Rivoal受邀专家
Tab Atkins Jr.Google
前任编辑:
Opera
Mozilla
Disruptive Innovations
Mozilla
为本规范建议一次编辑:
GitHub 编辑器
测试套件:
https://wpt.fyi/results/css/mediaqueries/

摘要

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

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

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

本文档状态

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

本文档由 CSS 工作组 作为候选推荐草案发布, 并使用推荐轨道。 作为候选推荐发布 并不意味着获得 W3C 及其成员的认可。 候选推荐草案 整合了来自上一份候选推荐的变更, 这些变更是工作组打算纳入后续候选推荐快照中的内容。

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

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

本文档受 2025 年 8 月 18 日 W3C 流程文档 管辖。

本文档由一个在 W3C 专利政策 下运作的团队制作。 W3C 维护了一份与该团队交付物相关的任何专利披露的公开列表; 该页面还包含披露专利的说明。 任何对某项专利具有实际认知、且其认为该专利包含必要权利要求的个人 必须依照W3C 专利政策第 6 节 披露相关信息。

目前没有初步的互操作性或实现报告。

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. 模块交互

本模块替换并扩展了在 [CSS2] 第 7 节以及 [MEDIAQUERIES-3] 中定义的媒体查询、媒体类型与媒体特性。

1.2.

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

1.3. 单位

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

相对长度单位在媒体查询中是基于初始值的, 这意味着这些单位永远不会基于声明计算后的结果。例如在 HTML 中, em 单位相对于 初始值font-size, 由用户代理或用户偏好定义, 而不是页面上的任何样式。

Tests

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);

用户代理必须在其已知的用户环境变化时重新求值媒体查询, 例如设备从横向平铺变为纵向平铺, 并相应地改变任何依赖这些媒体查询的构造的行为。

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

Tests

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. 媒体类型

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

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

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

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

此外,定义了以下 已弃用媒体类型。 作者不得使用这些 媒体类型; 相反,建议选择能更好表示其正在针对之设备方面的合适 媒体特性

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

注:预计所有媒体类型也将随着时间推移而被弃用, 因为会定义出适当的 媒体特性 来捕捉它们的重要差异。

Tests

2.4. 媒体特性

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

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

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

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

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

媒体特性 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 值, 用于表示设备上完全没有指点设备。

同样地,not (color-gamut) 可用于检测极低质量屏幕, 因为这类设备不会匹配任何 color-gamut 关键字; 即便 color-gamut 缺少 none 关键字, 由于其没有任何值能匹配,它在 布尔上下文 中仍会为假。

另一方面,(scan) 总是为真或总是为假 (取决于它是否适用于该设备), 因为只要它适用, 设备就保证至少会匹配其某个值之一。

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

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

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

注:此语法为 Mediaqueries 第 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; }
}
与 Media Queries Level 3 [MEDIAQUERIES-3] 相比,这是一项行为变更: 在第 3 级中,这些属性上的负值会导致语法错误。 在第 3 级里,语法错误——包括被禁止的值——会导致整个 媒体查询 为假, 而不是像本级所定义的那样按 unknown 处理。 从第 3 级升级的实现应确保: 当它们加入对 § 2.5 组合媒体特性 中更丰富语法的支持时, 同时更改对相关属性负值的处理方式, 以避免引入非预期的语义。
Tests

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) 为真, 第一个会求值为假, 而第二个会求值为真。

Tests

3. 语法

媒体查询语法的非正式描述出现在前述章节的行文与铁路图中。 本节描述形式化的媒体查询语法, 其中规则/属性语法所用的文法符号定义于 [CSS-SYNTAX-3][CSS-VALUES-3]

要解析 <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> 的存在是为了以一种相对兼容的方式 支持未来对文法的扩展。

Tests

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>
结果为对指定媒体特性求值的结果。

若上述任一产生式的结果 用在期望二值布尔值的上下文中, 则必须将 “unknown” 转换为 “false”。

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

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

通常,公式中出现 unknown 值会导致整个公式也变为 unknown, 因为将 unknown 替换为 “true” 会得到与替换为 “false” 不同的结果。 消除 unknown 值的唯一方式是:将其用于一个无论 unknown 被替换为真或假都产生同一结果的公式中。 这发生在 “false AND unknown”(无论如何都为假) 与 “true OR unknown”(无论如何都为真)时。

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

3.2. 错误处理

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

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

@media (example, all,), speech { /* 仅适用于语音设备 */ }
@media &test, speech           { /* 仅适用于语音设备 */ }

以上两条 媒体 查询列表 在解析时都会被转为 not all, speech, 其真值与仅写 speech 相同。

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

@media (example, speech { /* 语音设备规则 */ }

由于括号块未闭合, 它将包含从该处起样式表的其余所有内容 (除非在样式表的某处碰巧遇到一个不匹配的 “)” 字符), 并将整个内容转成一个 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 规则, 以及因此的 媒体查询, 在分号处结束。 其余文本会被当作一个样式规则, 但其选择器与内容均无效。

Tests

4. 视口/页面尺寸媒体特性

4.1. 宽度:width 特性

Name: width
For: @media
Value: <length>
Type: 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) { … }

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 的广播。

在隔行屏幕上显示时, 作者应避免屏幕上非常快速的移动以避免“梳齿”效应, 并应确保屏幕上的细节宽于 1px,以避免 “twitter”

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

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

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

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

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

名称: grid
适用于: @media
值: <mq-boolean>
类型: discrete
<mq-boolean> = <integer [0,1]>

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

<mq-boolean> 值类型是一个取值为 01<integer>。 其他任何整数值都无效。 注意 -0 在 CSS 中始终等价于 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 动画这类需要规律更新的内容。 示例:计算机屏幕。
例如,如果某页面把链接样式设为只在悬停时添加下划线, 那么在打印时它可能希望始终显示下划线:
@media (update) {
  a { text-decoration: none; }
  a:hover, a:focus { text-decoration: underline; }
}
/* 在不更新的 UA 中,链接始终获得其默认下划线。 */
测试

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

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

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

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

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

注:未来可能会为该媒体特性添加附加值, 用于描述具有混合行为的用户代理类别, 其行为结合了 连续分页媒体 的某些方面。 例如,Presto 布局引擎(现已停止)曾提供一种半分页的演示模式行为, 类似于 continuous,但它会遵循强制分页符。 由于不了解当前仍在发布的、具有此类行为的用户代理, 工作组决定在本级中不添加此类值, 以避免对任何此类用户代理造成误描述。 鼓励任何实现了无法被上述任何值充分描述的用户代理的人员 联系工作组, 以便考虑对此媒体特性进行扩展。

测试

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

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

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

none
行内 轴 上没有溢出可用的处理方式; 任何溢出的内容都将直接不显示。
scroll
行内 轴 上的溢出内容会通过允许用户滚动来暴露出来。

注:没有已知实现支持行内方向的分页式溢出, 且这一概念本身似乎也并不太合理, 因而 overflow-inline 有意不提供 paged 值。

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 色域或更大的色域。

注:预计绝大多数彩色显示器 都能对该类型查询返回 true。

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) {}

注:若输出设备的完整输出色域足够大, 或某个色域是另一个受支持色域的子集, 则输出设备可以对该媒体特性的多个值返回 true。 因此, 最佳用法是以“递增”的方式使用该特性——当 (color-gamut: srgb) 为真时设置基准值, 然后当 (color-gamut: p3) 为真时覆盖它,等等。

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

测试

7. 交互媒体特性

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

匹配 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 特性与“主”指点设备的特征相关; 而 any-pointerany-hover 可用于查询所有可能可用的指点设备的属性。

注:虽然本规范不定义用户代理应如何决定何为“主”指点设备, 但预期用户代理应通过综合以下因素来作出决定: 它们所运行的设备/环境方面的知识、 可用指点设备的数量与类型、 以及对这些设备中哪些通常和/或当前正在被使用的判断。 在某些情况下,设备的主输入机制不是指点设备, 但存在一个次要的——且较少使用的——指点设备输入, 用户代理可以决定将非指点设备视为主输入(从而使 pointer: none)。 用户代理也可以决定动态更改被认为是主输入的指点设备类型, 以响应用户环境的变化 或用户与 UA 交互方式的变化。

注:pointerhoverany-pointerany-hover 特性仅与指点设备的特征 (或指点设备的完全缺失)相关, 不能用于检测诸如键盘等非指点设备输入机制的存在。 作者应考虑非指点设备输入存在的可能性, 无论查询这些特性时匹配到哪些值。

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

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

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

pointer 媒体特性用于查询诸如鼠标之类的指点设备的存在与精确度。 如果存在多个指点设备, 则 pointer 媒体特性必须反映由用户代理决定的“主”指点设备的特征。 (要查询任何可用指点设备的能力, 请参见 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 媒体特性必须反映由用户代理决定的“主”指点设备的特征。 (要查询任何可用指点设备的能力, 请参见 any-hover 媒体特性。)

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

能够悬停但悬停不方便且不是其常用交互方式的指点设备, 也匹配该值。 例如,将长按视作悬停的触摸屏 会匹配 hover: none

hover
表示主指点设备可以轻松在页面局部上悬停。 示例包括鼠标以及类似 Nintendo Wii 控制器这类“物理指向屏幕”的设备。
例如,在可通过可选鼠标控制的触摸屏设备上, hover 媒体特性 应匹配 hover: none, 因为主指点设备(触摸屏)不允许用户悬停。

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

出于无障碍原因,即便在确实支持悬停的设备上, 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) 为假,则干脆隐藏滚动条以减少视觉杂乱。

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

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

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

device-width

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

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

device-width负值范围内为假

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

在以上示例中,样式表将仅适用于 长度小于 800px 的屏幕。 px 单位属于逻辑单位, 如 单位 一节所述。

注:若设备可在多种方向下使用, 例如竖屏与横屏, device-* 媒体特性反映当前方向。

device-height

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

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

device-height负值范围内为假

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

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

device-aspect-ratio

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

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

例如,若一个具有正方形像素的 screen 设备 有 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) { … }
测试

变更

自 2021 年 12 月 25 日候选推荐草案以来的变更

2021 年 12 月 25 日候选推荐草案 以来,本规范进行了以下变更:

自 2020 年 7 月 21 日候选推荐以来的变更

2020 年 7 月 21 日候选推荐 以来,本规范进行了以下变更:

自 2017 年 9 月 5 日候选推荐以来的变更

2017 年 9 月 5 日候选推荐 以来,本规范进行了以下变更:

自 2017 年 5 月 19 日工作草案以来的变更

2017 年 5 月 19 日工作草案 以来,本规范进行了以下变更:

相对 Media Queries Level 3 的变更

2012 年 6 月 19 日的 Media Queries Level 3 推荐以来,本规范进行了以下变更:

致谢

本规范是 W3C 级联样式表工作组的成果。

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

安全考虑

本规范未报告任何新的安全考虑事项。

隐私考虑

媒体查询使 CSS 能够查询页面环境的各个方面, 其中包括一些通过脚本很难或不可能发现的内容。 这可能带来隐私风险, 使对用户的指纹识别增强, 但总体风险较低。 至少,审视用户代理字符串也应能通过脚本推断出同样的信息。 然而,UA 字符串欺骗不会影响媒体查询, 使其成为一种在某种程度上更稳健的检测技术。

即便如此,媒体查询提供的信息相对粗粒度, 在这方面不会贡献太多熵。

少数遗留媒体特性(device-widthdevice-height、以及 device-aspect-ratio) 在没有明显收益的情况下暴露了 UA 运行环境的信息。 它们为兼容性原因而保留, 但出于隐私与安全考虑, UA 被允许报告不精确的信息。

TAG 制定了一份 自检问卷, 用于帮助编辑与工作组评估其规范引入的风险。 答案如下:

本规范是否处理可识别个人身份的信息?
否。
本规范是否处理高价值数据?
否。
本规范是否为某个来源引入跨浏览会话持久存在的新状态?
否。
本规范是否向 Web 暴露持久的跨来源状态?
否。
本规范是否向某个来源暴露其当前无法访问的其他数据?
否。
本规范是否启用新的脚本执行/加载机制?
否。
本规范是否允许某个来源访问用户的位置?
否。
本规范是否允许某个来源访问用户设备上的传感器?
否。
本规范是否允许某个来源访问用户本地计算环境的某些方面?
是,如本问卷上方文字所述。
本规范是否允许某个来源访问其他设备?
否。
本规范是否允许某个来源在一定程度上控制用户代理的原生 UI?
否。
本规范是否向 Web 暴露临时标识符?
否。
本规范是否区分第一方与第三方上下文下的行为?
否。
本规范在用户代理的“隐身”模式下应如何工作?
无需行为差异。
本规范是否将数据持久化到用户本地设备?
否。
本规范是否包含“安全考虑”和“隐私考虑”章节?
是,你正在阅读的就是该章节。
本规范是否允许降低默认安全特性?
否。

一致性

文档约定

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

本规范的全部文本都是规范性的,除非某些章节 被明确标记为非规范性(non-normative),以及示例与注释。[RFC2119]

本规范中的示例由 “例如(for example)” 等词引入,或通过 class="example" 与规范性文本区分开来, 如下所示:

这是一个信息性示例的例子。

信息性注释以 “Note” 一词开头,并通过 class="note" 与规范性文本区分开来, 如下所示:

Note,这是一条信息性注释。

告诫(Advisements)是经过样式处理、用以唤起特别注意的规范性章节,并通过 <strong class="advisement"> 与其他规范性文本区分开来,例如: UAs MUST provide an accessible alternative.

测试

与本规范内容相关的测试 可能会在像这样一个 “Tests” 块中说明。 任何此类块都是非规范性的。


一致性类别

本规范的一致性 定义了三类一致性类别:

样式表
一种 CSS 样式表
渲染器
一种 UA,用于解释样式表的语义并渲染 使用它们的文档。
编写工具
一种 UA,用于编写样式表。

若一份样式表中所有使用本模块所定义语法的陈述 都按照通用 CSS 文法以及本模块中每项特性所定义的各自文法是有效的, 则该样式表符合本规范。

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

若一个编写工具能够编写在语法上正确的样式表, 其正确性符合通用 CSS 文法与本模块中每项特性各自的文法, 并满足本模块中所描述的样式表的所有其他一致性要求, 则该编写工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则来指定回退值, CSS 渲染器 必须 将其没有可用支持级别的任何 at-rule、属性、属性值、关键字 以及其他语法构造视为无效(并 在适当情况下忽略)。 尤其是,用户代理 不得 在同一条多值属性声明中 选择性忽略不支持的组件值、同时又采纳受支持的值: 如果任何值被视为无效(如不支持的值必须如此), 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 邮件列表。

CR 退出标准

为使本规范推进到拟推荐(Proposed Recommendation), 每项特性必须至少有两种独立、可互操作的实现。 每项特性可以由不同的一组产品实现;不要求所有特性都由同一个产品实现。 为了本标准的目的,我们定义以下术语:

独立
每个实现必须由不同的主体开发, 并且不得共享、复用或派生自另一种符合条件实现所使用的代码。 与本规范实现无关的代码段 不受此要求约束。
可互操作
通过官方 CSS 测试套件中相应的测试用例, 或者若该实现不是 Web 浏览器,则通过等效测试。 若此类用户代理(UA)要用于声明互操作性, 测试套件中的每个相关测试都应创建一个等效测试。 此外,若此类 UA 要用于声明互操作性, 则还必须有一个或多个额外的 UA, 能以同样方式通过这些等效测试, 以满足互操作性的要求。 等效测试必须公开提供,以便同行评审。
实现
一种用户代理,其:
  1. 实现本规范。
  2. 向公众提供。该实现可以是已发货产品或其他公开可用版本 (例如 beta 版本、预览版本或 “nightly build”)。 非发货产品的发布版本必须至少实现该特性一个月, 以证明其稳定性。
  3. 不是实验性的(即:专为通过测试套件而设计、且不打算用于后续常规使用的版本)。

本规范将作为候选推荐(Candidate Recommendation)至少保留六个月。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考

[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-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-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-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 22 March 2024. CRD. URL: https://www.w3.org/TR/css-values-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-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 16 September 2025. WD. URL: https://www.w3.org/TR/cssom-view-1/
[MEDIAQUERIES-3]
Florian Rivoal. Media Queries Level 3. 21 May 2024. REC. URL: https://www.w3.org/TR/mediaqueries-3/
[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

信息性参考

[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/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[ITU-R-BT-2020-2]
用于制作与国际节目交换的超高清电视系统参数值. October 2015. URL: https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre. Internet Fax (V2) 的内容特性模式. August 2000. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2879
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器第 4 级. 22 January 2026. WD. URL: https://www.w3.org/TR/selectors-4/
[SRGB]
多媒体系统与设备——颜色测量与管理——第 2-1 部分:颜色管理——默认 RGB 色彩空间—— sRGB. URL: https://webstore.iec.ch/publication/6169
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. 将样式表与 XML 文档关联 1.0 (第二版). 28 October 2010. REC. URL: https://www.w3.org/TR/xml-stylesheet/

属性索引

未定义任何属性。

@media 描述符

名称 初始值 类型
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
grid <mq-boolean> discrete
height <length> range
hover none | hover discrete
monochrome <integer> range
orientation portrait | landscape discrete
overflow-block none | scroll | paged discrete
overflow-inline none | scroll discrete
pointer none | coarse | fine discrete
resolution <resolution> | infinite range
scan interlace | progressive discrete
update none | slow | fast discrete
width <length> range