媒体查询级别 4

W3C 候选推荐标准草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2026/CRD-mediaqueries-4-20260219/
最新发布版本
https://w3org.cn/TR/mediaqueries-4/
编辑草案
https://drafts.csswg.org/mediaqueries-4/
历史版本
历史
https://w3org.cn/standards/history/mediaqueries-4/
实现报告
https://wpt.fyi/results/css/mediaqueries
反馈
CSS 工作组问题仓库
编辑
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 上提交问题(首选)发送反馈,并在标题中包含规范代码“mediaqueries”,格式如下:“[mediaqueries] …意见摘要…”。所有议题和意见均已存档。此外,也可以将反馈发送至(已存档的)公共邮件列表 www-style@w3.org

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

本文档由在一个受 W3C 专利政策约束下运作的组织制作。W3C 维护着一份与该组织交付成果相关的专利披露公开列表;该页面还包含了披露专利的说明。任何个人如果确实获知其认为包含必要权利要求 (Essential Claim) 的专利,必须根据 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初始值,由用户代理或用户偏好定义,而不是页面上的任何样式。

测试

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

当用户环境发生已知变化时,用户代理必须重新评估媒体查询,例如设备从横屏切换为竖屏,并相应地改变依赖于这些媒体查询的任何结构的行为。

除非另一个特性明确指定它会影响媒体查询的解析,否则为了评估表达式而应用样式表永远不是必要的。

测试

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

不幸的是,这意味着使用这种错误处理行为的旧版用户代理将忽略媒体查询中的任何媒体特性,即使它们比查询中的媒体类型重要得多。这可能导致样式在不适当的情况下被意外应用。

为了向旧版用户代理隐藏这些媒体查询,可以在媒体查询前加上 only 关键字。only 关键字对媒体查询的结果没有任何影响,但会导致媒体查询被旧版用户代理解析为指定了未知媒体类型“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
匹配打印机,以及旨在重现打印显示的设备,例如以“打印预览”模式显示文档的 Web 浏览器。
screen
匹配所有未被 print 匹配的设备。

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

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

注意:预期所有的媒体类型最终也将被弃用,因为定义了适当的媒体特性来捕捉它们的重要差异。

测试

2.4. 媒体特性

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

在语法上,媒体特性类似于 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. 媒体特性类型:“范围型”和“离散型”

每个媒体特性都在其定义表中将其“类型”定义为“范围型”或“离散型”。

“离散型”媒体特性,如 pointer,其值取自集合。这些值可以是关键字或布尔数字(0 和 1),但共同点是它们没有内在的“顺序”——没有任何值比其他值“小”或“大”。

另一方面,“范围型”媒体特性如 width,其值取自一个范围。任何两个值都可以进行比较,以查看哪一个较小,哪一个较大。

两种类型之间唯一的显著区别在于,“范围型”媒体特性可以在范围上下文中进行评估,并接受在其名称上加上“min-”和“max-”前缀。执行其中任何一项操作都会改变特性的含义——该媒体特性不再是在特性精确匹配给定值时为真,而是在特性大于/小于/等于给定值时匹配。

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

另一方面,(width: 600px) 本身仅在视口宽度正好600px 时才为真。如果小于或大于 600px,则为假。

2.4.2. 在布尔上下文中评估媒体特性

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

以这种方式书写时,媒体特性将在布尔上下文中进行评估。如果该特性对于除数字 0、值为 0<dimension> 或关键字 none 之外的任何值都为真,则该媒体特性评估为真。否则,它评估为假。

一些媒体特性旨在以这种方式书写。

例如,update 通常写为 (update) 以测试是否可用任何类型的更新,或写为 not (update) 以检查相反的情况。

