CSS 环境变量模块 1 级

W3C 首次公开工作草案

关于本文档的更多详情
此版本:
https://www.w3.org/TR/2025/WD-css-env-1-20250923/
最新发布版本:
https://www.w3.org/TR/css-env-1/
编辑草案:
https://drafts.csswg.org/css-env-1/
历史记录:
https://www.w3.org/standards/history/css-env-1/
反馈:
CSSWG 问题仓库
规范内反馈
编辑:
Tab Atkins-Bittner (Google)
前编辑:
Dean Jackson (Apple)
为本规范建议编辑:
GitHub 编辑器

摘要

本规范定义了环境变量的概念以及env()函数,其工作方式类似于自定义属性与var()函数,但这些变量是在文档全局范围内定义的。这些变量可以由用户代理定义,提供基于 UA 拥有特殊访问权限的信息而可在页面上使用的值,也可以由作者提供,用于那些无论在文档何处使用都保证一致的“全局”变量。

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

本文档状态

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

本文档由CSS 工作组作为首次公开工作草案,采用推荐标准流程发布。首次公开工作草案的发布并不代表 W3C 及其成员的认可。

这是一个草案文档,随时可能被更新、替换或由其它文档取代。将此文档作为除在研工作以外的引用是不合适的。

请通过在 GitHub 提交 issue(推荐),并在标题中包含规范代码 “css-env”,格式如下:“[css-env] …评论摘要…” 来提交反馈。所有 issue 和评论都会被归档。也可将反馈发送到(归档)公共邮件列表 www-style@w3.org

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

本文档由遵循W3C 专利政策的工作组编制。W3C 维护一份与本组交付物相关的专利披露公开列表;该页面还包含专利披露说明。任何个人如实际知晓其认为包含必要权利要求的专利,必须依照W3C 专利政策第6节披露相关信息。

1. 介绍

[css-variables-1] 规范定义了“级联变量”的概念, 即由自定义属性的值创建的作者自定义变量, 能够通过 var() 函数被替换到任意其他属性中。

本规范定义了一个相关但更简单的环境变量概念。 与“级联变量”不同, 级联变量会随着其对应自定义属性的不同取值在页面中变化, 而环境变量在特定文档中是“全局”的——其值在任何地方都相同。 env() 函数可以用于将该值替换到任意位置, 类似于 var() 函数。

这些“全局”变量相较于级联变量有优点也有缺点:

大多数环境变量在同一时间只会有一个值。 但也有一些是“索引型”的,即同时表示多个值, 例如 viewport-segment-* 变量中表示多个独立内容面板的尺寸和位置。 要引用这些索引型变量,需在变量名后提供一个或多个整数, 如 viewport-segment-width 1 0, 用于从可能的值列表或网格中选取单个值, 类似于传统编程语言中用 values[0] 语法从列表中选取元素。

2. 环境变量

一个 CSS 环境变量 是与 <declaration-value>(一段零个或多个 CSS 记号的序列,对包含的记号几乎无限制)关联的名字, 类似于自定义属性环境变量可以由用户代理定义, 也可以由用户定义。 (后者情况下,名字为<custom-property-name>, 并按自定义标识符规则以 `--` 开头。)

用户代理定义的 环境变量 是否对脚本可见? 如果是,需在 Document 上定义一个 API 以暴露它们。

定义作者如何添加 环境变量, 尽量同时支持 JS 和 CSS。 注意,混用 CSS 规则和 JS 定义的内容容易导致混乱, 类似 CSSFontFaceRule 与 FontFace 的情况……

以下用户代理定义的环境变量为官方定义,必须支持。 其他用户代理定义的 环境变量不得被支持, 除非/直到它们被加入此列表。

2.1. 安全区域内边距变量

名称 维度数
safe-area-inset-top <length> 0(标量)
safe-area-inset-right <length> 0(标量)
safe-area-inset-bottom <length> 0(标量)
safe-area-inset-left <length> 0(标量)

安全区域内边距是四个环境变量,用于通过其距视口边缘的上、右、下、左内边距描述一个矩形。对于矩形显示,这些值都必须为零;但对于非矩形显示,它们必须组成一个由用户代理选择的矩形,保证该矩形内所有内容可见,并且减少任一内边距都会导致矩形内部分内容因显示器形状而不可见。这样作者可以将重要内容的布局限定在安全区域矩形内。

2.2. 安全区域最大内边距变量

