CSS 视口模块 1 级

W3C 首次公开工作草案

关于本文档的更多信息
本版本:
https://www.w3.org/TR/2024/WD-css-viewport-1-20240125/
最新发布版本:
https://www.w3.org/TR/css-viewport-1/
编辑草案:
https://drafts.csswg.org/css-viewport/
以往版本:
历史记录:
https://www.w3.org/standards/history/css-viewport-1/
反馈:
CSSWG 问题仓库
CSSWG GitHub
规范内反馈
编辑:
Florian Rivoal受邀专家
Mozilla
前编辑:
Matt RakowMicrosoft
Opera Software
Adobe Systems
Opera Software
建议为本规范提出编辑意见:
GitHub 编辑器

摘要

本规范为作者提供了一种方式,可以在 CSS 中指定作为初始包含块基础的视口的尺寸、缩放因子和方向。

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

本文档状态

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

本文档由 CSS 工作组 按照 推荐流程首次公开工作草案 形式发布。 作为首次公开工作草案发布,并不意味着获得了 W3C 及其成员的认可。

这是一个草案文件,可能随时被更新、替换或废弃为其他文件。不应将此文件作为定稿内容引用,仅适合作为进行中的工作参考。

请通过 在 GitHub 提交 issue(推荐方式)来反馈意见,反馈时请在标题中包含规范代码“css-viewport”,示例:“[css-viewport] ……评论摘要……”。所有 issue 和评论都会被 归档。 或者,也可以发送反馈到(归档地址)公共邮件列表 www-style@w3.org

本文件受 2023年11月3日 W3C 流程文档 管辖。

本文件由依据 W3C 专利政策 运作的小组制定。 W3C 维护一份 与小组成果相关的专利披露公开列表; 该页面还包括专利披露的相关说明。 如果个人已知某项专利并认为该专利包含 必要权利要求,则必须按照 W3C 专利政策第6节 披露该信息。

1. 引言

本节为非规范性内容。

CSS 2.1 [CSS21] 规定了 初始包含块,用于连续媒体,其尺寸由视口决定。由于视口通常不会比显示器大, 拥有较小屏幕的设备(如手机或平板)提供的视口通常比桌面或笔记本电脑等大型设备要小。

不幸的是,许多文档在历史上都是针对较大的视口设计的,在小视口中表现会出现各种问题,包括布局意外换行、内容被裁剪、可滚动区域异常及脚本错误。为避免这些问题,移动浏览器通常会使用一个固定的初始包含块宽度来模拟桌面浏览器窗口大小(通常为980-1024px)。随后会将所得布局缩放,使其适应可用屏幕空间。

尽管这种做法缓解了上述问题,但缩放意味着CSS像素大小会比CSS 2.1 推荐的要小。用户很可能需要对内容进行缩放才能舒适阅读。

对于那些针对小视口设计的网站,上述做法是没有必要的。

本规范从实现角度进行编写,导致其可读性可能较差。为使其对不同受众更易理解,可能需要进行大量编辑工作。同时,需要明确不同js API所指的视口。详见 ppk 的这篇博文 以获得更多讨论。

本规范及相关规范涉及的各类问题可见于 此报告

2. 视口

在CSS 2.1中,视口是用户代理用于连续媒体的一项功能,并用于为连续媒体建立初始包含块。 对于分页面媒体,初始包含块基于页面区域。页面区域可通过@page规则进行设置。

本规范引入了一种覆盖用户代理(UA)提供的视口尺寸的方法。因此,需要引入 initial viewport(初始视口)与 actual viewport(实际视口)的区别。

initial viewport
指被窗口或UA的可视区域提供,且未被UA或作者样式覆盖前的视口。注意,initial viewport 的尺寸会随着窗口或可视区域尺寸变化而改变。
actual viewport
这是处理视口 <meta> 标签后得到的视口。

actual viewport 作为布局视口,并定义可视视口(visual viewport)。

actual viewport 无法完全适配窗口或可视区域时(例如 actual viewport 大于 initial viewport,或缩放因子导致只有部分实际视口可见),UA 应提供滚动或平移机制。

建议初始时,若文档基础方向为 ltr,则 actual viewport 和窗口或可视区域的左上角对齐;若为 rtl,则右上角对齐。文档基础方向由 HTML 或 XHTML 文档的首个 <BODY> 元素的 direction 属性的计算值决定。其他文档类型则取其根元素的计算 direction

