媒体查询 第 4 级

W3C 候选推荐草案,

关于本文档的更多信息
此版本:
https://www.w3.org/TR/2021/CRD-mediaqueries-4-20211225/
最新发布版本:
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. (谷歌)
前编辑:
(Opera)
(Mozilla)
(Disruptive Innovations)
(Mozilla)
建议为此规范提交编辑:
GitHub 编辑器

摘要

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

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

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

本文档的状态

本节描述了本文档在发布时的状态。 当前 W3C 出版物的列表 和此技术报告的最新修订版 可以在 W3C 技术报告索引 https://www.w3.org/TR/ 中找到。

本文档由 CSS 工作组 作为候选推荐草案发布,采用了 推荐轨迹。 发布为候选推荐 并不意味着 W3C 及其成员的认可。 候选推荐草案 集成了工作组打算在后续候选推荐快照中包含的对先前候选推荐的更改。

这是一个草案文档, 可能随时更新、替换或被其他文档取代。 除了作为工作进行中的内容,不应以其他形式引用本文档。

请通过 在 GitHub 上提交问题(首选)提供反馈, 标题中包括规范代码“mediaqueries”,例如: “[mediaqueries] …评论摘要…”。 所有问题和评论都在 档案中。 另外,反馈也可以发送到(已存档)公共邮件列表 www-style@w3.org

本文档由 2021 年 11 月 2 日 W3C 过程文档 管辖。

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

当前没有初步的互操作性或实施报告。

以下功能处于风险中,可能在 CR 期间被删除:

“风险中”是 W3C 过程中的术语,并不一定意味着该功能有被删除或延迟的风险。它意味着工作组认为该功能在及时实现互操作性方面可能存在困难,将其标记为“风险中”使得工作组在向提议推荐阶段过渡时,如果有必要,可以直接删除该功能,而不需要先发布一个没有该功能的新候选推荐版本。

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)适用于某个媒体类型的设备(屏幕)具有某个特性(它必须是彩色屏幕)。

这是在CSS中的@import规则中编写的相同媒体查询:

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

用户代理必须响应其所知的用户环境变化重新评估媒体查询,例如当设备从横向变为纵向时,并相应更改任何依赖这些媒体查询的构造的行为。

除非其他功能明确规定它会影响媒体查询的解析,否则永远不需要应用样式表来评估表达式。

2.1. 组合媒体查询

多个媒体查询可以组合为以逗号分隔的媒体查询列表

media query ,

一个 媒体查询列表 为 `true`,如果其组成的任何一个 媒体查询 为 `true`,而只有当其组成的所有 媒体查询 都为 `false` 时,媒体查询列表才为 `false`。

例如,以下 媒体查询列表 在以下情况下为 `true`: 如果 媒体类型screen,并且它是一个彩色设备, 媒体类型是 projection 并且它是一个彩色设备:
@media screen and (color), projection and (color) { … }

一个空的 媒体查询列表 总是为 `true`。

例如,这些是等价的:
@media all { … }
@media { … }

2.2. 媒体查询修饰符

一个 媒体查询 可以选择性地以一个 媒体查询修饰符 作为前缀,该修饰符是一个用于改变后续 媒体查询 含义的单一关键字。

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

通过在前面加上 not 关键字,单个 媒体查询 的结果可以被取反。如果 媒体查询 通常会评估为 `true`,加上 not 后会使其评估为 `false`,反之亦然。

例如,以下样式将适用于除具有颜色能力的屏幕以外的所有设备。请注意,整个媒体查询被取反,而不仅仅是 媒体类型
<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)的媒体查询,将自动被旧版用户代理视为 false。

注意: 在本规范发布时,这种旧版用户代理非常罕见,因此很少或几乎不需要使用 only 修饰符。

2.3. 媒体类型

媒体类型是用户代理设备的一个广泛类别,文档可以在这些设备上显示。最初的一组媒体类型是在 HTML4 中为 media 属性(如 <link> 元素)定义的。

不幸的是,媒体类型在区分具有不同样式需求的设备方面证明是不够的。自发明以来,一些最初非常独特的类别,如 screenhandheld,在过去的几年中已经显著融合。其他一些类别,如 ttytv,暴露出有别于全功能计算机显示器的有用差异,因此可能需要针对这些类别进行不同的样式处理,但媒体类型被定义为互斥的,导致在合理的方式下使用它们变得困难。相反,它们的独特方面更适合通过媒体特性来表达,如 gridscan

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