名称 维度数
safe-area-max-inset-top <length> 0(标量)
safe-area-max-inset-right <length> 0(标量)
safe-area-max-inset-bottom <length> 0(标量)
safe-area-max-inset-left <length> 0(标量)

安全区域最大内边距是四个环境变量,与安全区域内边距变量相关联。 不同于动态变化的安全区域内边距变量, 安全区域最大内边距是静态值, 表示当动态用户代理界面收起时,其动态对应用的最大值, 使布局视口尺寸达到最大视口尺寸

2.3. 视口分段变量

名称 维度数
viewport-segment-width <length> 2
viewport-segment-height <length> 2
viewport-segment-top <length> 2
viewport-segment-left <length> 2
viewport-segment-bottom <length> 2
viewport-segment-right <length> 2

视口分段是环境变量,用于定义视口逻辑上独立区域的位置和尺寸。当视口被一个或多个硬件特性(如折叠或多屏之间的铰链)分割时,会创建视口分段;这些分段是作者可视为逻辑独立区域的视口部分。

视口分段环境变量有两个维度,分别代表被硬件特性分割后二维网格中的 x 和 y 位置。 位于左侧边缘的分段 x 位置为 0,右侧下一个分段 x 位置为 1,以此类推。 同样,顶部边缘的分段 y 位置为 0,依次递增。

注意: 在某些硬件配置中,分隔物本身可能会占据视口的逻辑空间。可以通过计算视口分段的位置之间的区域来得到分隔物的尺寸。

当视口被分割为两个并排分段时,左侧分段的索引为 (0, 0),其宽度表示为 env(viewport-segment-width 0 0, 300px)。 右侧分段索引为 (1, 0)。 类似地,对于被分为上下两个分段的视口,上方分段索引为 (0, 0),下方分段为 (0, 1)。

这些变量仅在存在至少两个此类分段时才定义。 如果没有硬件特性分割视口,则应使用视口单位,否则在多分段设备上内容可能无法按预期显示。

2.4. 首选文本缩放

名称 维度数
preferred-text-scale <number> 0(标量)

preferred-text-scale 环境变量 表示用户的首选文本缩放因子, 即他们对操作系统和/或用户代理“默认”字体大小的调整。 (在 text-size-adjust 有效的设备上, 这是 text-size-adjust: auto 应用的缩放因子。)

例如,如果 text-size-adjust:auto 会使文本尺寸变为原来的两倍, 那么 env(preferred-text-scale) 的值就是 2

注意: pem 单位代表了相同的信息;1em 完全等价于 calc(1em * env(preferred-text-scale))。 直接定义尺寸时,bsem 只是一个更方便的长度单位。

这个环境变量 需要谨慎使用。 默认情况下,文本缩放会自动应用; 使用 env(preferred-text-scale)pem 会导致缩放被重复应用, 使文本或界面元素过大。

通常,作者应:

3. 使用环境变量:env() 语法

要在 CSS 环境中替换环境变量的值, 使用 env() 函数:

env() = env( <custom-ident> <integer [0,∞]>*, <declaration-value>? )

env() 函数可以用在任何元素的任何属性值的任意部分, 或用在任何 at-rule 的描述符值的任意部分, 以及其它允许 CSS 值出现的地方。

需要定义 env() 可以出现的完整位置集合。

env() 的第一个参数用于提供要替换的环境变量名称。 后续的整数参数(如果有)表示该变量的维度索引,如果提供的名称对应一个类似数组的环境变量。 逗号后的参数(如果有)为回退值, 当引用的 环境变量 不存在时,回退值将被用于替换。

注意: 回退值的语法(与自定义属性类似)允许包含逗号。 例如,env(foo, red, blue) 的回退值为 red, blue; 也就是说,第一个逗号之后到函数结尾的内容都视为回退值。

如果一个属性包含一个或多个 env() 函数,并且这些函数语法有效, 那么整个属性的语法必须在解析时假定为有效。 只有在计算值阶段 env()替换后,才进行语法检查。

如果一个描述符包含一个或多个 env() 函数,并且这些函数语法有效, 那么整个声明在解析时也必须假定为有效。 只有在 env()替换后才进行语法检查。

