CSS 对象模型 (CSSOM)

W3C 工作草案,

此版本
https://w3org.cn/TR/2021/WD-cssom-1-20210826/
最新发布版本
https://w3org.cn/TR/cssom-1/
编辑草案
https://drafts.csswg.org/cssom/
历史版本
测试套件
http://test.csswg.org/suites/cssom-1_dev/nightly-unstable
问题追踪
CSS 工作组问题仓库
文档内联
编辑
(Disruptive Innovations)
(Mozilla)
前任编辑
(Opera Software AS)
Glenn Adams (Cox Communications, Inc.)
Anne van Kesteren (Opera Software ASA)
建议编辑此规范
GitHub 编辑器
遗留问题列表
Bugzilla

摘要

CSSOM 定义了用于媒体查询、选择器以及 CSS 本身的 API(包括通用的解析和序列化规则)。

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

关于本文档

本节描述了本文件发布时的状态。其他文件可能会取代本文件。W3C 当前出版物列表和本技术报告的最新修订版本可在 https://w3org.cn/TR/ 的 W3C 技术报告索引中找到。

本文档由 CSS 工作组发布为工作草案。作为工作草案发布并不代表 W3C 会员的认可。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。

请通过在 GitHub 上提交 issue(首选)发送反馈,并在标题中包含规范代码“cssom”,例如:“[cssom] …评论摘要…”。所有议题和评论均已归档。或者,也可以将反馈发送至(已归档的)公共邮件列表 www-style@w3.org

本文档受 2020年9月15日版 W3C 流程文档 约束。

本文档由在 W3C 专利政策下运作的团体编写。W3C 维护着一份与该团体交付成果相关的专利披露公开列表;该页面还包含了披露专利的指南。任何对个人认为包含必要权利要求 (Essential Claim(s)) 的专利具有实际知情权的个人,必须根据 W3C 专利政策第 6 节披露相关信息。

1. 引言

本文档正式规范了 CSS 对象模型 (CSSOM) 的核心功能。CSSOM 规范家族中的其他文档以及其他与 CSS 相关的规范定义了这些核心功能的扩展。

CSSOM 的核心功能旨在为作者定义的脚本提供基本能力,以允许访问和操作样式相关的状态信息和过程。

下面定义的功能从根本上基于 W3C DOM 工作组之前的规范,主要是 [DOM]。本文档的目的是 (1) 通过提供更详细的技术说明(以提高可测试性和互操作性)来改进之前的工作,(2) 弃用或删除某些在该上下文中不再被认为是必要的、实现度较低的功能,以及 (3) 新定义某些已经或预期会被广泛实现的功能。

2. 术语

本规范采用了以下文档中的术语:DOMHTMLCSS SyntaxEncodingURLFetchAssociating Style Sheets with XML documentsXML[DOM] [HTML] [CSS3SYN] [ENCODING] [URL] [FETCH] [XML-STYLESHEET] [XML]

当本规范提到对象 AA 实际上是一个接口时,通常指实现该接口 A 的对象。

术语设置 (set)取消设置 (unset) 分别指代二进制标志或变量的真值和假值。这些术语也用作动词,在这种情况下,它们分别指将某个值突变为真或假。

术语支持的样式语言 指的是 CSS。

注:如果用户代理支持了其他样式语言,本规范预期会进行必要的更新。

术语支持的 CSS 属性 指用户代理实现的 CSS 属性,包括任何厂商前缀属性,但不包括自定义属性支持的 CSS 属性在本规范中进行比较时必须采用小写形式。

在本规范中,::before::after 伪元素被假定存在于所有元素中,即使它们没有生成框。

当说某个方法或属性调用另一个方法或属性时,用户代理必须调用该属性或方法的内部 API,以便例如作者无法通过在 ECMAScript 中使用自定义属性或函数覆盖属性或方法来改变其行为。

除非另有说明,字符串比较均以区分大小写的方式进行。

2.1. 通用序列化惯用法

若要转义一个字符,意味着创建一个由 "\" (U+005C) 后跟该字符组成的字符串。

若要将字符作为码点转义,意味着创建一个由 "\" (U+005C) 开头的字符串,后跟该 Unicode 码点(用 0-9 a-f 范围内的最少十六进制数字表示,即 U+0030 到 U+0039 和 U+0061 到 U+0066),最后后跟一个空格 (U+0020)。

若要序列化一个标识符,意味着创建一个字符串,该字符串通过连接标识符的每个字符生成:

若要序列化一个字符串,意味着创建一个由 '"' (U+0022) 开头,后跟应用下述规则于给定字符串的每个字符后的结果,最后以 '"' (U+0022) 结尾的字符串:

注:"'" (U+0027) 不会被转义,因为字符串总是用 '"' (U+0022) 序列化。

若要序列化一个 URL,意味着创建一个由 "url(" 开头,后跟 URL 作为字符串的序列化,最后以 ")" 结尾的字符串。

若要序列化一个 LOCAL,意味着创建一个由 "local(" 开头,后跟 LOCAL 作为字符串的序列化,最后以 ")" 结尾的字符串。

若要序列化逗号分隔列表,应按列表顺序连接所有项目,并用 ", "(即逗号 (U+002C) 后跟一个空格 (U+0020))进行分隔。

若要序列化空白分隔列表,应按列表顺序连接所有项目,并用 " "(即一个空格 (U+0020))进行分隔。

注:根据上述规则序列化列表时,不会在第一项之前或最后一项之后插入多余的空格。除非另有说明,空列表将序列化为空字符串。

3. CSSOMString

CSSOM 接口中的大多数字符串使用 CSSOMString 类型。每个实现均可选择将其定义为 USVStringDOMString

typedef USVString CSSOMString;

或者,

typedef DOMString CSSOMString;
这种差异仅在涉及代理 (surrogate) 代码单元时才会被 Web 内容观察到。DOMString 将保留它们,而 USVString 会将它们替换为 U+FFFD 替换字符。

这一选择实际上允许实现执行此替换,但并不强制要求。

使用 USVString 使得实现能够在内存中内部使用 UTF-8 来表示字符串。由于格式良好的 UTF-8 明确禁止代理码点,因此实际上要求执行此替换。

另一方面,将字符串内部表示为 16 位代码单元的实现可能更倾向于避免进行这种替换的成本。

4. 媒体查询

媒体查询[MEDIAQUERIES] 定义。本节定义了围绕媒体查询的各种概念,包括其 API 和序列化形式。

4.1. 解析媒体查询

若要解析一个媒体查询列表(将给定字符串 s 解析为媒体查询列表),其定义在媒体查询规范中。返回由该算法定义的媒体查询列表。

注:最终被“忽略”的媒体查询将变为“not all”。

若要解析一个媒体查询(对于给定字符串 s),意味着遵循解析媒体查询列表的步骤,如果返回多个媒体查询,则返回 null,如果返回单个媒体查询,则返回该媒体查询。

注:同样,最终被“忽略”的媒体查询将变为“not all”。

4.2. 序列化媒体查询

若要序列化一个媒体查询列表,请执行以下步骤:

  1. 如果媒体查询列表为空,则返回空字符串。
  2. 序列化媒体查询列表中的每个媒体查询(按其在列表中出现的顺序),然后序列化该列表。

若要序列化一个媒体查询,设 s 为空字符串,并运行以下步骤:

  1. 如果该媒体查询被否定,则在 s 中追加 "not" 后跟一个空格 (U+0020)。
  2. type 为该媒体查询媒体类型标识符序列化,并转换为 ASCII 小写
  3. 如果该媒体查询不包含媒体特性,则将 type 追加到 s 并返回 s
  4. 如果 type 不为 "all" 或该媒体查询被否定,则在 s 中追加 type,后跟一个空格 (U+0020),后跟 "and",再后跟一个空格 (U+0020)。
  5. 然后,对于每个媒体特性
    1. s 中追加 "(" (U+0028),后跟转换为 ASCII 小写媒体特性名称。
    2. 如果提供了值,则在 s 中追加 ":" (U+003A),后跟一个空格 (U+0020),后跟序列化后的媒体特性值
    3. s 中追加 ")" (U+0029)。
    4. 如果这不是最后一个媒体特性,则在 s 中追加一个空格 (U+0020),后跟 "and",再后跟一个空格 (U+0020)。
  6. 返回 s
以下是一些输入(第一列)和输出(第二列)的示例:
输入:输出:
not screen and (min-WIDTH:5px) AND (max-width:40px)
not screen and (min-width: 5px) and (max-width: 40px)
all and (color) and (color)
(color) and (color)

4.2.1. 序列化媒体特性值

这可能应该通过映射到 CSS 值序列化来完成,毕竟媒体特性最终也是根据 CSS 值定义的。

若要序列化一个名为 v 的媒体特性值,请在下表的每一列中定位 v 并使用描述的序列化格式:

媒体特性序列化
width ...
height ...
device-width ...
device-height ...
orientation 如果值为 portrait,则为 "portrait"。如果值为 landscape,则为 "landscape"。
aspect-ratio ...
device-aspect-ratio ...
color ...
color-index ...
单色 ...
resolution ...
scan 如果值为 progressive,则为 "progressive"。如果值为 interlace,则为 "interlace"。
grid ...

其他规范可以扩展此表,厂商前缀媒体特性也可以拥有自定义的序列化格式。

4.3. 比较媒体查询

若要比较媒体查询 m1m2,意味着将二者都进行序列化,如果它们是区分大小写的匹配,则返回 true,否则返回 false。

4.4. MediaList 接口

实现 MediaList 接口的对象具有一个关联的媒体查询集合

[Exposed=Window]
interface MediaList {
  stringifier attribute [LegacyNullToEmptyString] CSSOMString mediaText;
  readonly attribute unsigned long length;
  getter CSSOMString? item(unsigned long index);
  undefined appendMedium(CSSOMString medium);
  undefined deleteMedium(CSSOMString medium);
};

该对象的受支持属性索引是范围从 0 到该集合所代表的媒体查询数量减 1 的数字。如果没有此类媒体查询,则没有受支持属性索引

若要使用字符串 text创建一个 MediaList 对象,请执行以下步骤:

  1. 创建一个新的 MediaList 对象。
  2. 将其 mediaText 属性设置为 text
  3. 返回新创建的 MediaList 对象。

mediaText 属性在获取时,必须返回媒体查询集合序列化结果。设置 mediaText 属性时,必须执行以下步骤:

  1. 清空媒体查询集合
  2. 如果给定值为空字符串,则返回。
  3. 解析给定值所得的所有媒体查询追加到媒体查询集合中。

item(index) 方法必须返回媒体查询集合中由 index 给出的媒体查询的序列化;如果 index 大于或等于媒体查询集合中的媒体查询数量,则返回 null。

length 属性必须返回媒体查询集合中的媒体查询数量。

appendMedium(medium) 方法必须执行以下步骤:

  1. m解析给定值的结果。
  2. 如果 m 为 null,则返回。
  3. 如果将 m媒体查询集合中的任何媒体查询进行比较返回 true,则返回。
  4. m 追加到媒体查询集合中。

deleteMedium(medium) 方法必须执行以下步骤:

  1. m解析给定值的结果。
  2. 如果 m 为 null,则返回。
  3. 媒体查询集合中移除任何与 m 进行比较返回 true 的媒体查询。如果没有移除任何内容,则抛出 NotFoundError 异常。

5. 选择器

选择器定义在选择器规范中。本节主要定义如何序列化它们。

5.1. 解析选择器

若要解析一组选择器,意味着使用选择器规范中定义的 selectors_group 产生式解析该值,如果解析未失败则返回一组选择器,如果解析失败则返回 null。

5.2. 序列化选择器

若要序列化一组选择器,应序列化组中的每个选择器,然后序列化这些序列化结果的逗号分隔列表。

若要序列化一个选择器,设 s 为空字符串,为选择器链的每个部分运行以下步骤,最后返回 s

  1. 如果复合选择器中只有一个简单选择器且为通用选择器,则将序列化通用选择器的结果追加到 s
  2. 否则,对于复合选择器中不是通用选择器的每个简单选择器(其命名空间前缀映射到的命名空间不是默认命名空间),序列化简单选择器并将结果追加到 s
  3. 如果这不是选择器链的最后一部分,则追加一个空格 (U+0020),后跟组合符 ">"、"+"、"~"、">>"、"||"(视情况而定),如果该组合符不是空白,则再追加另一个空格 (U+0020) 到 s
  4. 如果这是选择器链的最后一部分且存在伪元素,则将 "::" 后跟伪元素名称追加到 s