3. 视口 <meta> 元素

需要详细规范

3.1. 属性

视口 <meta> 元素中可识别的属性有:

3.2. 解析算法

下面是针对 content 属性的解析算法,源自对 iPhone 上 Safari 的测试。 测试在运行 iPhone OS 4 的 iPod touch 上进行,浏览器UA字符串为:"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7" 伪代码记号采用了 [Algorithms] 中的风格。

空白符类别包含以下字符(ASCII):

Safari 实现中,属性/值对之间可用逗号分隔。一些实现也支持逗号和分号,因此现有内容常用分号。为保证内容兼容,作者应使用逗号,但实现者可兼容两者以支持现有内容互操作。

分隔符类别包含以下字符(ASCII),逗号为首选,分号为可选:

Parse-Content(S)
i ← 1
while ilength[S]
  do while ilength[S] and S[i] in [whitespace, separator, '=']
    do ii + 1
  if ilength[S]
    then iParse-Property(S, i)

Parse-Property(S, i)
starti
while ilength[S] and S[i] not in [whitespace, separator, '=']
  do ii + 1
if i > length[S] or S[i] in [separator]
  then return i
property-nameS[start .. (i - 1)]
while ilength[S] and S[i] not in [separator, '=']
  do ii + 1
if i > length[S] or S[i] in [separator]
  then return i
while ilength[S] and S[i] in [whitespace, '=']
  do ii + 1
if i > length[S] or S[i] in [separator]
  then return i
starti
while ilength[S] and S[i] not in [whitespace, separator, '=']
  do ii + 1
property-valueS[start .. (i - 1)]
Set-Property(property-name, property-value)
return i

Set-Property 匹配列出的属性名(不区分大小写)。 property-value 字符串的解释方式如下:

  1. 如果 property-value 的前缀可以用 strtod 转换为数字, 则该值即为该数字,其余部分被忽略。
  2. 若无法如上转换为数字,则整个 property-value 字符串会与下列字符串(不区分大小写)匹配:yesnodevice-widthdevice-height
  3. 如字符串未匹配任何已知值,则视为未知值。

3.3. extend-to-zoom

需通过 viewport meta 标签规范 extend-to-zoom 行为

3.4. interactive-widget

visual viewport 的定义从 CSSOM-View 移至本规范。

interactive-widget 属性用于指定交互式UI组件对页面视口的影响。它定义了组件是覆盖视口,还是收缩视口以保持其在组件显示时依然全部可见。交互式UI组件是指用户可以输入内容的临时用户代理或操作系统UI。

最常见的此类UI组件是虚拟键盘。

下面列出了 interactive-widget 的有效值及其对应的视口调整行为:

overlays-content
交互式UI组件不得 调整 初始视口可视视口的尺寸。用户代理应与VirtualKeyboard.overlaysContent 设为 true 时的表现一致。
resizes-content
交互式UI组件必须 调整 初始视口 尺寸。
由于可视视口的尺寸来自初始视口,因此 resizes-content 会导致初始视口和可视视口一同调整。
resizes-visual
交互式UI组件应 调整 可视视口 的尺寸,但不得 调整 初始视口

如果 interactive-widget 未设置或值无效,则默认行为为 resizes-visual

通过交互式组件调整视口尺寸时,需从视口矩形中减去与组件操作系统报告的包围矩形的相交部分。如果结果不是矩形,行为由用户代理自行定义。

部分情况下结果会为非矩形:如浮动或分离键盘,或 只占用部分视口的键盘。

3.4.1. 与 virtualKeyboard.overlaysContent 的交互

[VIRTUAL-KEYBOARD] 提供了命令式API,可通过 overlays-content 行为控制 VirtualKeyboard.overlaysContent 属性。该属性会覆盖通过 interactive-widget 设置的值,具体如下:

VirtualKeyboard.overlaysContent 被设为 true 时,UA 判定交互式组件调整行为时必须忽略 interactive-widget 的任何值。

VirtualKeyboard.overlaysContent 被设为 false 时,UA 判定行为时应使用 interactive-widget(如未设置则使用默认值)。

读取 VirtualKeyboard.overlaysContent 时必须返回先前设置的值。

即,除非预先设置,否则 VirtualKeyboard.overlaysContent 返回 false,即便通过 <meta> 标签设置了 interactive-widget=overlays-content

附录A. 变更记录

本附录为非规范性内容。