它仍然可以给定一个明确的值,(update: fast) 或 (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. 在范围上下文中评估媒体特性

具有“范围”类型的媒体特性可以交替地写在范围上下文中,利用其值是有序的这一事实,使用普通的数学比较运算符

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

注意:此语法是 Mediaqueries 第 4 版中的新增内容,因此目前不像 min-/max- 前缀那样得到广泛支持。

基本形式由特性名称、比较运算符和值组成,如果关系为真,则返回真。

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

其余形式,将特性名称嵌套在两个值比较之间,如果两个比较都为真,则返回真。

例如,如果视口宽度在 400px1000px 之间(但不等于两者),则 (400px < width < 1000px) 返回真。

一些具有“范围”类型的媒体特性被称为在负值范围内为假。这意味着负值是有效的并且必须被解析,并且查询该媒体特性是否等于、小于或小于等于任何此类负值必须评估为假。查询该媒体特性是否大于或大于等于负值,如果关系为真,则评估为真。

注意:如果负值在解析时被拒绝,它们将根据错误处理规则被视为 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-”前缀

特性可以写成普通的媒体特性,但特性名称前带有“min-”或“max-”前缀,而不是如上所述在范围上下文中评估“范围”类型的媒体特性

这等同于在范围上下文中评估特性,如下所示

注意:因为“min-”和“max-”都等同于包含该值的范围比较,它们在某些情况下可能会产生限制。

例如,试图根据视口宽度断点使用“min-”和“max-”来定义不同样式的作者通常会偏移他们比较的值,以确保两个查询不会同时评估为真。假设断点在 320px,作者在概念上会使用
@media (max-width: 320px) { /* styles for viewports <= 320px */ }
@media (min-width: 321px) { /* styles for viewports >= 321px */ }

虽然这确保了当视口宽度为 320px 时两组样式不会同时应用,但它没有考虑到由于非整数像素密度(例如在高 dpi 显示器上或由于缩放)而可能出现的碎片化视口尺寸的可能性。任何落在 320px 和 321px 之间的视口宽度将导致没有任何样式被应用。

解决此问题的一种方法是提高用于比较的值的精度。使用上面的示例,将第二个比较值更改为 320.01px 可以显著降低设备上的视口宽度落在两者之间的几率。

@media (max-width: 320px) { /* styles for viewports <= 320px */ }
@media (min-width: 320.01px) { /* styles for viewports >= 320.01px */ }

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

@media (width <= 320px) { /* styles for viewports <= 320px */ }
@media (width > 320px) { /* styles for viewports > 320px */ }

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

例如,(min-grid: 1) 是无效的,因为 grid 是一个“离散型”媒体特性,因此不接受前缀。(尽管 grid 媒体特性看起来是数字的,因为它接受值 01。)

试图在布尔上下文中评估带有 min/max 前缀的媒体特性是无效的,属于语法错误。

2.5. 组合媒体特性

多个媒体特性可以使用完整的布尔代数(not、and、or)组合在一起成为媒体条件

在媒体查询的同一“层级”混合使用 andornot无效的。例如,(color) and (pointer) or (hover) 是非法的,因为其含义不明确。相反,可以使用括号来分组使用特定连接关键字的内容,得出 (color) and ((pointer) or (hover))((color) and (pointer)) or (hover)。这两者有非常不同的含义:如果只有 (hover) 为真,前者评估为假,但后者评估为真。

测试

3. 语法

媒体查询语法的非正式描述出现在前面的章节的正文和铁路图中。正式的媒体查询语法在本节中描述,规则/属性语法定义在 [CSS-SYNTAX-3][CSS-VALUES-3] 中。

要解析 <media-query-list> 产品,请解析逗号分隔的组件值列表,然后将返回列表中的每个条目解析为 <media-query>。其值为所产生的 <media-query> 列表。

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

注意:此对 <media-query-list> 解析的定义特意接受空列表。

注意:根据 [CSS-SYNTAX-3],标记是 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> 项的否定。未知的否定是未知的。
<media-in-parens> <media-and>*
如果 <media-in-parens> 子项和 <media-and> 子项的所有 <media-in-parens> 子项都为真,则结果为真;如果这些 <media-in-parens> 项中至少有一个为假,则为假;否则为未知。
<media-in-parens> <media-or>*
如果 <media-in-parens> 子项和 <media-or> 子项的所有 <media-in-parens> 子项都为假,则结果为假;如果这些 <media-in-parens> 项中至少有一个为真,则为真;否则为未知。
<general-enclosed>
结果是未知的。

作者不得在样式表中使用 <general-enclosed>它仅存在用于未来兼容性,以便新的语法添加不会使旧版用户代理中的过多 <media-condition> 无效。

<media-feature>
结果是评估指定媒体特性的结果。

如果上述任何生产的结果用于需要双值布尔值的上下文中,“未知”必须转换为“假”。

注意:这意味着,例如,当媒体查询用于 @media 规则时,如果它解析为“未知”,它会被视为“假”且不匹配。

媒体查询使用三值逻辑,其中项可以是“真”、“假”或“未知”。具体来说,它使用 Kleene 三值逻辑。在这种逻辑中,“未知”意味着“要么是真要么是假,但我们还不确定是哪一个”。

通常,公式中出现的未知值也会使公式变为未知,因为用“真”代替未知将给公式一个与用“假”代替未知不同的结果。消除未知值的唯一方法是在一个无论未知项是被替换为“真”还是“假”值,结果都相同的公式中使用它。这种情况出现在“假 AND 未知”(始终评估为假)和“真 OR 未知”(始终评估为真)时。

采用这种逻辑是因为 <general-enclosed> 需要被分配一个真值。在标准布尔逻辑中,唯一合理的真值是“假”,但这意味着 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>,或者与该媒体特性的值语法不匹配的特性值,结果为“未知”。其值为“未知”的 <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 特性

名称width
对于@media
<length>(长度)
类型值域 (range)

width 媒体特性描述了输出设备目标显示区域的宽度。对于连续媒体,这是视口的宽度(如 CSS2 第 9.1.1 节 [CSS2] 所述),包括渲染出的滚动条大小(如果有)。对于分页媒体,这是页面盒模型的宽度(如 CSS2 第 13.2 节 [CSS2] 所述)。

<length> 根据 § 1.3 单位 进行解释。

width 在负值范围内为假 (false)

例如,此媒体查询表示样式表用于宽度大于 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 特性

名称height
对于@media
<length>(长度)
类型值域 (range)

height 媒体特性描述了输出设备目标显示区域的高度。对于连续媒体,这是视口的高度,包括渲染出的滚动条大小(如果有)。对于分页媒体,这是页面盒模型的高度。

<length> 根据 § 1.3 单位 进行解释。

height 在负值范围内为假 (false)

4.3. Aspect-Ratio: aspect-ratio 特性

名称aspect-ratio
对于@media
<ratio>
类型值域 (range)

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

测试

4.4. Orientation: orientation 特性

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

5. 显示质量媒体特性

5.1. Display Resolution: resolution 特性

名称resolution
对于@media
<resolution> | infinite
类型值域 (range)

resolution 媒体特性描述输出设备的解析度,即像素密度,需考虑页面缩放,但假设比例因子为 1.0。

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

当查询具有非方形像素的媒体时,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 单位的设备像素数量。此映射由用户代理完成,因此对用户代理始终是已知的。

如果用户代理不知道物理像素的几何形状,或者知道物理像素的几何形状且它们是(足够接近)正方形,它就不会在每个轴上映射不同数量的设备像素,因此垂直和水平分辨率之间不会有差异。

否则,如果 UA 选择在每个轴上映射不同数量,这将是为了响应物理像素本身不是正方形的情况。UA 如何获取此知识不在本规范范围内,但只要拥有足够的信息来做出此决定,如果设备旋转 90 度,它就可以反转映射。

5.2. Display Type: scan 特性

名称scan
对于@media
interlace | progressive
类型离散 (discrete)

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

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

在隔行扫描屏幕上显示时,作者应避免屏幕上的极快移动以防止“梳状效应”,并应确保屏幕上的细节宽度大于 1px 以避免 “闪烁” (twitter)

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

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

例如,衬线字体中字母的“衬线”是非常小的特征,在隔行扫描设备上可能会引发“闪烁”。scan 媒体特性可用于检测此情况,并使用不太可能发生“闪烁”的替代字体。
@media (scan: interlace) { body { font-family: sans-serif; } }

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

5.3. Detecting Console Displays: grid 特性

名称grid
对于@media
<mq-boolean>
类型离散 (discrete)
<mq-boolean> = <integer [0,1]>

grid 媒体特性用于查询输出设备是网格型还是位图型。如果输出设备是基于网格的(例如,“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. Display Update Frequency: 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; }
}
/* In non-updating UAs, the links get their default underline at all times. */
测试