若要序列化一个简单选择器,设 s 为空字符串,运行以下步骤,最后返回 s

类型选择器
通用选择器
  1. 如果命名空间前缀映射到的命名空间不是默认命名空间且不是空命名空间(不在命名空间中),则将标识符序列化后的命名空间前缀后跟 "|" (U+007C) 追加到 s
  2. 如果命名空间前缀映射到的命名空间是空命名空间(不在命名空间中),则将 "|" (U+007C) 追加到 s
  3. 如果这是类型选择器,则将元素名称的标识符序列化结果追加到 s
  4. 如果这是通用选择器,则将 "*" (U+002A) 追加到 s
属性选择器
  1. 将 "[" (U+005B) 追加到 s
  2. 如果命名空间前缀映射到的命名空间不是空命名空间(不在命名空间中),则将标识符序列化后的命名空间前缀后跟 "|" (U+007C) 追加到 s
  3. 将属性名称的标识符序列化结果追加到 s
  4. 如果指定了属性值,则视情况(取决于属性选择器类型)追加 "="、"~="、"|="、"^="、"$=" 或 "*=",后跟该属性值作为字符串的序列化结果到 s
  5. 如果属性选择器存在大小写敏感标志,则将 " i" (U+0020 U+0069) 追加到 s
  6. 将 "]" (U+005D) 追加到 s
类选择器
将 "." (U+002E) 后跟类名称的标识符序列化结果追加到 s
ID 选择器
将 "#" (U+0023) 后跟 ID 的标识符序列化结果追加到 s
伪类
如果伪类不接受参数,则将 ":" (U+003A) 后跟伪类名称追加到 s否则,将 ":" (U+003A) 后跟伪类名称,后跟 "(" (U+0028),后跟按照下方规则确定的伪类参数值,最后后跟 ")" (U+0029) 追加到 s
:lang()
每个参数作为字符串序列化后的逗号分隔列表,保留相对顺序。
:nth-child()
:nth-last-child()
:nth-of-type()
:nth-last-of-type()
使用序列化 <an+b> 值的规则序列化该值的结果。
:not()
使用序列化一组选择器的规则序列化该值的结果。

6. CSS

6.1. CSS 样式表

一个CSS 样式表是一个抽象概念,表示 CSS 规范所定义的样式表。在 CSSOM 中,CSS 样式表表示为 CSSStyleSheet 对象。

CSSStyleSheet(options)
调用时,执行创建构造的 CSSStyleSheet 的步骤(给定 options)并返回结果。
若要给定 CSSStyleSheetInit options创建一个构造的 CSSStyleSheet,运行以下步骤:
  1. 构造一个新的 CSSStyleSheet 对象 sheet
  2. sheet位置设置为当前全局对象关联文档基础 URL
  3. sheet样式表基础 URL 设置为 options 中的 baseURL 属性值。
  4. sheet父 CSS 样式表设置为 null。
  5. sheet所有者节点设置为 null。
  6. sheet所有者 CSS 规则设置为 null。
  7. sheet标题设置为空字符串。
  8. 取消设置 sheet替代标志
  9. 设置 sheet源纯净标志
  10. 设置 sheet构造标志
  11. sheet构造文档设置为当前全局对象关联文档
  12. 如果 optionsmedia 属性是一个字符串,则从该字符串创建 MediaList 对象并将其指派为 sheet媒体。否则,从该属性序列化媒体查询列表,然后从产生的字符串创建 MediaList 对象并将其设置为 sheet媒体
  13. 如果 optionsdisabled 属性为 true,则设置 sheet禁用标志
  14. 返回 sheet

一个CSS 样式表具有多个关联的状态项:

type
字面字符串 "text/css"。
location (位置)
创建时指定。CSS 样式表的第一个请求的绝对 URL 字符串,如果 CSS 样式表是嵌入的,则为 null。在 CSS 样式表的生命周期内不改变。
父级 CSS 样式表
创建时指定。CSS 样式表的父级,如果没有关联的父级,则为 null。
所有者节点
创建时指定。与CSS 样式表关联的 DOM 节点,如果没有关联的 DOM 节点,则为 null。
所有者 CSS 规则
创建时指定。父 CSS 样式表中导致包含此CSS 样式表CSS 规则,如果没有关联规则,则为 null。
media
创建时指定。与CSS 样式表关联的 MediaList 对象。如果此属性指定为一个字符串,则媒体必须设置为调用创建 MediaList 对象步骤以处理该字符串后的返回值。

如果此属性指定为所有者节点的一个属性,则媒体必须设置为调用创建 MediaList 对象步骤以处理该属性值后的返回值。每当属性被设置、更改或移除时,媒体mediaText 属性必须设置为该属性的新值,如果属性缺失则设置为 null。

注:更改媒体mediaText 属性不会更改所有者节点上的对应属性。

注:CSS 样式表所有者节点(如果非 null)是当CSS 样式表添加时,其关联 CSS 样式表为此CSS 样式表的节点。