2016年3月29日工作草案 之后

2011年9月15日首次公开工作草案 之后

一致性

文档约定

一致性要求以描述性断言和 RFC 2119 术语共同表达。规范性内容中的关键词 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”、“OPTIONAL” 的解释方式参见 RFC 2119。为了可读性,这些词在规范中并非全部大写。

除非明确标注为非规范性内容、示例及注释,否则本规范全部文本皆为规范性内容。[RFC2119]

本规范中的示例以“for example”开头,或使用 class="example" 与规范性文本区分,如下:

这是一个示例性的说明。

注释以 “Note” 开头,并通过 class="note" 区分于规范性文本,如下:

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

告诫为规范性章节,采用特别的样式以引起注意,并通过 <strong class="advisement"> 区分,如: 浏览器必须提供可访问性替代方案。

一致性类别

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

样式表
CSS 样式表
渲染器
解释样式表语义并渲染文档的用户代理
创作工具
能生成 CSS 样式表的用户代理

只要样式表中使用本模块定义语法的所有语句均符合通用CSS语法及本模块定义的各功能的语法,则该样式表即被认为符合本规范。

渲染器除了按相应规范解释样式表外,若能正确解析本规范定义的所有功能并据此渲染文档,则为符合本规范。但由于设备限制造成的无法正确渲染,并不影响 UA 的符合性(如:UA 未必需要在黑白显示器上渲染颜色)。

只要创作工具生成的样式表按通用CSS语法及本模块每项功能的语法正确,并满足本模块描述的所有其他样式表符合性要求,即为符合本规范。

部分实现

为使作者可用前向兼容解析规约实现降级,CSS 渲染器必须将所有无法支持的 at规则、属性、属性值、关键字及其他语法结构等视为无效(并适当忽略)。特别是,用户代理不得在多值声明中选择性忽略部分不支持的分量:只要有一项值被视为无效(即不支持),整个声明即被CSS要求彻底忽略。

不稳定及专有功能的实现

为避免与未来CSS稳定功能冲突,CSSWG 建议实现 最佳实践,以实现 不稳定专有扩展

非实验性实现

当规范进入候选推荐阶段(CR)后,实现者可推出未加前缀的、证明能正确实现 CR 级别特性的非实验性实现。

为确保 CSS 在各实现间的互操作性,CSS 工作组请求非实验性 CSS 渲染器在发布任何新特性的未加前缀实现前提交实现报告(及所用测试用例,如有必要)到 W3C。W3C 收到的用例会经 CSS 工作组审查和修订。

相关测试用例和实现报告的提交信息参见 CSS 工作组官网:https://www.w3.org/Style/CSS/Test/。 如有问题,请联系 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

引用中定义的术语

参考文献

规范性引用

[CSS-PAGE-3]
Elika Etemad. CSS Paged Media Module Level 3。 2023年9月14日。WD。URL: https://www.w3.org/TR/css-page-3/
[CSS-VIEWPORT]
CSS Viewport Module Level 1。编辑草案。URL: https://drafts.csswg.org/css-viewport/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3。2019年12月10日。REC。URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS21]
Bert Bos 等。Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification。2011年6月7日。REC。URL: https://www.w3.org/TR/CSS21/
[CSS3-CONDITIONAL]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3。2022年1月13日。CR。URL: https://www.w3.org/TR/css-conditional-3/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module。2016年3月17日。WD。URL: https://www.w3.org/TR/cssom-view-1/
[MEDIAQUERIES-5]
Dean Jackson 等。Media Queries Level 5。2021年12月18日。WD。URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels。1997年3月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[VIRTUAL-KEYBOARD]
Anupam Snigdha. VirtualKeyboard API。2022年5月5日。WD。URL: https://www.w3.org/TR/virtual-keyboard/

补充性引用

[Algorithms]
Thomas H. Cormen 等。Introduction to Algorithms, Second Edition, MIT Press

问题索引

本规范从实现角度进行编写,导致其可读性可能较差。为使其对不同受众更易理解,可能需要进行大量编辑工作。同时,需要明确不同js API所指的视口。详见 ppk 的这篇博文 以获得更多讨论。
本规范及相关规范涉及的各类问题可见于 此报告
actual viewport 作为布局视口,并定义可视视口。
需要详细规范
需通过 viewport meta 标签规范 extend-to-zoom 行为
visual viewport 的定义从 CSSOM-View 移至本规范。