5.5. Block-Axis Overflow: overflow-block 特性

名称overflow-block
对于@media
none | scroll | paged
类型离散 (discrete)

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

none(无)
块轴上没有溢出的余地;任何溢出的内容直接不显示。示例:广告牌。
scroll
块轴上的溢出内容通过允许用户滚动来显示。示例:电脑屏幕。
分页的
内容被拆分为离散的页面;在块轴上溢出一个页面的内容显示在下一页。示例:打印机、电子书阅读器。

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

注意:未来可能会为此媒体特性添加其他值,以描述具有混合行为的各类用户代理,结合了连续分页媒体的方面。例如,Presto 布局引擎(现已停用)发布了一种半分页演示模式行为,类似于 continuous,但它尊重强制分页符。由于不知道目前有任何具有这种行为的正在发行的用户代理,工作组决定在本级别不添加此类值,以免错误描述任何此类用户代理。任何实现了上述值均无法充分描述的用户代理的作者,鼓励联系工作组,以便考虑对此媒体特性的扩展。

测试

5.6. Inline-Axis Overflow: overflow-inline 特性

名称overflow-inline
对于@media
none | scroll
类型离散 (discrete)

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

none(无)
行内轴上没有溢出的余地;任何溢出的内容直接不显示。
scroll
行内轴上的溢出内容通过允许用户滚动来显示。