all
匹配所有设备。
print
匹配打印设备,以及用于再现打印显示的设备,如“打印预览”中显示文档的浏览器。
screen
匹配所有不被 print 匹配的设备。

此外,以下已弃用媒体类型被定义。作者不应使用这些媒体类型;相反,建议他们选择适当的媒体特性,以更好地表示他们试图样式化的设备特性。

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

注意:预计所有媒体类型最终都会被弃用,因为合适的媒体特性已被定义,能够捕捉到它们的重要差异。

2.4. 媒体特征

媒体特性媒体类型更细化,用于测试用户代理或显示设备的单个特定特性。

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

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

但是,属性和媒体特性之间有几个重要的区别:

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

媒体特性device-aspect-ratio仅适用于视觉设备。在语音设备上,涉及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-”前缀。这样做会改变特性的含义——媒体特性与给定值完全匹配时为真,而不是在特性大于/小于/等于给定值时为真。

''(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. 在范围上下文中评估媒体特征

具有“范围”类型的媒体特性可以在利用值的有序性、使用普通数学比较运算符的范围上下文中进行编写:

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

注意:这种语法是媒体查询第4级的新内容,因此目前还没有像 min-/max- 前缀那样被广泛支持。

基本形式包括一个特性名称、一个比较运算符和一个值,如果关系成立,则返回 true。

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

其余形式中,将特性名称嵌入到两个值的比较之间,如果两个比较都为真,则返回 true。

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

某些具有“范围”类型的媒体特性被称为 在负范围内为假。这意味着负值是有效的,必须解析,并且查询媒体特性是否等于、小于或小于等于任何这样的负值必须返回 false。查询媒体特性是否大于或大于等于负值,如果关系成立,则返回 true。

注意:如果负值在解析时被拒绝,它们将根据错误处理规则被视为 未知。然而,实际上,设备的 分辨率 是否为 -300dpi 并不是未知的,而是已知为假。同样,对于任何视觉设备,目标显示区域的 宽度 已知大于 -200px。上述规则反映了这一点,使直觉与用户代理的行为相符。

以下示例在所有视觉设备上均会使背景变为绿色:
@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级中的语法错误——包括禁止的值——导致整个 媒体查询 为假,而不是像这一等级中定义的那样被视为 未知。从第3级更新的实现应确保在添加对§ 2.5 组合媒体特性中定义的更丰富语法的支持时更改对相关属性的负值处理,以避免引入意外的语义。

2.4.4. 使用 "min-" 和 "max-" 前缀在范围特性上

与其在范围上下文中评估“范围”类型的媒体特性,如上所述,该特性可以写为普通的媒体特征,但在特性名称上加上 "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 的样式 */ }

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

例如,(min-grid: 1) 是无效的,因为网格是一个“离散”的媒体特性,因此不接受前缀。(尽管 网格 媒体特征看起来是数字的,因为它接受值 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> 产生式不包括 onlynotandor 关键字。

“<” 或 “>” <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-or>*
<media-in-parens> 子项及 <media-or> 子项的所有 <media-in-parens> 子项都为假时,结果为假;如果这些项中至少有一个为真,结果为真;否则为未知。
<general-enclosed>
结果为未知。

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

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

如果上面任一产生式的结果在任何需要两个值布尔值的上下文中使用,则“未知”必须转换为“假”。

注意:这意味着,当 媒体查询 用于 @media 规则时,如果其解析为“未知”,则将其视为“假”并匹配失败。

媒体查询使用三值逻辑,其中项可以为“真”、“假”或“未知”。具体来说,它使用 Kleene 3值逻辑。在这种逻辑中,“未知”表示“可能为真或假,但我们不确定是哪一个”。

通常,公式中出现未知值会导致公式本身也是未知的,因为将未知替换为“真”与将其替换为“假”会给出不同的结果。消除未知值的唯一方法是将其用于一个公式中,无论未知值替换为真还是假,该公式都能给出相同的结果。这种情况发生在“假 与 未知”(无论如何结果为假)以及“真 或 未知”(无论如何结果为真)时。

采用这种逻辑是因为 <general-enclosed> 需要被赋予一个真值。在标准布尔逻辑中,唯一合理的值是“假”,但这意味着 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>,或不允许的 <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
适用: @media
值: <length>
类型: 范围

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

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

width 在负范围内为 false

例如,此媒体查询表示样式表用于宽度大于 25 厘米的打印输出:
<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>
类型: 范围

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

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

height 在负范围内为 false

4.3. 宽高比:aspect-ratio 特征

名称: aspect-ratio
适用: @media
值: <ratio>
类型: 范围

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

4.4. 方向:orientation 特征

名称: orientation
适用: @media
值: portrait | landscape
类型: 离散
portrait
height 媒体特征的值大于或等于 width 媒体特征的值时,orientation 媒体特征为 portrait
landscape
否则,orientationlandscape
以下媒体查询测试“portrait”方向,例如直立的手机。
@media (orientation:portrait) { … }

5. 显示质量媒体特征

5.1. 显示分辨率:resolution 特征

名称: resolution
适用: @media
值: <resolution> | infinite
类型: 范围

resolution 媒体特征描述了输出设备的分辨率,即像素的密度,考虑了页面缩放,但假定捏拉缩放为1.0。

resolution 媒体特征在负范围内为false

当查询具有非正方形像素的媒体时,resolution 查询垂直维度的密度。

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

对于没有物理分辨率限制的输出媒介(例如输出为矢量图形),此特征必须匹配 infinite 值。在 范围上下文 中评估此媒体特征时,infinite 必须被视为大于任何可能的 <resolution>。(也就是说,像 (resolution > 1000dpi) 这样的查询在 infinite 媒体中会为 true。)

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

这个媒体查询是等效的,但使用了 CSS cm 单位:

@media print and (min-resolution: 118dpcm) { … }
<resolution> 不指每物理长度单位的设备像素数,而是指每 CSS 单位的设备像素数。此映射由用户代理完成,因此用户代理总是知道此信息。

如果用户代理对物理像素的几何信息没有了解,或者了解物理像素的几何并且它们(足够接近)为正方形,那么用户代理不会在每个轴上映射不同数量的设备像素到 CSS 像素,因此在垂直和水平分辨率之间不会有差异。

否则,如果用户代理选择在每个轴上映射不同数量的设备像素,这是为了响应物理像素不是正方形的情况。用户代理如何获得此信息超出范围,但在获得足够信息以做出此决定时,它可以在设备旋转 90 度时反转映射。

5.2. 显示类型:scan 特征

名称: scan
适用: @media
值: interlace | progressive
类型: 离散

scan 媒体特征描述了一些输出设备的扫描过程。

interlace
CRT 和某些类型的等离子电视屏幕使用“交错”渲染,视频帧交替显示屏幕上的“偶数”行和“奇数”行,利用各种自动的视觉图像修正能力来产生平滑的运动。 这使它们能够在带宽成本减半的情况下模拟更高的帧率(FPS)广播。

在交错屏幕上显示时,作者应避免非常快的屏幕移动以避免“梳状”现象,并应确保屏幕上的细节宽度大于 1px 以避免“抖动”

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

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

例如,衬线字体中的字母“脚”是非常小的特征,在交错设备上可能会引发“抖动”。 可以使用 scan 媒体特征来检测这种情况,并使用不易“抖动”的替代字体:
@media (scan: interlace) { body { font-family: sans-serif; } }

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

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

名称: grid
适用: @media
值: <mq-boolean>
类型: 离散

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

<mq-boolean> 值类型是一个 <integer>,值为 01。 任何其他整数值均无效。请注意,-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
类型: 离散

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
类型: 离散

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

none
块轴上没有溢出处理;任何溢出的内容都不会显示。示例:广告牌。
scroll
块轴上溢出的内容通过允许用户滚动进行展示。示例:计算机屏幕。
paged
内容被分成离散的页面;块轴中溢出的内容将在下一页显示。示例:打印机、电子书阅读器。

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

注意: 该媒体特征的其他值可能在未来添加,以描述具有连续媒体和分页媒体混合行为的用户代理的类别。例如,Presto 排版引擎(现已停用)带有类似于 连续 的半分页呈现模式,除了它还尊重强制分页符。目前没有已知的用户代理具有这种行为,为避免误解描述这种用户代理,工作组决定不在本级别添加此类值。任何实现未被上述值充分描述的用户代理的人都被鼓励联系工作组,以便考虑对该媒体特征进行扩展。

5.6. 行轴溢出:overflow-inline 特征

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

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

none
行轴上没有溢出处理;任何溢出的内容都不会显示。
scroll
行轴中溢出的内容通过允许用户滚动进行展示。

注意:目前没有已知实现具有分页溢出行溢出内容的行为,而且该概念似乎没有多大意义,因此 overflow-inline 特征中故意没有添加 paged 值。

6. 颜色媒体特征

6.1. 颜色深度:color 特征

名称: color
适用: @media
值: <integer>
类型: 范围

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>
类型: 范围

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>
类型: 范围

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
类型: 离散

特性 color-gamut 描述了用户代理和输出设备支持的大致颜色范围。这意味着,如果用户代理接收到指定色域的内容,输出设备可以渲染适当的颜色,或接近的颜色。

注意:该查询使用近似范围是因为以下几个原因。首先,显示硬件之间存在很大差异。例如,设备可能声称支持 "Rec. 2020",但实际上只能呈现显著低于完整色域的范围。其次,不同设备支持许多不同的色域,列举它们会非常繁琐。在大多数情况下,作者不需要知道显示器的确切能力,只需知道它是否比 sRGB 更好,或显著优于 sRGB。这样他们可以为用户提供适当的图像,标记颜色配置文件。

srgb
用户代理和输出设备可以支持大致的 sRGB 色域或更多。

注意:预计大多数彩色显示器都可以响应此类型查询并返回 true。

p3
用户代理和输出设备可以支持大致由 DCI P3 色彩空间指定的色域或更多。

注意: p3 色域比 srgb 色域更大并包含它。

rec2020
用户代理和输出设备可以支持大致由 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];有关 DCI P3 的更多信息,请参见 [SMPTE-EG-432-1-2010][SMPTE-RP-431-2-2011];有关 ITU-R Recommendation BT.2020 的更多信息,请参见 [ITU-R-BT-2020-2]

例如,当显示器支持 DCI P3 色域时,以下媒体查询适用:
@media (color-gamut: p3) {}

注意:如果输出设备的完整输出色域足够大,或某个色域是另一个支持色域的子集,则该媒体特性可以返回多个值。因此,最好按“升序”使用此特性——当 (color-gamut: srgb) 为 true 时设置基础值,然后如果 (color-gamut: p3) 为 true 时覆盖它,依此类推。

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

7. 交互媒体特征

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

匹配pointerhover组合的典型设备示例:
pointer: none pointer: coarse pointer: fine
hover: none 仅键盘控制,顺序/空间(方向键)焦点导航 智能手机,触摸屏 基本的手写笔数字化仪(Cintiq,Wacom 等)
hover: hover 任天堂 Wii 控制器,Kinect 鼠标,触摸板,高级手写笔数字化仪(Surface,三星 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
类型: 离散

pointer 媒体特性用于查询指针设备(如鼠标)的存在和准确性。如果存在多个指针设备,pointer 媒体特性必须反映“主要”指针设备的特性,由用户代理决定。(要查询任何可用指针设备的能力,请参见 any-pointer 媒体特性。)

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

coarsefine 都表示存在指针设备,但在准确性上有所不同。若指针设备在缩放因子为 1 时难以或不可能可靠地选择几个相邻的小目标,则被视为 coarse。更改缩放级别不会影响此媒体特性的值。

注意: 由于用户代理可能允许用户进行缩放,或者由于次要指针设备可能具有不同的精度,即使此媒体特性的值为 coarse,用户仍然可能能够执行精确的点击。此媒体特性并不表示用户永远无法精确点击,只是表示对他们来说操作不便。预期作者在值为 coarse 时,通过设计不依赖于精确点击来操作的页面来响应此特性。

为了方便残障人士,即使设备的指针设备可以被描述为 fine,用户代理也可能向此媒体查询返回 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
类型: 离散

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

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

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

hover
表示主要指针设备可以轻松在页面上悬停。示例包括鼠标和物理上指向屏幕的设备(如任天堂 Wii 控制器)。

例如,在可以通过可选鼠标控制的触摸屏设备上,hover 媒体特性应匹配 hover: none,因为主要指针设备(触摸屏)不允许用户悬停。

但是,尽管如此,可选的鼠标确实允许用户悬停。因此,作者应注意不要假设在“hover: none”为真时':hover'伪类永远不匹配,但应设计不依赖悬停即可完全使用的布局。

出于可访问性原因,即使在支持悬停的设备上,用户代理也可能将此媒体查询的值设为 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
类型: 离散
名称: any-hover
适用于: @media
值: none | hover
类型: 离散

any-pointerany-hover 媒体特性与 pointerhover 媒体特性相同,但它们对应于所有用户可用指针设备的能力的联合。在 any-pointer 的情况下,如果不同指针设备具有不同的特性,则多个值可以匹配。

any-pointerany-hover 只有在所有指针设备的对应查询都匹配 none 或完全没有指针设备时才匹配 none

any-pointer 用于查询指针设备的存在及其精度。它不考虑其他非指针设备输入,不能用于检测不移动屏幕指针的其他输入机制(例如方向键或仅键盘控制)的存在。'any-pointer:none' 只有在根本没有任何指针设备存在时才会评估为 true。
在带有鼠标和键盘的传统桌面环境中,'any-pointer:none' 为 false(由于鼠标的存在),即使还有非指针输入(键盘)存在。
'any-hover:none' 只有在没有指针设备或所有存在的指针设备都不具备悬停功能时才会为 true。 因此,它应该被理解为用于测试是否存在具备悬停功能的指针设备,而不是用于测试是否有任何指针设备不具备悬停功能。 目前无法通过 any-hover 或其他任何交互媒体特性来确定后者的情况。 此外,它也不考虑任何非指针设备的输入,例如方向键或仅键盘控制,这些设备本质上也不具备悬停功能。
在带有鼠标和触摸屏的触摸屏笔记本电脑上,'any-hover:none' 将评估为 false(由于存在具备悬停功能的鼠标),即使存在一个不具备悬停功能的指针设备(触摸屏)。 目前无法为不同指针设备具备不同悬停功能的情况提供不同的样式。
仅仅因为 any-hoverany-pointer 表示至少一个可用输入机制具有这些功能,就依赖悬停或精确指向来设计页面,可能会导致不良体验。 但是,作者可以使用这些信息来做出关于基于任何可用指针设备的样式和功能的决定。
许多智能电视提供一种控制屏幕光标的方法,但通常是比较基础的控制器,操作起来不够精确。

在这种智能电视中,浏览器将 coarse 作为 pointerany-pointer 的值,这使得作者可以提供具有大而易于点击的目标布局。

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

基于 (any-pointer: fine) 现在为 true 就切换到小的点击目标是不合适的。 这样不仅会让用户感到意外,提供的体验也不符合他们对电视的期望,而且可能非常不方便:鼠标并不是控制电视的主要方式,可能在遥远的地方,藏在沙发的某个靠垫下……

相反,考虑在相同电视上进行滚动。 没有精确的指针设备,滚动条难以操作。 在 (pointer: coarse) 为 true 的情况下准备好另一种指示有更多内容可看的方法后,如果 (any-pointer: fine) 为 true,作者可能仍希望附加显示滚动条,或者如果 (any-pointer: fine) 为 false,则完全隐藏它们以减少视觉杂乱。

附录 A: 已废弃的媒体特征

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

要查询视口的大小(或页面媒体的页面框),应使用widthheightaspect-ratio 媒体特性,而不是 device-widthdevice-heightdevice-aspect-ratio,因为后者指的是设备的物理尺寸,而不考虑为文档布局可用的空间大小。 device-*媒体特征有时也被用作检测移动设备的代理。取而代之的是,作者应该使用更好地代表设备特征的媒体特性,来实现他们想要的样式。

device-width

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

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

device-width 在负范围内为 false

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

在上面的示例中,样式表只会应用于宽度小于 800px 的屏幕。 px 单位是逻辑单位,如 单位 部分所述。

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

设备高度

名称: device-height
适用于: @media
值: <长度>
类型: 范围

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

device-height 在负范围内为 false

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

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

设备宽高比

名称: device-aspect-ratio
适用于: @media
值: <比例>
类型: 范围

媒体特性 '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) { … }

变更

自 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, 和 張俊芝。

8. 隐私和安全注意事项

本规范未引入新的安全考虑。

媒体查询使 CSS 能够查询页面环境的各个方面, 包括通过脚本很难或不可能找到的内容。 这可能存在隐私风险, 可能增强对用户的指纹识别, 但风险通常较低。 至少,相同的信息应可通过检查用户代理字符串以推断出来。 然而,UA 字符串欺骗不会影响媒体查询, 因此这是一种更可靠的检测技术。

也就是说,媒体查询提供的信息相对粗略, 在这方面不会增加太多信息熵。

一些遗留的媒体特性(device-widthdevice-heightdevice-aspect-ratio) 会暴露关于 UA 运行环境的信息, 而这样做没有明确的好处。 出于兼容性原因,它们被保留, 但为了隐私和安全, UA 被允许报告不准确的信息。

TAG 开发了 自评问卷 以帮助编辑和工作组评估其规范引入的风险。 以下是提供的答案。

本规范是否处理可识别个人身份的信息?
否。
本规范是否处理高价值数据?
否。
本规范是否引入了在浏览会话之间保持的原始状态?
否。
本规范是否向网页暴露了持久的跨域状态?
否。
本规范是否向原始资源暴露了当前无法访问的任何其他数据?
否。
本规范是否启用了新的脚本执行/加载机制?
否。
本规范是否允许原始资源访问用户的位置?
否。
本规范是否允许原始资源访问用户设备上的传感器?
否。
本规范是否允许原始资源访问用户本地计算环境的某些方面?
是,如本问卷之前的内容所述。
本规范是否允许原始资源访问其他设备?
否。
本规范是否允许原始资源对用户代理的本机 UI 进行某种程度的控制?
否。
本规范是否向网页暴露了临时标识符?
否。
本规范是否区分第一方和第三方上下文中的行为?
否。
本规范在用户代理的“隐身模式”中应如何工作?
无需行为上的差异。
本规范是否将数据持久存储到用户的本地设备?
否。
本规范是否有“安全注意事项”和“隐私注意事项”部分?
是,这是您正在阅读的部分。
本规范是否允许降低默认的安全特性?
否。

符合性

文档约定

符合性要求通过描述性断言和 RFC 2119 术语的组合来表达。关键字“必须 (MUST)”、“不可 (MUST NOT)”、“要求 (REQUIRED)”、“应 (SHALL)”、“不应 (SHALL NOT)”、“应该 (SHOULD)”、“不应该 (SHOULD NOT)”、“推荐 (RECOMMENDED)”、“可以 (MAY)”和“可选 (OPTIONAL)”在本文件的规范性部分中应按照 RFC 2119 的描述进行解释。然而,为了可读性,这些词语在本规范中并未全部以大写字母出现。

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

本规范中的示例以“例如”引入,或通过class="example"与规范性文本区分开,如下所示:

这是一个信息性示例。

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

注:这是一个信息性注释。

告诫性内容是规范性部分,样式设计为引起特别注意,并通过<strong class="advisement">与其他规范性文本区分开,如下所示: 用户代理 (UAs) 必须提供一个可访问的替代方案。

符合性类别

本规范的符合性定义为以下三种符合性类别:

样式表
CSS 样式表
渲染器
一个解释样式表语义并渲染使用它们的文档的用户代理 (UA)
编辑工具
编写样式表的用户代理 (UA)

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

如果渲染器除了按照相应的规范定义解释样式表之外,还正确地解析并渲染本规范定义的所有特性,则该渲染器符合本规范。然而,用户代理由于设备限制而无法正确渲染文档并不导致其不符合规定。(例如,用户代理不需要在单色显示器上渲染颜色。)

如果编辑工具编写的样式表在语法上符合通用 CSS 语法以及本模块中定义的各个特性的语法,并满足本模块中描述的样式表的所有其他符合性要求,则该编辑工具符合本规范。

部分实现

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

实现不稳定和专有功能

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

非实验性实现

一旦规范达到候选推荐阶段,就可以进行非实验性实现,且实现者应发布任何 CR 级别功能的未添加前缀的实现,这些功能根据规范可被证明已正确实现。

为了建立和保持 CSS 在实现中的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的未添加前缀的实现之前,向 W3C 提交实现报告(以及必要时用于该实现报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组进行审核和修改。

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

CR 退出标准

为了将本规范推进到提议推荐阶段,必须至少有两个独立的、互操作的实现支持每个功能。每个功能可以由不同的产品集实现,不要求所有功能都由单一产品实现。根据此标准,我们定义了以下术语:

独立
每个实现必须由不同的方开发,并且不能共享、重用或源自其他合格实现的代码。对本规范的实现无关的代码部分可以豁免此要求。
互操作
通过官方 CSS 测试套件中的相应测试用例,或者如果实现不是 Web 浏览器,则通过等效测试。如果该用户代理 (UA) 要用于声称互操作性,那么测试套件中的每个相关测试都应创建一个等效测试。此外,如果该 UA 要用于声称互操作性,则必须有一个或多个其他 UA 也可以通过这些等效测试以实现互操作性。等效测试必须公开提供以供同行评审。
实现
一个用户代理 (UA),其符合以下条件:
  1. 实现了该规范。
  2. 对公众可用。实现可以是发布产品或其他公开可用的版本(例如,测试版、预览版或“每日构建”)。 非发布产品版本必须至少实现该功能一个月以上,以证明其稳定性。
  3. 不是实验性的(即,不是专门为通过测试套件而设计的版本,也不是未来供正常使用的版本)。

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

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性引用

[COLORIMETRY]
色度学,第四版. CIE 015:2018。2018 年。网址:http://www.cie.co.at/publications/colorimetry-4th-edition
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.。CSS 层叠与继承 第 5 级。2021 年 12 月 3 日。WD。网址:https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley。CSS 条件规则模块 第 3 级。2020 年 12 月 8 日。CR。网址:https://www.w3.org/TR/css-conditional-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin。CSS 语法模块 第 3 级。2019 年 7 月 16 日。CR。网址:https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad。CSS 值和单位模块 第 3 级。2019 年 6 月 6 日。CR。网址:https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad。CSS 值和单位模块 第 4 级。2021 年 12 月 16 日。WD。网址:https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii。CSS 书写模式 第 4 级。2019 年 7 月 30 日。CR。网址:https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos 等。层叠样式表 第 2 级 修订版(CSS 2.1)规范。2011 年 6 月 7 日。REC。网址:https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters。CSSOM 视图模块。2016 年 3 月 17 日。WD。网址:https://www.w3.org/TR/cssom-view-1/
[MEDIAQUERIES-3]
Florian Rivoal 等。媒体查询。2012 年 6 月 19 日。REC。网址:https://www.w3.org/TR/css3-mediaqueries/
[RFC2119]
S. Bradner。RFC 中用于指示需求级别的关键字。1997 年 3 月。最佳当前实践。网址:https://datatracker.ietf.org/doc/html/rfc2119

参考性引用

[CSS-FONTS-5]
Myles Maxfield; Chris Lilley。CSS 字体模块 第 5 级。2021 年 12 月 21 日。WD。网址:https://www.w3.org/TR/css-fonts-5/
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs。HTML 4.01 规范。2018 年 3 月 27 日。REC。网址:https://www.w3.org/TR/html401/
[INFRA]
Anne van Kesteren; Domenic Denicola。Infra 标准。实时标准。网址:https://infra.spec.whatwg.org/
[ITU-R-BT-2020-2]
超高清电视系统的参数值 - 制作和国际节目交换。2015 年 10 月。网址:https://www.itu.int/rec/R-REC-BT.2020/en
[RFC2879]
G. Klyne; L. McIntyre。互联网传真(V2)内容特征架构。2000 年 8 月。提议标准。网址:https://www.rfc-editor.org/rfc/rfc2879
[SMPTE-EG-432-1-2010]
SMPTE 工程指南 - 数字源处理 — D-电影颜色处理。2010 年。网址:http://ieeexplore.ieee.org/document/7289763/
[SMPTE-RP-431-2-2011]
SMPTE 推荐实践 - D-电影质量 — 参考投影机和环境。2011 年。网址:http://ieeexplore.ieee.org/document/7290729/
[SRGB]
多媒体系统和设备 - 颜色测量和管理 - 第 2-1 部分:颜色管理 - 默认 RGB 颜色空间 - sRGB。网址:https://webstore.iec.ch/publication/6169
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson。与 XML 文档关联样式表 1.0(第二版)。2010 年 10 月 28 日。REC。网址:https://www.w3.org/TR/xml-stylesheet/

属性索引

未定义属性。

@media 描述符

名称 初始值 类型
any-hover none | hover 离散
any-pointer none | coarse | fine 离散
aspect-ratio <ratio> 范围
color <integer> 范围
color-gamut srgb | p3 | rec2020 离散
color-index <integer> 范围
device-aspect-ratio <ratio> 范围
device-height <length> 范围
device-width <length> 范围
grid <mq-boolean> 离散
height <length> 范围
hover none | hover 离散
monochrome <integer> 范围
orientation portrait | landscape 离散
overflow-block none | scroll | paged 离散
overflow-inline none | scroll 离散
pointer none | coarse | fine 离散
resolution <resolution> | infinite 范围
scan interlace | progressive 离散
update none | slow | fast 离散
width <length> 范围