title
创建时指定。CSS 样式表的标题,可以是空字符串。 在下文中,第一个样式表的标题非空,但第二个和第三个样式表的标题为空。<style title="papaya whip"> body { background: #ffefd5; } </style>
<style title="">
  body { background: orange; }
</style>
<style>
  body { background: brown; }
</style>

如果此属性指定为所有者节点的一个属性,则标题必须设置为该属性的值。每当属性被设置、更改或移除时,标题必须设置为该属性的新值,如果属性缺失则设置为空字符串。

注:如果节点处于文档树中,HTML 仅规范标题作为所有者节点的一个属性。

替代标志
创建时指定。要么设置,要么取消设置。默认为取消设置。 以下CSS 样式表设置了其替代标志<?xml-stylesheet alternate="yes" title="x" href="data:text/css,…"?>
<link rel="alternate stylesheet" title="x" href="data:text/css,…">
禁用标志
要么设置,要么取消设置。默认为取消设置。注:即使在取消设置时,也不一定意味着CSS 样式表确实被用于渲染。
CSS 规则
CSS 样式表关联的 CSS 规则。
源干净标志
创建时指定。要么设置,要么取消设置。如果已设置,API 允许读取和修改CSS 规则
构造标志
创建时指定。要么设置,要么取消设置。默认为取消设置。表示此样式表是否是通过调用 IDL 定义的构造函数创建的。
禁止修改标志
要么设置,要么取消设置。默认为取消设置。如果已设置,则不允许修改样式表的规则。
构造文档
创建时指定。构造样式表关联的 Document。默认为 null。仅对设置了构造标志的样式表非 null。
样式表基础 URL
解析样式表中相对 URL 时使用的基础 URL。默认为 null。仅对设置了构造标志的样式表非 null。

6.1.1. StyleSheet 接口

StyleSheet 接口表示一个抽象的基础样式表。

[Exposed=Window]
interface StyleSheet {
  readonly attribute CSSOMString type;
  readonly attribute USVString? href;
  readonly attribute (Element or ProcessingInstruction)? ownerNode;
  readonly attribute CSSStyleSheet? parentStyleSheet;
  readonly attribute DOMString? title;
  [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
  attribute boolean disabled;
};

type 属性必须返回类型

href 属性必须返回位置

ownerNode 属性必须返回所有者节点

parentStyleSheet 属性必须返回父 CSS 样式表

title 属性必须返回标题;如果标题为空字符串,则返回 null。

media 属性必须返回媒体

disabled 属性在获取时,如果禁用标志已设置,则必须返回 true,否则返回 false。在设置时,如果新值为 true,则 disabled 属性必须设置禁用标志,否则取消设置禁用标志

6.1.2. The CSSStyleSheet 接口

CSSStyleSheet 接口表示一个CSS 样式表

[Exposed=Window]
interface CSSStyleSheet : StyleSheet {
  constructor(optional CSSStyleSheetInit options = {});

  readonly attribute CSSRule? ownerRule;
  [SameObject] readonly attribute CSSRuleList cssRules;
  unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
  undefined deleteRule(unsigned long index);

  Promise<CSSStyleSheet> replace(USVString text);
  undefined replaceSync(USVString text);
};

dictionary CSSStyleSheetInit {
  DOMString baseURL = null;
  (MediaList or DOMString) media = "";
  boolean disabled = false;
};

ownerRule 属性必须返回所有者 CSS 规则。如果曾返回过非 null 的值,则每次获取访问时必须始终返回相同的值。

cssRules 属性必须遵循以下步骤:

  1. 如果源纯净标志被取消设置,抛出 SecurityError 异常。
  2. 返回一个只读的、实时的 CSSRuleList 对象,表示CSS 规则注:尽管返回的 CSSRuleList 对象(从客户端脚本的角度来看)是只读的,但由于其实时状态,它仍然可以随时间改变。例如,调用 insertRule()deleteRule() 方法可能会导致返回的对象中反映出突变。

insertRule(rule, index) 方法必须执行以下步骤:

  1. 如果源纯净标志被取消设置,抛出 SecurityError 异常。
  2. 如果设置了禁止修改标志,则抛出 NotAllowedError DOMException
  3. parsed rule 为调用解析规则(参数为 rule)的返回值。
  4. 如果 parsed rule 是一个语法错误,则返回该语法错误。
  5. 如果 parsed rule 是一个 @import 规则,且设置了构造标志,则抛出 SyntaxError DOMException
  6. 返回调用在CSS 规则处(索引为 index插入 CSS 规则 rule 的结果。

deleteRule(index) 方法必须执行以下步骤:

  1. 如果源纯净标志被取消设置,抛出 SecurityError 异常。
  2. 如果设置了禁止修改标志,则抛出 NotAllowedError DOMException
  3. CSS 规则处(索引为 index移除 CSS 规则

replace(text) 方法必须执行以下步骤:

  1. promise 为一个 promise。
  2. 如果未设置构造标志,或者设置了禁止修改标志,则用 NotAllowedError DOMException 拒绝 promise 并返回 promise
  3. 设置禁止修改标志
  4. 并行执行以下步骤:
  5. rules 为从 text 解析规则列表的结果。如果 rules 不是规则列表(即解析期间发生错误),则将 rules 设置为空列表。
  6. 如果 rules 包含一个或多个 @import 规则,rules 中移除这些规则
  7. sheetCSS 规则设置为 rules
  8. 取消设置 sheet禁止修改标志
  9. sheet 解析 promise
  • 返回 promise

    replaceSync(text) 方法必须对该 CSSStyleSheet 执行同步替换 CSSStyleSheet 规则的步骤(给定 text)。

    若要对 sheet同步替换 CSSStyleSheet 规则(给定 text),运行以下步骤:

    1. 如果未设置构造标志,或者设置了禁止修改标志,则抛出 NotAllowedError DOMException
    2. rules 为从 text 解析规则列表的结果。如果 rules 不是规则列表,则将 rules 设置为空列表。
    3. 如果 rules 包含一个或多个 @import 规则,rules 中移除这些规则
    4. sheetCSS 规则设置为 rules
    6.1.2.1. 已弃用的 CSSStyleSheet 成员

    注:这些成员是为与现有站点兼容而必需的。

    partial interface CSSStyleSheet {
      [SameObject] readonly attribute CSSRuleList rules;
      long addRule(optional DOMString selector = "undefined", optional DOMString style = "undefined", optional unsigned long index);
      undefined removeRule(optional unsigned long index = 0);
    };
    

    rules 属性必须遵循与 cssRules 相同的步骤,并返回 cssRules 本应返回的相同对象。

    removeRule(index) 方法必须执行与 deleteRule() 相同的步骤。

    addRule(selector, block, optionalIndex) 方法必须执行以下步骤:

    1. rule 为空字符串。
    2. selector 追加到 rule
    3. " { " 追加到 rule
    4. 如果 block 不为空,则将 block 后跟空格追加到 rule
    5. "}" 追加到 rule
    6. indexoptionalIndex(如果已提供),否则为样式表中CSS 规则的数量。
    7. 调用 insertRule(),并将 ruleindex 作为参数。
    8. 返回 -1

    作者不应使用这些成员,而应使用并教授前文定义的标准 CSSStyleSheet 接口,该接口与 CSSGroupingRule 一致。

    6.2. CSS 样式表集合

    下面定义了与每个 DocumentOrShadowRoot 对象相关联的各种新概念。

    每个 DocumentOrShadowRoot 都有一个关联的零个或多个CSS 样式表列表,名为文档或影子根 CSS 样式表。这是一个有序列表,包含:

    1. 任何由 HTTP Link 头部创建的CSS 样式表(按头部顺序)。
    2. 任何与 DocumentOrShadowRoot 关联的CSS 样式表(按树顺序)。

    每个 DocumentOrShadowRoot 都有一个关联的零个或多个CSS 样式表列表,名为最终 CSS 样式表。这是一个有序列表,包含:

    1. 文档或影子根 CSS 样式表
    2. DocumentOrShadowRootadoptedStyleSheets底层列表的内容(按数组顺序)。

    若要创建一个 CSS 样式表,运行以下步骤:

    1. 创建一个新的CSS 样式表对象并按指定设置其属性。
    2. 然后为新创建的CSS 样式表运行添加 CSS 样式表步骤。如果源纯净标志被取消设置,这可能会暴露来自用户内网的信息。

    若要添加一个 CSS 样式表,运行以下步骤:

    1. 将该CSS 样式表添加到文档或影子根 CSS 样式表列表的适当位置。其余步骤处理禁用标志
    2. 如果已设置禁用标志,则返回。
    3. 如果标题不是空字符串,替代标志被取消设置,且首选 CSS 样式表集名称为空字符串,则更改首选 CSS 样式表集名称为该标题
    4. 如果以下任何条件为真,则取消设置禁用标志并返回:
    5. 标题为空字符串。
    6. 上次使用的 CSS 样式表集名称为 null,且标题首选 CSS 样式表集名称区分大小写匹配。
    7. 标题上次使用的 CSS 样式表集名称区分大小写匹配。
    8. 设置禁用标志

    移除 CSS 样式表,请执行以下步骤

    1. 文档或影子根 CSS 样式表列表中移除该 CSS 样式表
    2. 将该 CSS 样式表父 CSS 样式表拥有节点拥有 CSS 规则设为 null。

    持久 CSS 样式表是指来自文档或影子根 CSS 样式表中的一个 CSS 样式表,其标题为空字符串且其替代标志未设置。

    CSS 样式表集是指来自文档或影子根 CSS 样式表的一个或多个 CSS 样式表组成的有序集合,它们具有相同且非空字符串的标题

    CSS 样式表集名称 CSS 样式表集共有的标题

    启用的 CSS 样式表集是指一个 CSS 样式表集,其中每个 CSS 样式表禁用标志均未设置。

    启用名称为 name 的 CSS 样式表集,请执行以下步骤

    1. 如果 name 为空字符串,则为每个处于 CSS 样式表集中的 CSS 样式表设置禁用标志并返回。
    2. 取消设置每个处于 CSS 样式表集中的 CSS 样式表禁用标志(其中该 CSS 样式表集名称name 区分大小写匹配),并为所有其他处于 CSS 样式表集中的 CSS 样式表设置该标志。

    选择名称为 name 的 CSS 样式表集,请执行以下步骤

    1. 启用名称为 name 的 CSS 样式表集
    2. 上次的 CSS 样式表集名称设为 name

    上次的 CSS 样式表集名称是一个用于确定最后选中了哪个 CSS 样式表集的概念。其初始值为 null。

    首选 CSS 样式表集名称是一个用于确定哪些 CSS 样式表需要取消设置其禁用标志的概念。其初始值为空字符串。

    更改首选 CSS 样式表集名称name,请执行以下步骤

    1. current首选 CSS 样式表集名称
    2. 首选 CSS 样式表集名称设为 name
    3. 如果 namecurrent 不匹配(区分大小写)且上次的 CSS 样式表集名称为 null,则启用名称为 name 的 CSS 样式表集

    6.2.1. HTTP Default-Style 标头

    HTTP Default-Style 标头可用于设置首选 CSS 样式表集名称,从而影响哪个 CSS 样式表集(初始)为启用的 CSS 样式表集

    对于每个 HTTP Default-Style 标头,用户代理必须按标头顺序执行更改首选 CSS 样式表集名称,名称即为标头的值。

    6.2.2. StyleSheetList 接口

    StyleSheetList 接口表示 CSS 样式表的有序集合。

    [Exposed=Window]
    interface StyleSheetList {
      getter CSSStyleSheet? item(unsigned long index);
      readonly attribute unsigned long length;
    };
    

    该对象的支持的属性索引是从 0 到该集合所表示的 CSS 样式表数量减 1 的数字范围。如果没有此类 CSS 样式表,则没有支持的属性索引

    item(index) 方法必须返回集合中第 index CSS 样式表。如果集合中不存在第 index 个对象,则该方法必须返回 null。

    length 属性必须返回集合所表示的 CSS 样式表数量。

    6.2.3. DocumentOrShadowRoot 接口混合的扩展

    partial interface mixin DocumentOrShadowRoot {
      [SameObject] readonly attribute StyleSheetList styleSheets;
      attribute ObservableArray<CSSStyleSheet> adoptedStyleSheets;
    };
    

    styleSheets 属性必须返回一个 StyleSheetList 集合,表示文档或影子根 CSS 样式表

    对于 adoptedStyleSheets,给定 valueindex设置索引值算法如下:

    1. 如果 value构造标志未设置,或其构造文档不等于此 DocumentOrShadowRoot节点文档,则抛出 "NotAllowedError" DOMException

    6.3. 样式表关联

    本节定义了 CSS 样式表拥有节点必须实现的接口,并定义了当链接关系类型与 "stylesheet" 不区分大小写(ASCII)匹配时,对 xml-stylesheet 处理指令和 HTTP Link 标头的要求。

    6.3.1. 获取 CSS 样式表

    获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer、文档 document 以及可选的参数集 parameters,后者用作创建请求的输入),请遵循以下步骤:

    1. origindocument
    2. request 为一个新的请求,包含 URL parsed URL origin引用者 referrer,以及如果指定了参数集 parameters,则一并传入。
    3. response获取 request 的结果。
    4. 等待直到 response 可用。
    5. 如果 response网络错误,则返回错误。
    6. 如果 document 处于怪异模式,且 response同源(CORS-same-origin),且 response内容类型元数据不是受支持的样式语言,则将 response内容类型元数据更改为 text/css
    7. 如果 response 不属于受支持的样式语言,则返回错误。
    8. 返回 response

    6.3.2. LinkStyle 接口

    节点的关联 CSS 样式表是指文档或影子根 CSS 样式表列表中,拥有节点为该节点的 CSS 样式表。该节点还必须实现 LinkStyle 接口。

    interface mixin LinkStyle {
      readonly attribute CSSStyleSheet? sheet;
    };
    

    sheet 属性必须返回节点的关联 CSS 样式表,如果没有关联 CSS 样式表,则返回 null。

    在以下片段中,第一个 style 元素具有一个返回表示样式表的 StyleSheet 对象的 sheet 属性;但对于第二个 style 元素,sheet 属性返回 null,假设用户代理支持 CSS (text/css),但不支持(假设的)ExampleSheets (text/example-sheets)。
    <style type="text/css">
      body { background:lime }
    </style>
    
    <style type="text/example-sheets">
      $(body).background := lime
    </style>
    

    注:节点是否引用样式表由定义该节点语义的规范决定。

    6.3.3. 对规范的要求

    引入通过 DOM 关联样式表的新方式的规范,应定义哪些节点实现 LinkStyle 接口。在定义时,它们还必须定义何时创建 CSS 样式表

    6.3.4. 对实现 xml-stylesheet 处理指令的用户代理的要求

    ProcessingInstruction includes LinkStyle;

    序言(prolog)是指作为文档子级且不跟随文档Element 子级之后的节点(如有)。

    当一个 ProcessingInstruction 节点 node 成为序言的一部分、不再是序言的一部分或其数据发生更改时,必须执行以下步骤:

    1. 如果此算法的实例当前正在针对 node 运行,则中止该实例,并在适用时停止关联的获取
    2. 如果 node 具有关联 CSS 样式表,则将其移除
    3. 如果 node 不是 xml-stylesheet 处理指令,则返回。
    4. 如果 node 没有 href 伪属性,则返回。
    5. titletitle 伪属性的值,如果未指定 title 伪属性,则为空字符串。
    6. 如果存在一个 alternate 伪属性,其值与 "yes" 区分大小写匹配,且 title 为空字符串,则返回。
    7. 如果存在一个 type 伪属性,其值不是受支持的样式语言,用户代理可以选择返回。
    8. input URLhref 伪属性指定的值。
    9. documentnode节点文档
    10. base URLdocument文档基础 URL
    11. referrerdocument地址
    12. parsed URL 为调用 URL 解析器(使用字符串 input URL 和基础 URL base URL)的返回值。
    13. 如果 parsed URL 解析失败,则返回。
    14. response获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer 和文档 document)的结果。
    15. 如果 response 为错误,则返回。
    16. 创建 CSS 样式表(具有以下属性):
      location (位置)
      调用 URL 序列化器(使用 parsed URL)的结果。
      父级 CSS 样式表
      null。
      所有者节点
      node (节点).
      所有者 CSS 规则
      null。
      media
      media 伪属性的值(如有),否则为空字符串。
      title
      title.
      替代标志
      如果 alternate 伪属性值与 "yes" 区分大小写匹配,则设置该项,否则取消设置。
      源干净标志
      如果 response同源(CORS-same-origin),则设置该项,否则取消设置。

      CSS 环境编码是运行以下步骤的结果:

      1. 如果元素具有 charset 伪属性,则从该伪属性的值获取编码。如果成功,返回得到的编码并中止这些步骤。
      2. 否则,返回文档的字符编码[DOM]

    若在 Document XML 解析器上下文中,通过本节规则使用 xml-stylesheet 处理指令引用的样式表,满足以下条件,则称其为阻塞脚本的样式表:该 ProcessingInstruction 节点是由该 Document 的解析器创建的;且节点由解析器创建时样式表已启用;且上次事件循环到达步骤 1 时,节点处于该 Document 中;且用户代理尚未放弃加载该特定样式表。用户代理可在任何时候放弃此类样式表。

    对于每个链接关系类型中包含与 "stylesheet" 不区分大小写(ASCII)匹配的 HTTP Link 标头,必须执行以下步骤:

    1. title 为所有 title 参数中第一个参数的值。如果没有此类参数,则为空字符串。
    2. 如果(其他)链接关系类型之一与 "alternate" 不区分大小写(ASCII)匹配,且 title 为空字符串,则返回。
    3. input URL 为指定的值。

      需更具体说明

    4. base URL 为文档的文档基础 URL

      此处是否有文档?

    5. referrer 为文档的地址
    6. origin 为文档的
    7. parsed URL 为调用 URL 解析器(使用字符串 input URL 和基础 URL base URL)的返回值。
    8. 如果 parsed URL 解析失败,则返回。
    9. response获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer 和该文档)的结果。

      如果 HTML 解析器尚未确定怪异/非怪异模式怎么办?

    10. 创建 CSS 样式表(具有以下属性):
      location (位置)
      调用 URL 序列化器(使用 parsed URL)的结果。
      所有者节点
      null。
      父级 CSS 样式表
      null。
      所有者 CSS 规则
      null。
      media
      第一个 media 参数的值。
      title
      title.
      替代标志
      如果此 HTTP Link 标头指定的链接关系类型之一与 "alternate" 不区分大小写(ASCII)匹配,则设置该项,否则为 false。
      源干净标志
      如果 response同源(CORS-same-origin),则设置该项,否则取消设置。

    若通过本节规则使用 HTTP Link 标头引用的样式表满足以下条件,则称其为阻塞脚本的样式表:该样式表在创建时已启用,且用户代理尚未放弃该特定样式表。用户代理可在任何时候放弃此类样式表。

    6.4. CSS 规则

    CSS 规则是一个抽象概念,表示 CSS 规范定义的规则。 CSS 规则表示为一个实现 CSSRule 接口子类的对象,并具有以下关联状态项:

    type
    与特定类型规则关联的非负整数。此项在创建规则时初始化,且不可更改。
    text
    适合在样式表中直接使用的规则的文本表示形式。此项在创建规则时初始化,且可以更改。
    父 CSS 规则
    对封闭 CSS 规则的引用或 null。如果规则在创建时有封闭规则,则此项初始化为该封闭规则;否则为 null。它可以更改为 null。
    父级 CSS 样式表
    对父 CSS 样式表的引用或 null。此项在创建规则时初始化为引用关联的样式表。它可以更改为 null。
    子 CSS 规则
    CSS 规则列表。该列表可以被修改。

    除上述状态外,每个 CSS 规则可能根据其类型关联其他状态。

    要从字符串 string 解析 CSS 规则,请执行以下步骤

    1. rule 为调用解析规则(使用 string)的返回值。
    2. 如果 rule 是语法错误,则返回 rule
    3. parsed rule 为根据相应 CSS 规范解析 rule 的结果,丢弃被认为应忽略的部分。如果整个样式规则被丢弃,则返回语法错误。
    4. 返回 parsed rule

    序列化 CSS 规则,请根据 CSS 规则类型执行以下操作之一:

    CSSStyleRule
    返回执行以下步骤的结果:
    1. s 初始为对规则关联选择器执行序列化选择器组的结果,后跟字符串 " {"(即一个空格 (U+0020),后跟左花括号 (U+007B))。
    2. decls 为对规则关联声明执行序列化 CSS 声明块的结果;若无此类声明,则为 null。
    3. rules 为对规则 cssRules 列表中的每个规则执行序列化 CSS 规则的结果;若无此类规则,则为 null。
    4. 如果 declsrules 均为 null,则向 s 追加 " }"(即一个空格 (U+0020) 后跟右花括号 (U+007D))并返回 s
    5. 如果 rules 为 null:
      1. s 追加一个空格 (U+0020)。
      2. s 追加 decls
      3. s 追加 " }"(即一个空格 (U+0020) 后跟右花括号 (U+007D))。
      4. 返回 s
    6. 否则
      1. 如果 decls 不为 null,将其前置于 rules
      2. 对于 rules 中的每个 rule
        1. s 追加一个换行符,后跟两个空格。
        2. s 追加 rule
      3. s 追加一个换行符,后跟右花括号 (U+007D)。
      4. 返回 s
    CSS导入规则
    连接以下内容的结果:
    1. 字符串 "@import",后跟一个空格 (U+0020)。
    2. 对规则位置执行序列化 URL 的结果。
    3. 如果规则关联的媒体列表不为空,则为一个空格 (U+0020),后跟对该媒体列表执行序列化媒体查询列表的结果。
    4. 字符串 ";",即分号 (U+003B)。
    @import url("import.css");
    @import url("print.css") print;
    CSS媒体规则
    连接以下内容的结果:
    1. 字符串 "@media",后跟一个空格 (U+0020)。
    2. 对规则媒体查询列表执行序列化媒体查询列表的结果。
    3. 一个空格 (U+0020),后跟字符串 "{"(即左花括号 (U+007B)),后跟一个换行符。
    4. 对规则 cssRules 列表中的每个规则执行序列化 CSS 规则的结果,以换行符分隔并缩进两个空格。
    5. 一个换行符,后跟字符串 "}"(即右花括号 (U+007D))。
    CSS字体规则
    连接以下内容的结果:
    1. 字符串 "@font-face {",后跟一个空格 (U+0020)。
    2. 字符串 "font-family:",后跟一个空格 (U+0020)。
    3. 对规则字体族名称执行序列化字符串的结果。
    4. 字符串 ";",即分号 (U+003B)。
    5. 如果规则关联的源列表不为空,执行以下子步骤:
      1. 一个空格 (U+0020),后跟字符串 "src:",后跟一个空格 (U+0020)。
      2. 对源列表中的每个源执行序列化 URL序列化 LOCAL,并调用序列化逗号分隔列表的结果。
      3. 字符串 ";",即分号 (U+003B)。
    6. 如果存在规则关联的 unicode-range 描述符,则为一个空格 (U+0020),后跟字符串 "unicode-range:",后跟一个空格 (U+0020),后跟<'unicode-range'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    7. 如果存在规则关联的 font-variant 描述符,则为一个空格 (U+0020),后跟字符串 "font-variant:",后跟一个空格 (U+0020),后跟 <'font-variant'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    8. 如果存在规则关联的 font-feature-settings 描述符,则为一个空格 (U+0020),后跟字符串 "font-feature-settings:",后跟一个空格 (U+0020),后跟<'font-feature-settings'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    9. 如果存在规则关联的 font-stretch 描述符,则为一个空格 (U+0020),后跟字符串 "font-stretch:",后跟一个空格 (U+0020),后跟<'font-stretch'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    10. 如果存在规则关联的 font-weight 描述符,则为一个空格 (U+0020),后跟字符串 "font-weight:",后跟一个空格 (U+0020),后跟<'font-weight'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    11. 如果存在规则关联的 font-style 描述符,则为一个空格 (U+0020),后跟字符串 "font-style:",后跟一个空格 (U+0020),后跟<'font-style'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。
    12. 一个空格 (U+0020),后跟字符串 "}"(即右花括号 (U+007D))。

    需要定义 CSSFontFaceRule 描述符的值是如何序列化的。

    CSS页面规则

    需要定义 CSSPageRule 是如何序列化的。

    CSSNamespaceRule
    字面字符串 "@namespace",后跟一个空格 (U+0020),后跟 prefix 属性(如有)的标识符序列化,后跟一个空格 (U+0020)(若存在前缀),后跟 namespaceURI 属性的 URL 序列化,后跟字符 ";" (U+003B)。
    CSSKeyframesRule
    连接以下内容的结果:
    1. 字面字符串 "@keyframes",后跟一个空格 (U+0020)。
    2. name 属性的标识符序列化
    3. 对规则 cssRules 列表中的每个规则执行序列化 CSS 规则的结果,以换行符分隔并缩进两个空格。
    4. 一个换行符,后跟字符串 "}"(即右花括号 (U+007D))。
    CSSKeyframeRule
    连接以下内容的结果:
    1. keyText
    2. 字符串 " { "(即一个空格 (U+0020),后跟左花括号 (U+007B))。
    3. 对规则关联声明执行序列化 CSS 声明块的结果。
    4. 如果规则关联有一个或多个声明,则为字符串 " "(即一个空格 (U+0020))。
    5. 字符串 "}",右花括号 (U+007D)。

    “缩进两个空格”部分与浏览器行为一致,但仍需改进,详见 #5494

    要将 CSS 规则 rule 插入到 CSS 规则列表 list 的索引 index 处,请执行以下步骤:

    1. length 设为 list 中的项目数。
    2. 如果 index 大于 length,则抛出一个 IndexSizeError 异常。
    3. new rule 设为对参数 rule 执行解析 CSS 规则的结果。
    4. 如果 new rule 是语法错误,则抛出一个 SyntaxError 异常。
    5. 如果由于 CSS 指定的约束,new rule 无法插入到 list 的零索引位置 index 处,则抛出一个 HierarchyRequestError 异常。 [CSS21]注:例如,CSS 样式表不能在样式规则之后包含 @import @规则。
    6. 如果 new rule@namespace @规则,且 list 包含除 @import @规则和 @namespace @规则以外的任何内容,则抛出一个 InvalidStateError 异常。
    7. new rule 插入到 list 的零索引位置 index 处。
    8. 返回 index

    要从 CSS 规则列表 list 中移除索引 index 处的 CSS 规则,请执行以下步骤:

    1. length 设为 list 中的项目数。
    2. 如果 index 大于或等于 length,则抛出一个 IndexSizeError 异常。
    3. old rule 设为 list 中的第 index 个项。
    4. 如果 old rule@namespace @规则,且 list 包含除 @import @规则和 @namespace @规则以外的任何内容,则抛出一个 InvalidStateError 异常。
    5. list 的零索引位置 index 处移除规则 old rule
    6. old rule父 CSS 规则父 CSS 样式表设为 null。

    6.4.1. CSSRuleList 接口

    CSSRuleList 接口表示 CSS 样式规则的有序集合。

    [Exposed=Window]
    interface CSSRuleList {
      getter CSSRule? item(unsigned long index);
      readonly attribute unsigned long length;
    };
    

    该对象的支持的属性索引是从 0 到该集合所表示的 CSSRule 对象数量减 1 的数字范围。如果没有此类 CSSRule 对象,则没有支持的属性索引

    item(index) 方法必须返回集合中第 indexCSSRule 对象。如果集合中不存在第 index 个对象,则该方法必须返回 null。

    length 属性必须返回集合所表示的 CSSRule 对象数量。

    6.4.2. CSSRule 接口

    CSSRule 接口表示抽象的基础 CSS 样式规则。每个不同的 CSS 样式规则类型由继承此接口的独立接口表示。

    [Exposed=Window]
    interface CSSRule {
      attribute CSSOMString cssText;
      readonly attribute CSSRule? parentRule;
      readonly attribute CSSStyleSheet? parentStyleSheet;
    
      // the following attribute and constants are historical
      readonly attribute unsigned short type;
      const unsigned short STYLE_RULE = 1;
      const unsigned short CHARSET_RULE = 2;
      const unsigned short IMPORT_RULE = 3;
      const unsigned short MEDIA_RULE = 4;
      const unsigned short FONT_FACE_RULE = 5;
      const unsigned short PAGE_RULE = 6;
      const unsigned short MARGIN_RULE = 9;
      const unsigned short NAMESPACE_RULE = 10;
    };
    

    cssText 属性必须返回 CSS 规则序列化形式。设置 cssText 属性时必须不执行任何操作。

    parentRule 属性必须返回父 CSS 规则

    注:例如,@media 可以包含一条规则,在这种情况下 parentRule 将不为 null;在没有封闭规则的情况下,parentRule 将为 null。

    parentStyleSheet 属性必须返回父 CSS 样式表

    注:返回 null 的唯一情况是规则已被移除

    注:Document 实例中移除实现 LinkStyle 接口的 Node 不会(本身)导致 CSSRule 引用的 CSSStyleSheet 变得不可访问。

    type 属性已弃用。它必须返回一个整数,具体如下:

    如果对象是 CSSStyleRule:返回 1。
    返回 1。
    如果对象是 CSSImportRule
    返回 3。
    如果对象是 CSSMediaRule
    返回 4。
    如果对象是 CSSFontFaceRule
    返回 5。
    如果对象是 CSSPageRule
    返回 6。
    如果对象是 CSSKeyframesRule
    返回 7。
    如果对象是 CSSKeyframeRule
    返回 8。
    如果对象是 CSSMarginRule
    返回 9。
    如果对象是 CSSNamespaceRule
    返回 10。
    如果对象是 CSSCounterStyleRule
    返回 11。
    如果对象是 CSSSupportsRule
    返回 12。
    如果对象是 CSSFontFeatureValuesRule
    返回 14。
    如果对象是 CSSViewportRule
    返回 15。
    否则
    返回 0。

    注:使用整数枚举和多个常量来标识整数的做法是一种在 Web API 中不再使用的遗留设计惯例。相反,要判断给定对象是哪种类型的规则,建议检查 rule.constructor.name,它将返回类似 "CSSStyleRule" 的字符串。

    6.4.3. CSSStyleRule 接口

    CSSStyleRule 接口表示样式规则。

    [Exposed=Window]
    interface CSSStyleRule : CSSRule {
      attribute CSSOMString selectorText;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    

    selectorText 属性在获取时,必须返回序列化关联的选择器组的结果。设置 selectorText 属性时,必须执行以下步骤:

    1. 对给定值运行解析选择器组算法。
    2. 如果算法返回非 null 值,则用返回的值替换关联的选择器组
    3. 否则,如果算法返回 null 值,则不执行任何操作。

    style 属性必须返回样式规则的 CSSStyleDeclaration 对象,具有以下属性:

    计算标志
    未设置。
    declarations
    规则中的声明声明,按指定顺序排列。
    父 CSS 规则
    上下文对象
    所有者节点
    Null。

    指定顺序与声明的顺序相同,但简写属性会展开为标准顺序的长写属性。如果属性多次指定(在简写展开后),则仅保留层叠顺序最高的一个,且保留其原始的相对位置。 [CSS3CASCADE]

    6.4.4. CSSImportRule 接口

    CSSImportRule 接口表示 @import @规则。

    [Exposed=Window]
    interface CSSImportRule : CSSRule {
      readonly attribute USVString href;
      [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
      [SameObject] readonly attribute CSSStyleSheet styleSheet;
    };
    

    href 属性必须返回 @import @规则指定的 URL

    注:要获取解析后的 URL,请使用关联 CSS 样式表href 属性。

    media 属性必须返回关联 CSS 样式表media 属性的值。

    styleSheet 属性必须返回关联的 CSS 样式表

    注:@import @规则始终具有关联的 CSS 样式表

    6.4.5. CSSGroupingRule 接口

    CSSGroupingRule 接口表示在其内部嵌套其他规则的 @规则。

    [Exposed=Window]
    interface CSSGroupingRule : CSSRule {
      [SameObject] readonly attribute CSSRuleList cssRules;
      unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
      undefined deleteRule(unsigned long index);
    };
    

    cssRules 属性必须返回子 CSS 规则CSSRuleList 对象。

    insertRule(rule, index) 方法必须返回将 rule 插入到子 CSS 规则(索引为 index)的结果。

    deleteRule(index) 方法必须从子 CSS 规则的索引 index移除 CSS 规则

    6.4.6. CSSMediaRule 接口

    CSSMediaRule 接口在 CSS Conditional Rules 中定义。 [CSS3-CONDITIONAL]

    6.4.7. CSSPageRule 接口

    CSSPageRule 接口表示 @page @规则。

    需要定义解析 CSS 页面选择器列表序列化 CSS 页面选择器列表的规则。

    [Exposed=Window]
    interface CSSPageRule : CSSGroupingRule {
               attribute CSSOMString selectorText;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    

    selectorText 属性在获取时,必须返回序列化关联的 CSS 页面选择器列表的结果。设置 selectorText 属性时,必须执行以下步骤:

    1. 对给定值运行解析 CSS 页面选择器列表算法。
    2. 如果算法返回非 null 值,则用返回的值替换关联的 CSS 页面选择器列表
    3. 否则,如果算法返回 null 值,则不执行任何操作。

    style 属性必须返回 @page @规则的 CSSStyleDeclaration 对象,具有以下属性:

    计算标志
    未设置。
    declarations
    规则中的声明声明,按指定顺序排列。
    父 CSS 规则
    上下文对象
    所有者节点
    Null。

    6.4.8. CSSMarginRule 接口

    CSSMarginRule 接口表示 @page @规则中的页边距 @规则(例如 @top-left)。 [CSS3PAGE]

    [Exposed=Window]
    interface CSSMarginRule : CSSRule {
      readonly attribute CSSOMString name;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    

    name 属性必须返回页边距 @规则的名称。@ 字符不包含在名称中。 [CSS3SYN]

    style 属性必须返回页边距 @规则的 CSSStyleDeclaration 对象,具有以下属性:

    计算标志
    未设置。
    declarations
    规则中的声明声明,按指定顺序排列。
    父 CSS 规则
    上下文对象
    所有者节点
    Null。

    6.4.9. CSSNamespaceRule 接口

    CSSNamespaceRule 接口表示 @namespace @规则。

    [Exposed=Window]
    interface CSSNamespaceRule : CSSRule {
      readonly attribute CSSOMString namespaceURI;
      readonly attribute CSSOMString prefix;
    };
    

    namespaceURI 属性必须返回 @namespace @规则的命名空间。

    prefix 属性必须返回 @namespace @规则的前缀;如果没有前缀,则返回空字符串。

    6.5. CSS 声明

    CSS 声明是一个抽象概念,不会作为 DOM 对象公开。 CSS 声明具有以下关联属性:

    属性名称
    声明的属性名称。
    value
    表示为组件值列表的声明值。
    important 标志
    可以设置或取消设置。可以更改。
    区分大小写标志
    如果属性名称根据其规范定义为区分大小写,则设置该项,否则取消设置。

    6.6. CSS 声明块

    CSS 声明块是 CSS 属性及其关联值的有序集合,也称为 CSS 声明。在 DOM 中, CSS 声明块是一个 CSSStyleDeclaration 对象。 CSS 声明块具有以下关联属性:

    计算标志
    如果对象是计算样式声明而不是指定样式,则设置该项。除非另有说明,否则未设置。
    declarations
    与对象关联的 CSS 声明
    父 CSS 规则
    CSS 声明块关联的 CSS 规则(如有),否则为 null。
    所有者节点
    CSS 声明块关联的 Element(如有),否则为 null。
    更新标志
    默认为取消设置。当 CSS 声明块正在更新拥有节点style 属性时,设置该项。

    要从字符串 string 解析 CSS 声明块,请执行以下步骤:

    1. declarations 为调用解析声明列表(使用 string)的返回值。
    2. parsed declarations 为一个新的空列表。
    3. 对于 declarations 中的每个项目 declaration,执行以下子步骤:
    4. parsed declaration 为根据相应 CSS 规范解析 declaration 的结果,丢弃被认为应忽略的部分。如果整个声明被丢弃,则设 parsed declaration 为 null。
    5. 如果 parsed declaration 不为 null,则将其追加到 parsed declarations
  • 返回 parsed declarations

    序列化 CSS 声明(具有属性名称 property、值 value 以及可选的 important 标志),请执行以下步骤:

    1. s 为空字符串。
    2. s 追加 property
    3. s 追加 ": " (U+003A U+0020)。
    4. s 追加 value
    5. 如果设置了 important 标志,则向 s 追加 " !important" (U+0020 U+0021 U+0069 U+006D U+0070 U+006F U+0072 U+0074 U+0061 U+006E U+0074)。
    6. s 追加 ";" (U+003B)。
    7. 返回 s

    序列化 CSS 声明块 declaration block,需执行以下步骤:

    1. list 为一个空数组。
    2. already serialized 为一个空数组。
    3. 声明循环:对于 declaration block声明中的每个 CSS 声明 declaration,执行以下子步骤:
    4. propertydeclaration属性名称
    5. 如果 property 已在 already serialized 中,则继续执行标注为声明循环的步骤。
    6. 如果 property 映射到一个或多个简写属性,则设 shorthands 为这些简写属性的数组,按首选顺序排列。
    7. 简写循环:对于 shorthands 中的每个 shorthand,执行以下子步骤:
    8. longhandsdeclaration block声明中所有 CSS 声明组成的数组,且这些声明不在 already serialized 中,且其属性名称映射到 shorthands 中的某个简写属性。
    9. 如果映射到 shorthand 的所有属性均未出现在 longhands 中,则继续执行标注为简写循环的步骤。
    10. current longhands 为一个空数组。
    11. longhands 中所有 CSS 声明(其属性名称映射到 shorthand)追加到 current longhands
    12. 如果有任何 CSS 声明current longhands 中设置了重要(important)标志,而其他声明未设置,则继续执行标注为简写循环的步骤。
    13. 如果在 declaration block 中,位于 current longhands 中第一个和最后一个长写声明之间的任何声明属于同一个逻辑属性组,但具有与 current longhands 中任何长写声明不同的映射逻辑,且不在 current longhands 中,则继续执行标注为简写循环的步骤。
    14. value 为对 current longhands 调用序列化 CSS 值的结果。
    15. 如果 value 为空字符串,则继续执行标注为简写循环的步骤。
    16. serialized declaration 为调用序列化 CSS 声明(属性名称为 shorthand,值为 value,且如果 current longhands 中的 CSS 声明设置了重要标志,则设置 important 标志)的结果。
    17. list 追加 serialized declaration
    18. already serialized 追加 current longhands 中所有项的属性名称。
    19. 继续执行标注为声明循环的步骤。
  • value 为对 declaration 调用序列化 CSS 值的结果。
  • serialized declaration 为调用序列化 CSS 声明(属性名称为 property,值为 value,且如果 declaration 设置了重要标志,则设置 important 标志)的结果。
  • list 追加 serialized declaration
  • already serialized 追加 property
  • 返回连接了 " " (U+0020) 的 list

    注:空 CSS 声明块的序列化为空字符串。

    注:非空 CSS 声明块的序列化不包括任何周围的空格,即第一个属性名称之前没有空格,最后一个属性值后的最终分号定界符之后也没有空格。

    CSS 声明块对于其拥有节点具有以下属性更改步骤,包含 localNamevaluenamespace

    1. 如果设置了计算标志,则返回。
    2. 如果设置了更新标志,则返回。
    3. 如果 localName 不是 "style" 或 namespace 不为 null,则返回。
    4. 如果 value 为 null,则清空声明
    5. 否则,设声明为从字符串 value 解析 CSS 声明块的结果。

    当创建 CSS 声明块对象时:

    1. owner node拥有节点
    2. 如果 owner node 为 null 或设置了计算标志,则返回。
    3. value获取属性(给定 null、"style" 和 owner node)的结果。
    4. 如果 value 不为 null,设声明为从字符串 value 解析 CSS 声明块的结果。

    更新声明块 declaration blockstyle 属性,需运行以下步骤:

    1. 断言:declaration block计算标志未设置。
    2. owner nodedeclaration block拥有节点
    3. 如果 owner node 为 null,则返回。
    4. 设置 declaration block更新标志
    5. 设置属性值(使用 "style" 和序列化 declaration block 的结果)作用于 owner node
    6. 取消设置 declaration block更新标志

    简写属性列表 shorthands首选顺序如下:

    1. 按字典顺序排序 shorthands
    2. shorthands 中所有以 "-" (U+002D) 开头的项移至列表末尾,保留其相对顺序。
    3. shorthands 中所有以 "-" (U+002D) 开头但不以 "-webkit-" 开头的项移至列表末尾,保留其相对顺序。
    4. 按映射到它的长写属性数量对 shorthands 排序,数量最多的在前。

    6.6.1. CSSStyleDeclaration 接口

    CSSStyleDeclaration 接口表示一个 CSS 声明块,包括其基础状态,其中基础状态取决于 CSSStyleDeclaration 实例的来源。

    [Exposed=Window]
    interface CSSStyleDeclaration {
      [CEReactions] attribute CSSOMString cssText;
      readonly attribute unsigned long length;
      getter CSSOMString item(unsigned long index);
      CSSOMString getPropertyValue(CSSOMString property);
      CSSOMString getPropertyPriority(CSSOMString property);
      [CEReactions] undefined setProperty(CSSOMString property, [LegacyNullToEmptyString] CSSOMString value, optional [LegacyNullToEmptyString] CSSOMString priority = "");
      [CEReactions] CSSOMString removeProperty(CSSOMString property);
      readonly attribute CSSRule? parentRule;
      [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString cssFloat;
    };
    

    该对象的支持的属性索引是从 0 到该声明中的 CSS 声明数量减 1 的数字范围。如果没有此类 CSS 声明,则没有支持的属性索引

    获取 cssText 属性必须运行以下步骤:

    1. 如果设置了计算标志,则返回空字符串。

    2. 返回序列化声明的结果。

    设置 cssText 属性时,必须运行以下步骤:

    1. 如果设置了计算标志,则抛出一个 NoModificationAllowedError 异常。
    2. 清空声明
    3. 解析给定的值,如果返回值不是空列表,则将列表中的项按指定顺序插入到声明中。
    4. 更新CSS 声明块的 style 属性。

    length 属性必须返回声明 CSS 声明的数量。

    item(index) 方法必须返回位置 index 处的 CSS 声明属性名称

    getPropertyValue(property) 方法必须执行以下步骤

    1. 如果 property 不是自定义属性,请执行以下子步骤
      1. property转换为 ASCII 小写后的 property
      2. 如果 property 是缩写属性,请执行以下子步骤
        1. list 为一个新的空数组。
        2. 对于 property 所映射的每个长写属性 longhand,按规范顺序执行以下子步骤
          1. 如果 longhand声明中某个 CSS 声明属性名称区分大小写匹配,则令 declaration 为该 CSS 声明,否则设为 null。
          2. 如果 declaration 为 null,则返回空字符串。
          3. declaration 追加到 list
        3. 如果 list 中所有声明的重要标志都相同,则返回 list序列化结果。
        4. 返回空字符串。
    2. 如果 property声明中某个 CSS 声明属性名称区分大小写匹配,则返回对该声明调用序列化 CSS 值的结果。
    3. 返回空字符串。

    getPropertyPriority(property) 方法必须执行以下步骤

    1. 如果 property 不是自定义属性,请执行以下子步骤
      1. property转换为 ASCII 小写后的 property
      2. 如果 property 是缩写属性,请执行以下子步骤
        1. list 为一个新的数组。
        2. 对于 property 所映射的每个长写属性 longhand,将以 longhand 为参数调用 getPropertyPriority() 的结果追加到 list
        3. 如果 list 中的所有项均为字符串“important”,则返回字符串“important”。
    2. 如果 property声明中设置了重要标志的某个 CSS 声明属性名称区分大小写匹配,则返回字符串“important”。
    3. 返回空字符串。
    例如,对于 background-color:lime !IMPORTANT,返回值将是“important”。

    setProperty(property, value, priority) 方法必须执行以下步骤

    1. 如果设置了计算标志,则抛出一个 NoModificationAllowedError 异常。
    2. 如果 property 不是自定义属性,请执行以下子步骤
      1. property转换为 ASCII 小写后的 property
      2. 如果 property支持的 CSS 属性区分大小写匹配,则返回。
    3. 如果 value 是空字符串,则以 property 为参数调用 removeProperty() 并返回。
    4. 如果 priority 不是空字符串且与字符串“important”不ASCII 不区分大小写匹配,则返回。
    5. component value list 为对属性 property 解析 value 的结果。

      注:value 不能包含“!important”。

    6. 如果 component value list 为 null,则返回。
    7. updated 为 false。
    8. 如果 property 是缩写属性,则对于 property 所映射的每个长写属性 longhand,按规范顺序执行以下子步骤
      1. longhand result设置 CSS 声明 longhand 的结果(使用 component value list 中的适当值,如果 priority 不是空字符串则设置重要标志,否则取消设置,并使用声明列表)。
      2. 如果 longhand result 为 true,则令 updated 为 true。
    9. 否则,令 updated设置 CSS 声明 property 的结果(使用值 component value list,如果 priority 不是空字符串则设置重要标志,否则取消设置,并使用声明列表)。
    10. 如果 updated 为 true,则更新CSS 声明块的 style 属性。

    设置 CSS 声明 property(使用值 component value list 以及可选的重要标志,在声明列表 declarations 中),用户代理必须确保其步骤之后满足以下约束

    我们是否应该添加诸如“任何可观察的副作用不得在 declarations 之外产生”之类的说明?当前的约束听起来像是未定义行为的一个漏洞。

    注:设置 CSS 声明的步骤在此级 CSSOM 中未定义。只要满足上述约束,用户代理可以使用不同的算法。

    符合这些约束的最简单方法是始终删除任何匹配 property 的现有声明,并将新声明追加到末尾。但根据实现反馈,这种方法可能会导致性能下降。

    另一种可能的算法是

    1. 如果 propertydeclarations 中某个 CSS 声明属性名称区分大小写匹配,请执行以下子步骤
      1. 目标声明 为该 CSS 声明
      2. needs append 为 false。
      3. 遍历 target declaration 之后 declarations 中的每个 declaration
        1. 如果 declaration属性名称property 不在同一逻辑属性组中,则继续
        2. 如果 declaration属性名称property 具有相同的映射逻辑,则继续
        3. needs append 为 true。
        4. 跳出。.
      4. 如果 needs append 为 false,则
        1. needs update 为 false。
        2. 如果 target declaration不等于 component value list,则令 needs update 为 true。
        3. 如果 target declaration重要标志不等于是否设置了重要标志,则令 needs update 为 true。
        4. 如果 needs update 为 false,则返回 false。
        5. 设置 target declarationcomponent value list
        6. 如果设置了重要标志,则设置 target declaration重要标志,否则取消设置。
        7. 返回 true。
      5. 否则,从 declarations 中移除 target declaration
    2. declarations 追加一个新的 CSS 声明,其属性名称propertycomponent value list,若设置了重要标志则设置重要标志
    3. 返回 true。

    removeProperty(property) 方法必须执行以下步骤

    1. 如果设置了计算标志,则抛出一个 NoModificationAllowedError 异常。
    2. 如果 property 不是自定义属性,令 property转换为 ASCII 小写后的 property
    3. value 为以 property 为参数调用 getPropertyValue() 的返回值。
    4. removed 为 false。
    5. 如果 property 是缩写属性,则对于 property 所映射的每个长写属性 longhand
      1. 如果 longhand声明中某个 CSS 声明属性名称不匹配,则继续
      2. 移除该 CSS 声明并令 removed 为 true。
    6. 否则,如果 property声明中某个 CSS 声明属性名称区分大小写匹配,则移除该 CSS 声明并令 removed 为 true。
    7. 如果 removed 为 true,则更新CSS 声明块的 style 属性。
    8. 返回 value

    parentRule 属性必须返回父 CSS 规则

    cssFloat 属性在获取时,必须返回以 float 为参数调用 getPropertyValue() 的结果。在设置时,该属性必须以 float 作为第一个参数、给定值作为第二个参数、无第三个参数调用 setProperty()。任何抛出的异常必须被重新抛出。

    对于每个作为支持的 CSS 属性的 CSS 属性 property,以下部分接口适用,其中 驼峰命名属性 是通过针对 property 运行CSS 属性转 IDL 属性算法获得的。

    partial interface CSSStyleDeclaration {
      [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString _camel_cased_attribute;
    };
    

    驼峰命名属性在获取时,必须返回以针对驼峰命名属性运行IDL 属性转 CSS 属性算法的结果为参数,调用 getPropertyValue() 的结果。

    设置驼峰命名属性必须以针对驼峰命名属性运行IDL 属性转 CSS 属性算法的结果为第一个参数,给定值作为第二个参数,无第三个参数,调用 setProperty()。任何抛出的异常必须被重新抛出。

    例如,对于 font-size 属性,将存在一个 fontSize IDL 属性。

    对于每个作为支持的 CSS 属性且以 -webkit- 字符串开头的 CSS 属性 property,以下部分接口适用,其中 webkit 驼峰命名属性 是通过针对 property 运行CSS 属性转 IDL 属性算法(设置了首字母小写标志)获得的。

    partial interface CSSStyleDeclaration {
      [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString _webkit_cased_attribute;
    };
    

    webkit 驼峰命名属性在获取时,必须返回以针对webkit 驼峰命名属性运行IDL 属性转 CSS 属性算法(设置了短横线前缀标志)的结果为参数,调用 getPropertyValue() 的结果。

    设置webkit 驼峰命名属性必须以针对webkit 驼峰命名属性运行IDL 属性转 CSS 属性算法(设置了短横线前缀标志)的结果为第一个参数,给定值作为第二个参数,无第三个参数,调用 setProperty()。任何抛出的异常必须被重新抛出。

    例如,如果用户代理支持 -webkit-transform 属性,将存在一个 webkitTransform IDL 属性。由于驼峰命名属性的规则,还会存在一个 WebkitTransform IDL 属性。

    对于每个作为支持的 CSS 属性的 CSS 属性 property(属性名称中没有“-” (U+002D) 的属性除外),以下部分接口适用,其中 带横线属性property 本身。

    partial interface CSSStyleDeclaration {
      [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString _dashed_attribute;
    };
    

    带横线属性在获取时,必须返回以 带横线属性 为参数调用 getPropertyValue() 的结果。

    设置带横线属性必须以 带横线属性 为第一个参数,给定值作为第二个参数,无第三个参数,调用 setProperty()。任何抛出的异常必须被重新抛出。

    例如,对于 font-size 属性,将存在一个 font-size IDL 属性。在 JavaScript 中,假设 element 是一个 HTML 元素,可以通过以下方式访问该属性:
    element.style['font-size'];

    针对 property(可选设置首字母小写标志)的CSS 属性转 IDL 属性算法如下:

    1. output 为空字符串。
    2. uppercase next 为未设置。
    3. 如果设置了首字母小写标志,从 property 中移除第一个字符。
    4. 对于 property 中的每个字符 c
      1. 如果 c 为“-” (U+002D),令 uppercase next 为设置。
      2. 否则,如果 uppercase next 为设置,令 uppercase next 为未设置,并将 c 转换为 ASCII 大写后追加到 output
      3. 否则,将 c 追加到 output
    5. 返回 output

    针对 attribute(可选设置短横线前缀标志)的IDL 属性转 CSS 属性算法如下:

    1. output 为空字符串。
    2. 如果设置了短横线前缀标志,将“-” (U+002D) 追加到 output
    3. 对于 attribute 中的每个字符 c
      1. 如果 c 在 U+0041 到 U+005A(ASCII 大写)范围内,追加“-” (U+002D) 并随后追加 c 转换为 ASCII 小写后的值到 output
      2. 否则,将 c 追加到 output
    4. 返回 output

    6.7. CSS 值

    6.7.1. 解析 CSS 值

    对于给定的 property解析 CSS 值 value 意味着遵循以下步骤

    1. list 为调用 解析组件值列表处理 value 所返回的值。
    2. 根据 CSS 规范中属性 property 的语法匹配 list
    3. 如果上述步骤失败,则返回 null。
    4. 返回 list

    注:!important”声明不属于属性值空间,因此会导致解析 CSS 值返回 null。

    6.7.2. 序列化 CSS 值

    序列化 CSS 值(对于 CSS 声明 declaration 或长写 CSS 声明列表 list),请遵循以下规则

    1. 如果此算法在调用时传入了列表 list

      1. shorthand首选顺序中第一个完全映射到 list 中所有长写属性的缩写属性。

      2. 如果不存在此类缩写,或者 shorthand 无法精确表示 list 中所有属性的值,则返回空字符串。

      3. 否则,从假设的属性 shorthand 声明(其值代表 list 中声明的组合值)中序列化 CSS 值

    2. declaration 的值表示为 CSS 组件值列表 components,该列表在根据属性语法解析后将表示该值。此外

      • 如果某些组件值可以在不改变含义的情况下以任何顺序出现(这种模式通常在值语法中由双竖线 || 表示),则重新排列组件值,以使用属性定义表中给出的组件规范顺序。

      • 如果组件值可以在不改变含义的情况下省略或替换为更短的表示形式,则省略/替换它们。

      • 如果上述任何句法转换会导致向后兼容性变差,则不要执行它们。

      注:此处描述的规则概述了序列化的一般原则。出于遗留原因,某些属性以不同方式进行序列化,由于资源不足,此处故意未予定义。请咨询当地的逆向工程人员获取详细信息。

    3. components 中移除任何 <whitespace-token>

    4. components 中的每个组件值替换为调用序列化 CSS 组件值的结果。

    5. components 的各项合并为一个字符串,并在每对项目之间插入“ ” (U+0020 SPACE),除非第二项是“,” (U+002C COMMA)。返回结果。

    序列化 CSS 组件值,取决于该组件,具体如下

    关键字
    关键字转换为 ASCII 小写
    <angle>(角度)
    <number> 组件按 <number> 序列化,后跟规范形式的单位(定义在其各自规范中)。

    可能应该区分指定值和计算值/已解析值。

    <color>(颜色)
    如果 <color> 是已解析值的组件,请参阅 CSS Color 4 § 4.6 解析 <color> 值

    如果 <color> 是计算值的组件,请参阅 CSS Color 4 § 4.7 序列化 <color> 值

    如果 <color> 是指定值的组件,则按以下方式返回颜色

    1. 如果颜色是由作者明确指定的,则返回原始的、作者指定的颜色值。
    2. 否则,返回如果该颜色是计算值的组件时所返回的值。

    作者指定的值是否应进行大小写规范化,与计算值相同?还是应该保留原始大小写?

    <alphavalue>
    如果该值在内部表示为 0 到 255 之间的整数(即 8 位无符号整数),请执行以下步骤
    1. alpha 为给定的整数。
    2. 如果存在一个 0 到 100 之间的整数,乘以 2.55 并四舍五入到最接近的整数后(如果两个值同样接近则向上取整)等于 alpha,则令 rounded 为该整数除以 100。
    3. 否则,令 roundedalpha 除以 0.255 四舍五入到最接近的整数(如果两个值同样接近则向上取整),再除以 1000。
    4. 返回将 rounded 序列化为 <number> 的结果。

    否则,返回将给定值序列化为 <number> 的结果。

    <counter>
    以下算法的返回值
    1. s 为空字符串。
    2. 如果 <counter> 有三个 CSS 组件值,将字符串“counters(”追加到 s
    3. 如果 <counter> 有两个 CSS 组件值,将字符串“counter(”追加到 s
    4. list 为属于 <counter> 的 CSS 组件值列表,如果最后一个 CSS 组件值是“decimal”则将其省略。
    5. list 中的每个项目为对该项目调用序列化 CSS 组件值的结果。
    6. 将对 list 调用序列化逗号分隔列表的结果追加到 s
    7. 将“)” (U+0029) 追加到 s
    8. 返回 s
    <frequency>(频率)
    <number> 组件按 <number> 序列化,后跟规范形式的单位(定义在其各自规范中)。

    可能应该区分指定值和计算值/已解析值。

    <identifier>
    标识符序列化为标识符
    <integer>(整数)
    使用十进制数字 0-9 (U+0030 到 U+0039) 的最简形式,负数前缀“-” (U+002D)。
    <length>(长度)
    <number> 组件按 <number> 序列化,后跟规范形式的单位(定义在其各自规范中)。

    可能应该区分指定值和计算值/已解析值。

    <number>(数字)
    使用十进制数字 0-9 (U+0030 到 U+0039) 的最简形式,使用“.”分隔小数(如果有),必要时四舍五入以确保不超过 6 位小数,负数前缀“-” (U+002D)。

    注:不使用科学计数法。

    <percentage>(百分比)
    <number> 组件按 <number> 序列化,后跟字面量字符串“%” (U+0025)。
    <resolution>
    CSS 像素的解析度按 <number> 序列化,后跟字面量字符串“dppx”。
    <ratio>
    分子按 <number> 序列化,后跟字面量字符串“ / ”,后跟分母按 <number> 序列化。
    <shape>
    以下算法的返回值
    1. s 为字符串“rect(”。
    2. list 为属于 <shape> 的 CSS 组件值列表。
    3. list 中的每个项目为对该项目调用序列化 CSS 组件值的结果。
    4. 将对 list 调用序列化逗号分隔列表的结果追加到 s
    5. 将“)” (U+0029) 追加到 s
    6. 返回 s
    <string>
    <family-name>
    <specific-voice>
    字符串序列化为字符串
    <time>(时间)
    以秒为单位的时间按 <number> 序列化,后跟字面量字符串“s”。
    <url>
    绝对 URL 字符串序列化为 URL

    这应该区分指定值和计算值 <url>,参见 #3195

    <absolute-size>, <border-width>, <border-style>, <bottom>, <generic-family>, <generic-voice>, <left>, <margin-width>, <padding-width>, <relative-size>, <right> 和 <top> 在本规范中被视为宏。它们都代表上述组件的实例。

    一个想法是,我们可以通过将上述定义移动到定义这些 CSS 组件的草案中,在 CSS3/CSS4 的某个时间点移除本节。

    6.7.2.1. 示例

    以下是指定值在序列化前后的结果示例。前一列可能是作者在样式表中编写的内容,而后一列显示了查询 DOM 时将返回的内容。

    background: none background: rgba(0, 0, 0, 0)
    outline: none outline: invert
    border: none border: medium
    list-style: none list-style: disc
    margin: 0 1px 1px 1px margin: 0px 1px 1px
    azimuth: behind left azimuth: 220deg
    font-family: a, 'b"', serif font-family: "a", "b\"", serif
    content: url('h)i') '\[\]' content: url("h)i") "[]"
    azimuth: leftwards azimuth: leftwards
    color: rgb(18, 52, 86) color: #123456
    color: rgba(000001, 0, 0, 1) color: #000000

    其中一些需要根据新规则进行更新。

    7. DOM 对 CSS 声明块的访问

    7.1. ElementCSSInlineStyle 混入

    ElementCSSInlineStyle 混入提供了对元素内联样式属性的访问。

    interface mixin ElementCSSInlineStyle {
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    

    style 属性必须返回一个CSS 声明块对象,其计算标志未设置,父 CSS 规则为 null,且所有者节点上下文对象

    如果用户代理支持 HTML,则应用以下 IDL: [HTML]

    HTMLElement includes ElementCSSInlineStyle;
    

    如果用户代理支持 SVG,则应用以下 IDL: [SVG11]

    SVGElement includes ElementCSSInlineStyle;
    

    如果用户代理支持 MathML,则应用以下 IDL: [MathML-Core]

    MathMLElement includes ElementCSSInlineStyle;
    

    7.2. Window 接口的扩展

    partial interface Window {
      [NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional CSSOMString? pseudoElt);
    };
    

    getComputedStyle(elt, pseudoElt) 方法必须执行以下步骤

    1. docelt节点文档
    2. objelt
    3. 如果提供了 pseudoElt 且它不是空字符串,则
      1. 解析 pseudoElt<伪元素选择器>,并令 type 为结果。
      2. 如果 type 解析失败,或是 ::slotted()::part() 伪元素,则抛出一个 TypeError 异常。
      3. 否则,令 objelt 的给定伪元素。

      注:CSS2 伪元素应同时匹配双冒号和单冒号版本。也就是说,:before::before 都应匹配上述规则。

    4. decls 为空的 CSS 声明列表。
    5. 如果 elt连接的,属于平面树,且其包含 shadow 的根节点拥有一个浏览上下文,该上下文要么没有浏览上下文容器,要么其浏览上下文容器正在被渲染,则将 decls 设置为所有支持的 CSS 属性(按字典顺序),其值为针对 obj 使用与 doc 关联的样式规则计算出的解析值。此外,将所有自定义属性追加到 decls,其针对 obj计算值不是保证无效值

      有些 UA 处理缩写属性,所有 UA 都处理曾经是长写属性的缩写,如 overflow,参见 #2529

      自定义属性的顺序目前未定义,参见 #4947

    6. 返回一个具有以下属性的实时CSS 声明块
      计算标志
      设置。
      declarations
      decls.
      父 CSS 规则
      Null。
      所有者节点
      obj.

    getComputedStyle() 方法公开了源干净标志未设置的 CSS 样式表中的信息。

    getComputedStyle() 是否应该提供有用的序列化?参见 #1033

    8. 实用工具 API

    8.1. CSS.escape() 方法

    CSS 命名空间包含有用的、不属于其他地方的 CSS 相关函数。

    [Exposed=Window]
    namespace CSS {
      CSSOMString escape(CSSOMString ident);
    };
    

    这之前被指定为一个仅包含静态方法的 IDL 接口。切换到 IDL 命名空间几乎是相同的,因此预计不会有任何兼容性问题。如果发现任何问题,请报告以便我们考虑撤销此更改。

    escape(ident) 操作必须返回对 ident 调用序列化标识符的结果。

    例如,要序列化一个字符串以用作选择器的一部分,可以使用 escape() 方法
    var element = document.querySelector('#' + CSS.escape(id) + ' > img');
    escape() 方法也可用于转义字符串,尽管它会转义那些并非严格需要转义的字符。
    var element = document.querySelector('a[href="#' + CSS.escape(fragment) + '"]');

    CSS 命名空间上定义操作并希望存储某些状态的规范,应将状态存储在当前全局对象关联 Document 上。

    9. 解析值

    getComputedStyle() 历史上被定义为返回元素或伪元素的“计算值”。然而,“计算值”的概念在 CSS 的修订版之间发生了变化,而 getComputedStyle() 的实现为了与已部署的脚本兼容,必须保持不变。为了解决这个问题,本规范引入了解析值的概念。

    给定长写属性的解析值可以确定如下

    background-color
    border-block-end-color
    border-block-start-color
    border-bottom-color
    border-inline-end-color
    border-inline-start-color
    border-left-color
    border-right-color
    border-top-color
    box-shadow
    caret-color
    color
    outline-color
    在其他规范中定义的解析值特殊情况属性(如 color
    解析值使用值
    line-height
    如果计算值normal,则解析值normal,否则为使用值
    block-size
    height
    inline-size
    margin-block-end
    margin-block-start
    margin-bottom
    margin-inline-end
    margin-inline-start
    margin-left
    margin-right
    margin-top
    padding-block-end
    padding-block-start
    padding-bottom
    padding-inline-end
    padding-inline-start
    padding-left
    padding-right
    padding-top
    width
    在其他规范中定义的解析值特殊情况属性(如 height
    如果该属性适用于元素或伪元素,且 display 属性的解析值不为 nonecontents,则解析值使用值。否则解析值计算值
    bottom
    left
    inset-block-end
    inset-block-start
    inset-inline-end
    inset-inline-start
    right
    top
    在其他规范中定义的解析值特殊情况属性(如 top
    如果该属性适用于定位元素,且 display 属性的解析值不为 nonecontents,且属性未过度约束,则解析值使用值。否则解析值计算值
    在其他规范中定义的解析值特殊情况属性
    按相关规范定义。
    任何其他属性
    解析值计算值

    10. IANA Considerations

    10.1. Default-Style

    本节描述用于在永久消息头域注册表中注册的头域。

    头字段名称
    Default-Style
    适用协议
    http
    状态
    标准
    作者/变更控制者
    W3C
    规范文档
    本文档是相关的规范。
    相关信息
    无。

    11. 变更历史

    本节记录了本规范各出版版本之间的一些变更。本节并不详尽。错误修复和编辑性更改通常不列出。

    11.1. 2016 年 3 月 17 日之后的变更

    11.2. 2013 年 12 月 5 日之后的变更

    11.3. 2011 年 7 月 12 日至 2013 年 12 月 5 日之间的变更

    12. 安全与隐私考虑

    本规范未报告任何新的安全或隐私考虑。

    13. 致谢

    编辑们感谢 Alexey Feldgendler, Benjamin Poulain, Björn Höhrmann, Boris Zbasky, Brian Kardell, Chris Dumez, Christian Krebs, Daniel Glazman, David Baron, Domenic Denicola, Dominique Hazael-Massieux, fantasai, Hallvord R. M. Steen, Ian Hickson, John Daggett, Lachlan Hunt, Mike Sherov, Myles C. Maxfield, Morten Stenshorne, Ms2ger, Nazım Can Altınova, Øyvind Stenhaug, Peter Sloetjes, Philip Jägenstedt, Philip Taylor, Richard Gibson, Robert O’Callahan, Simon Sapin, Sjoerd Visscher, Sylvain Galineau, Tarquin Wilton-Jones, Xidorn Quan 和 Zack Weinberg 为本规范做出的贡献。

    特别感谢 Ian Hickson 编写了替代样式表 API 的初始版本以及 CSS 值的规范化(现为序列化)规则。

  • 一致性

    文档约定

    一致性要求通过描述性断言和 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"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

    一致性类别

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

    样式表
    一份 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 邮件列表。

    索引

    本规范定义的术语

    通过引用定义的术语

    引用

    规范性引用

    [CSS-ANIMATIONS-1]
    Dean Jackson; et al. CSS 动画 Level 1. 2018 年 10 月 11 日. WD. URL: https://w3org.cn/TR/css-animations-1/
    [CSS-BACKGROUNDS-3]
    Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://w3org.cn/TR/css-backgrounds-3/
    [CSS-BOX-4]
    Elika Etemad. CSS 盒模型模块 Level 4. 2020年4月21日. WD. URL: https://w3org.cn/TR/css-box-4/
    [CSS-CASCADE-5]
    Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 层叠与继承第 5 级. 2021 年 6 月 8 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-cascade-5/
    [CSS-COLOR-3]
    Tantek Çelik; Chris Lilley; David Baron. CSS 颜色模块第 3 级. 2018 年 6 月 19 日. 推荐标准 (REC). URL: https://w3org.cn/TR/css-color-3/
    [CSS-COLOR-4]
    Tab Atkins Jr.; Chris Lilley. CSS 颜色模块第 4 级. 2021 年 6 月 1 日. WD. URL: https://w3org.cn/TR/css-color-4/
    [CSS-COUNTER-STYLES-3]
    Tab Atkins Jr.. CSS Counter Styles Level 3. 2021年7月27日. CR. URL: https://w3org.cn/TR/css-counter-styles-3/
    [CSS-DEVICE-ADAPT-1]
    Rune Lillesveen; Florian Rivoal; Matt Rakow. CSS 设备适配模块第 1 级. 2016 年 3 月 29 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-device-adapt-1/
    [CSS-DISPLAY-3]
    Tab Atkins Jr.; Elika Etemad. CSS 显示模块第 3 级. 2020 年 12 月 18 日. 候选推荐标准 (CR). URL: https://w3org.cn/TR/css-display-3/
    [CSS-FONTS-4]
    John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 级. 2021 年 7 月 29 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-fonts-4/
    [CSS-LISTS-3]
    Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://w3org.cn/TR/css-lists-3/
    [CSS-LOGICAL-1]
    Rossen Atanassov; Elika Etemad. CSS Logical Properties and Values Level 1. 2018年8月27日. WD. URL: https://w3org.cn/TR/css-logical-1/
    [CSS-NAMESPACES-3]
    Elika Etemad. CSS 命名空间模块 Level 3。2014 年 3 月 20 日。REC。URL: https://w3org.cn/TR/css-namespaces-3/
    [CSS-NESTING-1]
    CSS 嵌套模块第 1 级 URL: https://w3org.cn/TR/css-nesting-1/
    [CSS-OVERFLOW-3]
    David Baron; Elika Etemad; Florian Rivoal. CSS 溢出模块第 3 级. 2020 年 6 月 3 日. WD. URL: https://w3org.cn/TR/css-overflow-3/
    [CSS-POSITION-3]
    Elika Etemad; et al. CSS 定位布局模块第 3 级. 2020 年 5 月 19 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-position-3/
    [CSS-SCOPING-1]
    Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014年4月3日. WD. URL: https://w3org.cn/TR/css-scoping-1/
    [CSS-SHADOW-PARTS-1]
    Tab Atkins Jr.; Fergal Daly. CSS 影子部分. 2018 年 11 月 15 日. WD. URL: https://w3org.cn/TR/css-shadow-parts-1/
    [CSS-SIZING-3]
    Tab Atkins Jr.; Elika Etemad. CSS 盒模型尺寸模块第 3 级. 2021 年 3 月 17 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-sizing-3/
    [CSS-UI-3]
    Tantek Çelik; Florian Rivoal. CSS 基础用户界面模块 Level 3 (CSS3 UI)。2018 年 6 月 21 日。REC。URL: https://w3org.cn/TR/css-ui-3/
    [CSS-VALUES-4]
    Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 4 级. 2021 年 7 月 15 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-values-4/
    [CSS-VARIABLES-1]
    Tab Atkins Jr.. CSS 层叠变量自定义属性模块第 1 级. 2015 年 12 月 3 日. 候选推荐标准 (CR). URL: https://w3org.cn/TR/css-variables-1/
    [CSS21]
    Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS21/
    [CSS3-CONDITIONAL]
    David Baron; Elika Etemad; Chris Lilley. CSS 条件规则模块第 3 级. 2020 年 12 月 8 日. 候选推荐标准 (CR). URL: https://w3org.cn/TR/css-conditional-3/
    [CSS3CASCADE]
    Elika Etemad; Tab Atkins Jr.. CSS 层叠和继承第 3 级. 2021 年 2 月 11 日. REC. URL: https://w3org.cn/TR/css-cascade-3/
    [CSS3PAGE]
    Elika Etemad; Simon Sapin. CSS 分页媒体模块 Level 3. 2018 年 10 月 18 日. WD. URL: https://w3org.cn/TR/css-page-3/
    [CSS3SYN]
    Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 16 July 2019. CR. URL: https://w3org.cn/TR/css-syntax-3/
    [DOM]
    Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
    [ENCODING]
    Anne van Kesteren. 编码标准. Living Standard. URL: https://encoding.spec.whatwg.org/
    [FETCH]
    Anne van Kesteren. 提取标准 (Fetch Standard). 生活标准. URL: https://fetch.spec.whatwg.org/
    [HTML]
    Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.whatwg.cn/multipage/
    [INFRA]
    Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
    [MEDIAQUERIES]
    Florian Rivoal; Tab Atkins Jr.. 媒体查询第 4 级. 2020 年 7 月 21 日. 候选推荐标准 (CR). URL: https://w3org.cn/TR/mediaqueries-4/
    [MEDIAQUERIES-5]
    Dean Jackson; Florian Rivoal; Tab Atkins Jr.. 媒体查询第 5 级. 2020 年 7 月 31 日. 工作草案 (WD). URL: https://w3org.cn/TR/mediaqueries-5/
    [RFC2119]
    S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
    [SELECTORS-3]
    Tantek Çelik; et al. 选择器第 3 级. 2018 年 11 月 6 日. REC. URL: https://w3org.cn/TR/selectors-3/
    [SELECTORS-4]
    Elika Etemad; Tab Atkins Jr.. 选择器 Level 4. 2018 年 11 月 21 日. WD. URL: https://w3org.cn/TR/selectors-4/
    [SVG2]
    Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://w3org.cn/TR/SVG2/
    [URL]
    Anne van Kesteren. URL 标准. 生活标准. URL: https://url.spec.whatwg.org/
    [WebIDL]
    Boris Zbarsky. Web IDL. 2016 年 12 月 15 日. 编辑草案 (ED). URL: https://heycam.github.io/webidl/
    [XML]
    Tim Bray; et al. 可扩展标记语言 (XML) 1.0 (第五版). 2008年11月26日. REC. URL: https://w3org.cn/TR/xml/
    [XML-STYLESHEET]
    James Clark; Simon Pieters; Henry Thompson. 将样式表与 XML 文档关联 1.0(第二版)。2010 年 10 月 28 日。推荐标准 (REC)。URL: https://w3org.cn/TR/xml-stylesheet/

    参考资料

    [COMPAT]
    Mike Taylor. 兼容性标准. 活标准 (Living Standard). URL: https://compat.spec.whatwg.org/
    [CSS-FONTS-5]
    Myles Maxfield; Chris Lilley. CSS 字体模块第 5 级. 2021 年 7 月 29 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-fonts-5/
    [MathML-Core]
    David Carlisle; Frédéric Wang. MathML 核心. 2021 年. 编辑草案 (ED). URL: https://w3c.github.io/mathml-core/
    [SVG11]
    Erik Dahlström; et al. 可缩放矢量图形 (SVG) 1.1 (第二版). 2011 年 8 月 16 日. REC. URL: https://w3org.cn/TR/SVG11/

    IDL 索引

    [Exposed=Window]
    interface MediaList {
      stringifier attribute [LegacyNullToEmptyString] CSSOMString mediaText;
      readonly attribute unsigned long length;
      getter CSSOMString? item(unsigned long index);
      undefined appendMedium(CSSOMString medium);
      undefined deleteMedium(CSSOMString medium);
    };
    
    [Exposed=Window]
    interface StyleSheet {
      readonly attribute CSSOMString type;
      readonly attribute USVString? href;
      readonly attribute (Element or ProcessingInstruction)? ownerNode;
      readonly attribute CSSStyleSheet? parentStyleSheet;
      readonly attribute DOMString? title;
      [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
      attribute boolean disabled;
    };
    
    [Exposed=Window]
    interface CSSStyleSheet : StyleSheet {
      constructor(optional CSSStyleSheetInit options = {});
    
      readonly attribute CSSRule? ownerRule;
      [SameObject] readonly attribute CSSRuleList cssRules;
      unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
      undefined deleteRule(unsigned long index);
    
      Promise<CSSStyleSheet> replace(USVString text);
      undefined replaceSync(USVString text);
    };
    
    dictionary CSSStyleSheetInit {
      DOMString baseURL = null;
      (MediaList or DOMString) media = "";
      boolean disabled = false;
    };
    
    partial interface CSSStyleSheet {
      [SameObject] readonly attribute CSSRuleList rules;
      long addRule(optional DOMString selector = "undefined", optional DOMString style = "undefined", optional unsigned long index);
      undefined removeRule(optional unsigned long index = 0);
    };
    
    [Exposed=Window]
    interface StyleSheetList {
      getter CSSStyleSheet? item(unsigned long index);
      readonly attribute unsigned long length;
    };
    
    partial interface mixin DocumentOrShadowRoot {
      [SameObject] readonly attribute StyleSheetList styleSheets;
      attribute ObservableArray<CSSStyleSheet> adoptedStyleSheets;
    };
    
    interface mixin LinkStyle {
      readonly attribute CSSStyleSheet? sheet;
    };
    
    ProcessingInstruction includes LinkStyle;
    [Exposed=Window]
    interface CSSRuleList {
      getter CSSRule? item(unsigned long index);
      readonly attribute unsigned long length;
    };
    
    [Exposed=Window]
    interface CSSRule {
      attribute CSSOMString cssText;
      readonly attribute CSSRule? parentRule;
      readonly attribute CSSStyleSheet? parentStyleSheet;
    
      // the following attribute and constants are historical
      readonly attribute unsigned short type;
      const unsigned short STYLE_RULE = 1;
      const unsigned short CHARSET_RULE = 2;
      const unsigned short IMPORT_RULE = 3;
      const unsigned short MEDIA_RULE = 4;
      const unsigned short FONT_FACE_RULE = 5;
      const unsigned short PAGE_RULE = 6;
      const unsigned short MARGIN_RULE = 9;
      const unsigned short NAMESPACE_RULE = 10;
    };
    
    [Exposed=Window]
    interface CSSStyleRule : CSSRule {
      attribute CSSOMString selectorText;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    
    [Exposed=Window]
    interface CSSImportRule : CSSRule {
      readonly attribute USVString href;
      [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
      [SameObject] readonly attribute CSSStyleSheet styleSheet;
    };
    
    [Exposed=Window]
    interface CSSGroupingRule : CSSRule {
      [SameObject] readonly attribute CSSRuleList cssRules;
      unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
      undefined deleteRule(unsigned long index);
    };
    
    [Exposed=Window]
    interface CSSPageRule : CSSGroupingRule {
               attribute CSSOMString selectorText;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    
    [Exposed=Window]
    interface CSSMarginRule : CSSRule {
      readonly attribute CSSOMString name;
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    
    [Exposed=Window]
    interface CSSNamespaceRule : CSSRule {
      readonly attribute CSSOMString namespaceURI;
      readonly attribute CSSOMString prefix;
    };
    
    [Exposed=Window]
    interface CSSStyleDeclaration {
      [CEReactions] attribute CSSOMString cssText;
      readonly attribute unsigned long length;
      getter CSSOMString item(unsigned long index);
      CSSOMString getPropertyValue(CSSOMString property);
      CSSOMString getPropertyPriority(CSSOMString property);
      [CEReactions] undefined setProperty(CSSOMString property, [LegacyNullToEmptyString] CSSOMString value, optional [LegacyNullToEmptyString] CSSOMString priority = "");
      [CEReactions] CSSOMString removeProperty(CSSOMString property);
      readonly attribute CSSRule? parentRule;
      [CEReactions] attribute [LegacyNullToEmptyString] CSSOMString cssFloat;
    };
    
    interface mixin ElementCSSInlineStyle {
      [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
    };
    
    HTMLElement includes ElementCSSInlineStyle;
    
    SVGElement includes ElementCSSInlineStyle;
    
    MathMLElement includes ElementCSSInlineStyle;
    
    partial interface Window {
      [NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional CSSOMString? pseudoElt);
    };
    
    [Exposed=Window]
    namespace CSS {
      CSSOMString escape(CSSOMString ident);
    };
    
    

    问题索引

    这应该基于映射到序列化 CSS 值来完成,因为媒体特性最终是由 CSS 值定义的。
    更具体点
    此时有文档存在吗?
    如果 HTML 解析器尚未确定怪异/非怪异模式怎么办?
    需要定义 CSSFontFaceRule 描述符值如何序列化。
    需要定义 CSSPageRule 如何序列化。
    “缩进两个空格”符合浏览器做法,但仍需完善,参见 #5494
    需要定义 解析 CSS 页面选择器列表序列化 CSS 页面选择器列表 的规则。
    我们是否应添加类似“任何可观察的副作用都不得在 声明 之外产生”的内容?当前的限制听起来像是未定义行为的漏洞。
    可能应该区分指定值和计算值/解析值。
    作者指定的值是否应该像计算值一样进行大小写标准化?还是应该保留原始大小写?
    可能应该区分指定值和计算值/解析值。
    可能应该区分指定值和计算值/解析值。
    这应该区分指定的和计算的 <url> 值,参见 #3195
    一个想法是,我们可以通过将上述定义移动到定义 CSS 组件的草案中,在 CSS3/CSS4 时间轴上的某个位置删除本节。
    其中一些需要根据新规则进行更新。
    有些 UA 处理简写,且所有 UA 都处理曾经是长写属性的简写,例如 overflow,参见 #2529
    自定义属性的顺序目前未定义,参见 #4947
    getComputedStyle() 是否应该提供有用的序列化?参见 #1033
    这之前被指定为一个仅包含静态方法的 IDL 接口。切换到 IDL 命名空间 *几乎* 是相同的,因此预计不会有任何兼容性问题。如果发现任何问题,请报告,以便我们考虑撤销此项更改。