注意:目前没有已知的关于行内溢出内容的“分页”溢出实现,且该概念本身似乎意义不大,因此有意不为 overflow-inline 提供 paged 值。

6. 颜色媒体特性

6.1. Color Depth: color 特性

名称color
对于@media
<integer>(整数)
类型值域 (range)

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

color 在负值范围内为假 (false)

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

如果不同的颜色组件由不同数量的位表示,则使用最小的数字。

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

在具有索引颜色的设备中,使用查找表中每个颜色组件的最小位数。

注意:上述功能仅能在表面层面上描述颜色能力。color-gamut 通常与作者的需求更相关。如果需要进一步的功能,RFC2879 [RFC2879] 提供了可能在以后阶段支持的更具体的媒体特性。

6.2. Paletted Color Screens: color-index 特性

名称color-index
对于@media
<integer>(整数)
类型值域 (range)

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

color-index 在负值范围内为假 (false)

例如,这里有两种表达样式表适用于所有索引颜色设备的方法
@media (color-index) { … }
@media (color-index >= 1) { … }
此媒体查询表示样式表适用于具有 256 个或更多条目的索引颜色设备
<?xml-stylesheet media="(min-color-index: 256)"
  href="http://www.example.com/…" ?>

6.3. Monochrome Screens: monochrome 特性

名称单色
对于@media
<integer>(整数)
类型值域 (range)

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

monochrome 在负值范围内为假 (false)

例如,如何表示样式表适用于所有单色设备
@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 Display Quality: 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 建议书 BT.2020 色彩空间指定的色域或更大范围。

注意:rec2020 色域大于并包含 p3 色域。

下表列出了这些色彩空间的基色及其色彩空间色度坐标,定义于 [COLORIMETRY]

色彩空间白点基色
红色绿色蓝色
xWyWxRyRxGyGxByB
srgb0.3127 0.3290 0.640 0.330 0.300 0.600 0.150 0.060
p30.3127 0.3290 0.680 0.320 0.265 0.690 0.150 0.060
rec20200.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 的更多信息,请参阅 [ITU-R-BT-2020-2]

例如,此媒体查询适用于显示器支持 Display P3 范围内颜色的情况。
@media (color-gamut: p3) {}

注意:如果输出设备的全部输出色域足够大,或者一个色域是另一个支持色域的子集,则输出设备可以对多个此媒体特性的值返回真值。因此,此特性最好以“升序”方式使用——当 (color-gamut: srgb) 为真时设置基本值,如果 (color-gamut: p3) 为真则覆盖它,依此类推。

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

测试

7. 交互媒体特性

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

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

pointerhover 特性与“主要”指针设备的特征相关,而 any-pointerany-hover 可用于查询所有潜在可用指针设备的属性。

注意:虽然本规范未定义用户代理应如何确定“主要”指针设备,但预期用户代理应通过结合关于其运行的设备/环境、可用指针设备的数量和类型、以及其中哪一个通常和/或当前正在使用的概念来做出此决定。在设备的主要输入机制不是指针设备,但存在次要的(且使用频率较低的)作为指针设备的输入的情况下,用户代理可能决定将非指针设备视为主要输入(导致 pointer: none)。用户代理也可能决定响应用户环境变化或用户与 UA 交互方式的变化,动态更改被视为主要的指针设备类型。