要在属性或描述符中替换 env()
  1. 如果 env() 函数第一个参数提供的名称 是已识别的环境变量名称,且提供的整数个数 与该变量的维度数相符,并且索引值对应已知的子值, 则用该名称的 环境变量值替换 env() 函数。

  2. 否则,如果 env() 函数的第二个参数为回退值, 则用回退值替换 env() 函数。 如果回退值中还有 env() 引用,也进行替换。

  3. 否则,包含该 env() 函数的属性或描述符在计算值时无效

需要定义替换发生的时机。 它必须发生在 var() 替换之前。 或者,是否应让 env() 在解析时替换, 这样未知变量名会导致语法检查失败? 并没有充分理由让它像 var() 那样在计算值时替换——那样做主要是为了让自定义属性可以先继承值, 然后再被 var() 取用。

等确定 env() 还能用于哪些地方,再定义其替换时机和方式。

3.1. 环境变量在简写属性中的用法

如果 env() 替换发生在解析阶段, 那么这一节就不需要了。

env() 函数与 简写属性配合时会遇到与 var() 函数相同的问题。 当在 env() 用于 简写属性时, 其行为与 CSS Variables 1 § 3.2 简写属性中的变量一致。

4. 隐私注意事项

本规范定义的 环境变量 可能涉及隐私, 因为它们可能代表页面本无法获得的额外信息。 特别是,暴露这些变量可能成为指纹识别途径, 因为它们泄露了用户使用的设备的更多信息。

目前为止,本规范定义的 环境变量 已经过 CSSWG 审查,认为可公开暴露。

5. 安全注意事项

本规范为设备的一些新类型信息提供只读访问。

本规范定义的 环境变量 不会暴露任何安全敏感信息。

一致性

文档约定

一致性要求通过描述性声明和 RFC 2119 术语结合表达。规范性部分中的“必须”、“不得”、“要求”、“应”、“不应”、“推荐”、“可以”、“可选”等关键字,须按照 RFC 2119 的定义解释。 不过,为了可读性,本规范未将这些词全部大写。

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

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

这是一个信息性示例。

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

注意,这是一个信息性注释。

警示内容为规范性部分,采用特殊样式显示,并用 <strong class="advisement"> 区分,如下所示: 用户代理必须提供可访问性替代方案。

一致性类别

本规范定义了三类一致性对象:

样式表
一个CSS 样式表
渲染器
一个用户代理(UA),解释样式表语义并渲染 使用样式表的文档。
创作工具
一个用户代理(UA),用于生成样式表。

如果样式表中使用的所有语法均符合本模块的通用 CSS 语法和每项特性的单独语法,则该样式表符合本规范。

渲染器符合本规范,除按相关规范解释样式表外,还需正确解析本规范定义的所有特性,并相应渲染文档。但如果由于设备限制 UA 无法正确渲染文档,并不导致 UA 不符合规范。(例如,UA 不要求在单色显示器上渲染颜色。)

创作工具符合本规范,指其生成的样式表语法正确,符合本模块的通用 CSS 语法和各特性语法,并满足本模块描述的样式表一致性要求。

部分实现

为便于作者利用前向兼容的解析规则分配回退值,CSS 渲染器必须将任何不支持的 at-rule、属性、属性值、关键字及其他语法结构视为无效(并按需忽略)。特别地,用户代理不得在一个多值声明中选择性忽略不支持的组成值而保留支持的值:如果声明中有任何值被视为无效(因为不支持),则整个声明都必须被 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-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. 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. 2024年8月15日. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-SIZE-ADJUST-1]
CSS Mobile Text Size Adjustment Module Level 1. 编辑草案. URL: https://drafts.csswg.org/css-size-adjust-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022年6月16日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 2025年9月16日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

问题索引

用户代理定义的 环境变量 是否对脚本可见? 如果是,需在 Document 上定义一个 API 以暴露它们。
定义作者如何添加 环境变量, 尽量同时支持 JS 和 CSS。 注意,混用 CSS 规则和 JS 定义的内容容易导致混乱, 类似 CSSFontFaceRule 与 FontFace 的情况……
需要定义 env() 可以出现的完整位置集合。
需要定义替换发生的时机。 它必须发生在 var() 替换之前。 或者,是否应让 env() 在解析时替换, 这样未知变量名会导致语法检查失败? 并没有充分理由让它像 var() 那样在计算值时替换——那样做主要是为了让自定义属性可以先继承值, 然后再被 var() 取用。
等确定 env() 还能用于哪些地方,再定义其替换时机和方式。
如果 env() 替换发生在解析阶段, 那么这一节就不需要了。