注意:pointer, hover, any-pointerany-hover 特性仅涉及指针设备的特征或完全缺失,不能用于检测键盘等非指针设备输入机制的存在。作者应考虑到非指针设备输入可能存在,无论查询这些特性时匹配了哪些值。

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

7.1. Pointing Device Quality: 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 潜在指针设备纳入考量。

/* Make radio buttons and check boxes larger if we have an inaccurate primary pointing device */
@media (pointer: coarse) {
  input[type="checkbox"], input[type="radio"] {
    min-width: 30px;
    min-height: 40px;
    background: transparent;
  }
}

7.2. Hover Capability: hover 特性

名称hover(悬停)
对于@media
none | hover
类型离散 (discrete)

hover 媒体特性用于查询用户使用主要指针设备在页面元素上悬停的能力。如果设备有多个指针设备,hover 媒体特性必须反映由用户代理确定的“主要”指针设备的特征。(要查询任何可用指针设备的功能,请参阅 any-hover 媒体特性。)

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

可以悬停但悬停非常不便且非正常使用方式的指针设备也匹配此值。例如,将长按视为悬停的触摸屏将匹配 hover: none

hover(悬停)
表示主要指针设备可以轻松在页面部分上悬停。示例包括鼠标和物理指向屏幕的设备,如任天堂 Wii 控制器。
例如,在同时可以通过可选鼠标控制的触摸屏设备上,hover 媒体特性应匹配 hover: none,因为主要指针设备(触摸屏)不允许用户悬停。

然而,尽管如此,可选鼠标确实允许用户悬停。因此,作者不应预设 :hover 伪类永远不会在 hover: none 为真的设备上匹配,但他们应设计不依赖悬停即可完全使用的布局。

出于可访问性原因,即使在支持悬停的设备上,UA 也可能为此媒体查询给出 hover: none 的值,以选择那些无需悬停即可良好工作的布局。注意,即使主要输入机制具有 hover: hover 能力,用户可能还有其他不提供悬停能力的输入机制可用。

/* Only use a hover-activated drop down menu on devices that can conveniently 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 用于查询指针设备的存在和精度。它不考虑任何额外的非指针设备输入,也不能用于测试是否存在其他不会移动屏幕指针的输入机制,如方向键或仅键盘控制。any-pointer: none 仅在确实没有任何指针设备存在时才会评估为真。
在具有鼠标和键盘的传统桌面环境中,any-pointer: none 将为假(由于鼠标的存在),即使也存在非指针输入(键盘)。
any-hover: none 仅在没有指针设备,或者所有存在的指针设备都缺乏悬停能力时才会评估为真。因此,它应被理解为测试是否存在任何具有悬停能力的指针设备,而不是测试是否没有任何指针设备具有悬停能力。后一种情况目前无法使用 any-hover 或任何其他交互媒体特性来确定。此外,它不考虑任何非指针设备输入,如方向键或仅键盘控制,它们本质上也都不具备悬停能力。
在具有鼠标和触摸屏的支持触摸的笔记本电脑上,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:已弃用的媒体特性

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

要查询视口的大小(或页面媒体上的页面盒模型),应使用 width, heightaspect-ratio 媒体特性,而不是 device-width, device-heightdevice-aspect-ratio,后者指的是设备的物理尺寸,而不考虑布局中文档有多少可用空间。device-* 媒体特性有时也用作检测移动设备的代理。相反,作者应使用更能代表他们试图针对其进行样式设计的设备方面的媒体特性

device-width

名称device-width
对于@media
<length>(长度)
类型值域 (range)

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

device-width 在负值范围内为假 (false)

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

在上面的例子中,样式表将仅适用于长度小于 800px 的屏幕。px 单位是逻辑单位,如“单位”部分所述。

注意:如果设备可以在多种方向(如纵向和横向)下使用,则 device-* 媒体特性反映当前的方向。

device-height

名称device-height
对于@media
<length>(长度)
类型值域 (range)

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

device-height 在负值范围内为假 (false)

<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 媒体特性的值之比。

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

变更 (Changes)

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

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

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

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

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

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

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

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

自媒体查询 Level 3 以来的变更

2012 年 6 月 19 日媒体查询 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-width, device-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 中的描述进行解释。然而,为了可读性,这些词在本文档中不以全大写形式出现。

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

本规范中的示例均以“例如”一词引入,或者通过 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

建议(Advisements)是规范性章节,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

测试

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


一致性类别

本规范为三类一致性定义了一致性要求。

样式表
一份 CSS 样式表
渲染器
一种 用户代理 (UA),它解释样式表的语义并渲染使用它们的文档。
创作工具
一种 用户代理 (UA),用于编写样式表。

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定后备值,CSS 渲染器 **必须** 将其无法使用支持级别的任何 @规则、属性、属性值、关键字和其他语法结构视为无效(并 适当忽略)。特别地,用户代理 **不得** 在单一多值属性声明中选择性地忽略不支持的组件值而保留支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 功能发生冲突,CSS 工作组建议在实施不稳定功能和私有扩展遵循最佳实践

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

有关提交测试用例和实现报告的详细信息,请访问 CSS 工作组网站 https://w3org.cn/Style/CSS/Test/。问题可发送至 public-css-testsuite@w3.org 邮件列表。

候选推荐标准 (CR) 退出标准

为了使本规范能够推进到提案推荐标准 (PR),必须至少有两个独立的、可互操作的每个功能的实现。每个功能可以由不同组的产品实现,不要求所有功能都由单个产品实现。为了实现此标准,我们定义以下术语

independent
每个实现必须由不同的方开发,并且不能共享、重用或派生自另一个合格实现所使用的代码。对本规范实现无影响的代码段不受此要求限制。
可互操作
通过官方 CSS 测试套件中的相应测试用例,或者如果实现不是 Web 浏览器,则通过等效测试。如果此类用户代理 (UA) 用于声明互操作性,则测试套件中的每个相关测试都应创建等效测试。此外,如果此类 UA 用于声明互操作性,则必须有一个或多个额外的 UA,它们也可以以相同的方式通过这些等效测试,以实现互操作性的目的。等效测试必须公开,以供同行评审。
实现
用户代理,即
  1. 实现了该规范。
  2. 对公众可用。该实现可以是出货产品或其他公开可用的版本(即测试版、预览发布版或“每日构建版”)。非出货产品发布版必须已实现该功能至少一个月,以证明其稳定性。
  3. 不是实验性的(即,专门为通过测试套件设计且不打算用于正常使用的版本)。

该规范将保持候选推荐标准状态至少六个月。

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[COLORIMETRY]
比色法,第四版。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. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS 条件规则模块 3 级 (CSS Conditional Rules Module Level 3). 2024年8月15日. CRD. URL: https://w3org.cn/TR/css-conditional-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 语法模块 3 级 (CSS Syntax Module Level 3). 2021年12月24日. CRD. URL: https://w3org.cn/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 3 级 (CSS Values and Units Module Level 3). 2024年3月22日. CRD. URL: https://w3org.cn/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 4 级 (CSS Values and Units Module Level 4). 2024年3月12日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://w3org.cn/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. 层叠样式表 2 级修订版 1 (CSS 2.1) 规范 (Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification). 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS2/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM 视图模块. 2025 年 9 月 16 日. WD. URL: https://w3org.cn/TR/cssom-view-1/
[MEDIAQUERIES-3]
Florian Rivoal. 媒体查询 3 级. 2024 年 5 月 21 日. REC. URL: https://w3org.cn/TR/mediaqueries-3/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考资料

[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024年2月1日. WD. URL: https://w3org.cn/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 规范. 2018 年 3 月 27 日. REC. URL: https://w3org.cn/TR/html401/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
[ITU-R-BT-2020-2]
超高清电视系统的制作与国际节目交换参数值。2015 年 10 月。URL: https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre. 互联网传真内容特征模式 (V2)。2000 年 8 月。建议标准。URL: https://www.rfc-editor.org/rfc/rfc2879
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器 4 级. 2026 年 1 月 22 日. WD. URL: https://w3org.cn/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(第二版)。2010 年 10 月 28 日。推荐标准 (REC)。URL: https://w3org.cn/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)
单色 <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)