1. 引言
本文档正式规范了 CSS 对象模型 (CSSOM) 的核心功能。CSSOM 规范家族中的其他文档以及其他与 CSS 相关的规范定义了这些核心功能的扩展。
CSSOM 的核心功能旨在为作者定义的脚本提供基本能力,以允许访问和操作样式相关的状态信息和过程。
下面定义的功能从根本上基于 W3C DOM 工作组之前的规范,主要是 [DOM]。本文档的目的是 (1) 通过提供更详细的技术说明(以提高可测试性和互操作性)来改进之前的工作,(2) 弃用或删除某些在该上下文中不再被认为是必要的、实现度较低的功能,以及 (3) 新定义某些已经或预期会被广泛实现的功能。
2. 术语
本规范采用了以下文档中的术语:DOM、HTML、CSS Syntax、Encoding、URL、Fetch、Associating Style Sheets with XML documents 和 XML。[DOM] [HTML] [CSS3SYN] [ENCODING] [URL] [FETCH] [XML-STYLESHEET] [XML]
当本规范提到对象 A 且 A 实际上是一个接口时,通常指实现该接口 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)。
若要序列化一个标识符,意味着创建一个字符串,该字符串通过连接标识符的每个字符生成:
- 如果该字符是 NULL (U+0000),则使用替换字符 (U+FFFD)。
- 如果该字符在 [\1-\1f] (U+0001 到 U+001F) 范围内或为 U+007F,则将该字符作为码点转义。
- 如果该字符是第一个字符且在 [0-9] (U+0030 到 U+0039) 范围内,则将该字符作为码点转义。
- 如果该字符是第二个字符且在 [0-9] (U+0030 到 U+0039) 范围内,且第一个字符是 "
-" (U+002D),则将该字符作为码点转义。 - 如果该字符是第一个字符且为 "
-" (U+002D),且没有第二个字符,则使用转义后的字符。 - 如果该字符不符合上述规则,且大于或等于 U+0080,或者是 "
-" (U+002D) 或 "_" (U+005F),或者是 [0-9] (U+0030 到 U+0039)、[A-Z] (U+0041 到 U+005A) 或 [a-z] (U+0061 到 U+007A) 范围之一,则使用字符本身。 - 否则,使用转义后的字符。
若要序列化一个字符串,意味着创建一个由 '"' (U+0022) 开头,后跟应用下述规则于给定字符串的每个字符后的结果,最后以 '"' (U+0022) 结尾的字符串:
- 如果该字符是 NULL (U+0000),则使用替换字符 (U+FFFD)。
- 如果该字符在 [\1-\1f] (U+0001 到 U+001F) 范围内或为 U+007F,将该字符作为码点转义。
- 如果该字符是 '"' (U+0022) 或 "
\" (U+005C),使用转义后的字符。 - 否则,使用字符本身。
注:"'" (U+0027) 不会被转义,因为字符串总是用 '"' (U+0022) 序列化。
若要序列化一个 URL,意味着创建一个由 "url(" 开头,后跟 URL 作为字符串的序列化,最后以 ")" 结尾的字符串。
若要序列化一个 LOCAL,意味着创建一个由 "local(" 开头,后跟 LOCAL 作为字符串的序列化,最后以 ")" 结尾的字符串。
若要序列化逗号分隔列表,应按列表顺序连接所有项目,并用 ", "(即逗号 (U+002C) 后跟一个空格 (U+0020))进行分隔。
若要序列化空白分隔列表,应按列表顺序连接所有项目,并用 " "(即一个空格 (U+0020))进行分隔。
注:根据上述规则序列化列表时,不会在第一项之前或最后一项之后插入多余的空格。除非另有说明,空列表将序列化为空字符串。
3. CSSOMString
CSSOM 接口中的大多数字符串使用 CSSOMString 类型。每个实现均可选择将其定义为 USVString 或 DOMString。
typedef USVString CSSOMString ;
或者,
typedef DOMString CSSOMString ;
DOMString 将保留它们,而 USVString 会将它们替换为 U+FFFD 替换字符。这一选择实际上允许实现执行此替换,但并不强制要求。
使用 USVString 使得实现能够在内存中内部使用 UTF-8 来表示字符串。由于格式良好的 UTF-8 明确禁止代理码点,因此实际上要求执行此替换。
另一方面,将字符串内部表示为 16 位代码单元的实现可能更倾向于避免进行这种替换的成本。
4. 媒体查询
媒体查询由 [MEDIAQUERIES] 定义。本节定义了围绕媒体查询的各种概念,包括其 API 和序列化形式。
4.1. 解析媒体查询
若要解析一个媒体查询列表(将给定字符串 s 解析为媒体查询列表),其定义在媒体查询规范中。返回由该算法定义的媒体查询列表。
注:最终被“忽略”的媒体查询将变为“not all”。
若要解析一个媒体查询(对于给定字符串 s),意味着遵循解析媒体查询列表的步骤,如果返回多个媒体查询,则返回 null,如果返回单个媒体查询,则返回该媒体查询。
注:同样,最终被“忽略”的媒体查询将变为“not all”。
4.2. 序列化媒体查询
若要序列化一个媒体查询列表,请执行以下步骤:
若要序列化一个媒体查询,设 s 为空字符串,并运行以下步骤:
- 如果该媒体查询被否定,则在 s 中追加 "
not" 后跟一个空格 (U+0020)。 - 设 type 为该媒体查询的媒体类型的标识符序列化,并转换为 ASCII 小写。
- 如果该媒体查询不包含媒体特性,则将 type 追加到 s 并返回 s。
- 如果 type 不为 "
all" 或该媒体查询被否定,则在 s 中追加 type,后跟一个空格 (U+0020),后跟 "and",再后跟一个空格 (U+0020)。 - 然后,对于每个媒体特性:
- 在 s 中追加 "
(" (U+0028),后跟转换为 ASCII 小写的媒体特性名称。 - 如果提供了值,则在 s 中追加 "
:" (U+003A),后跟一个空格 (U+0020),后跟序列化后的媒体特性值。 - 在 s 中追加 "
)" (U+0029)。 - 如果这不是最后一个媒体特性,则在 s 中追加一个空格 (U+0020),后跟 "
and",再后跟一个空格 (U+0020)。
- 在 s 中追加 "
- 返回 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. 比较媒体查询
若要比较媒体查询 m1 和 m2,意味着将二者都进行序列化,如果它们是区分大小写的匹配,则返回 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 对象,请执行以下步骤:
- 创建一个新的
MediaList对象。 - 将其
mediaText属性设置为 text。 - 返回新创建的
MediaList对象。
mediaText 属性在获取时,必须返回媒体查询集合的序列化结果。设置 mediaText 属性时,必须执行以下步骤:
item(index) 方法必须返回媒体查询集合中由 index 给出的媒体查询的序列化;如果 index 大于或等于媒体查询集合中的媒体查询数量,则返回 null。
length 属性必须返回媒体查询集合中的媒体查询数量。
appendMedium(medium) 方法必须执行以下步骤:
deleteMedium(medium) 方法必须执行以下步骤:
- 设 m 为解析给定值的结果。
- 如果 m 为 null,则返回。
- 从媒体查询集合中移除任何与 m 进行比较返回 true 的媒体查询。如果没有移除任何内容,则抛出
NotFoundError异常。
5. 选择器
选择器定义在选择器规范中。本节主要定义如何序列化它们。
5.1. 解析选择器
若要解析一组选择器,意味着使用选择器规范中定义的 selectors_group 产生式解析该值,如果解析未失败则返回一组选择器,如果解析失败则返回 null。
5.2. 序列化选择器
若要序列化一组选择器,应序列化组中的每个选择器,然后序列化这些序列化结果的逗号分隔列表。
若要序列化一个选择器,设 s 为空字符串,为选择器链的每个部分运行以下步骤,最后返回 s:
- 如果复合选择器中只有一个简单选择器且为通用选择器,则将序列化通用选择器的结果追加到 s。
- 否则,对于复合选择器中不是通用选择器的每个简单选择器(其命名空间前缀映射到的命名空间不是默认命名空间),序列化简单选择器并将结果追加到 s。
- 如果这不是选择器链的最后一部分,则追加一个空格 (U+0020),后跟组合符 "
>"、"+"、"~"、">>"、"||"(视情况而定),如果该组合符不是空白,则再追加另一个空格 (U+0020) 到 s。 - 如果这是选择器链的最后一部分且存在伪元素,则将 "
::" 后跟伪元素名称追加到 s。
若要序列化一个简单选择器,设 s 为空字符串,运行以下步骤,最后返回 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)并返回结果。
- 若要给定
CSSStyleSheetInitoptions创建一个构造的CSSStyleSheet,运行以下步骤: -
- 构造一个新的
CSSStyleSheet对象 sheet。 - 将 sheet 的位置设置为当前全局对象的关联文档的基础 URL。
- 将 sheet 的样式表基础 URL 设置为 options 中的
baseURL属性值。 - 将 sheet 的父 CSS 样式表设置为 null。
- 将 sheet 的所有者节点设置为 null。
- 将 sheet 的所有者 CSS 规则设置为 null。
- 将 sheet 的标题设置为空字符串。
- 取消设置 sheet 的替代标志。
- 设置 sheet 的源纯净标志。
- 设置 sheet 的构造标志。
- 将 sheet 的构造文档设置为当前全局对象的关联文档。
- 如果 options 的
media属性是一个字符串,则从该字符串创建MediaList对象并将其指派为 sheet 的媒体。否则,从该属性序列化媒体查询列表,然后从产生的字符串创建MediaList对象并将其设置为 sheet 的媒体。 - 如果 options 的
disabled属性为 true,则设置 sheet 的禁用标志。 - 返回 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>如果此属性指定为所有者节点的一个属性,则标题必须设置为该属性的值。每当属性被设置、更改或移除时,标题必须设置为该属性的新值,如果属性缺失则设置为空字符串。
- 替代标志
- 创建时指定。要么设置,要么取消设置。默认为取消设置。
- 禁用标志
- 要么设置,要么取消设置。默认为取消设置。
注:即使在取消设置时,也不一定意味着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 = 0);index 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 属性必须遵循以下步骤:
- 如果源纯净标志被取消设置,抛出
SecurityError异常。 - 返回一个只读的、实时的
CSSRuleList对象,表示CSS 规则。注:尽管返回的
CSSRuleList对象(从客户端脚本的角度来看)是只读的,但由于其实时状态,它仍然可以随时间改变。例如,调用insertRule()或deleteRule()方法可能会导致返回的对象中反映出突变。
insertRule(rule, index) 方法必须执行以下步骤:
- 如果源纯净标志被取消设置,抛出
SecurityError异常。 - 如果设置了禁止修改标志,则抛出
NotAllowedErrorDOMException。 - 设 parsed rule 为调用解析规则(参数为 rule)的返回值。
- 如果 parsed rule 是一个语法错误,则返回该语法错误。
- 如果 parsed rule 是一个 @import 规则,且设置了构造标志,则抛出
SyntaxErrorDOMException。 - 返回调用在CSS 规则处(索引为 index)插入 CSS 规则 rule 的结果。
deleteRule(index) 方法必须执行以下步骤:
- 如果源纯净标志被取消设置,抛出
SecurityError异常。 - 如果设置了禁止修改标志,则抛出
NotAllowedErrorDOMException。 - 在CSS 规则处(索引为 index)移除 CSS 规则。
replace(text) 方法必须执行以下步骤:
- 设 promise 为一个 promise。
- 如果未设置构造标志,或者设置了禁止修改标志,则用
NotAllowedErrorDOMException拒绝 promise 并返回 promise。 - 设置禁止修改标志。
-
并行执行以下步骤:
- 设 rules 为从 text 解析规则列表的结果。如果 rules 不是规则列表(即解析期间发生错误),则将 rules 设置为空列表。
- 如果 rules 包含一个或多个 @import 规则,从 rules 中移除这些规则。
- 将 sheet 的CSS 规则设置为 rules。
- 取消设置 sheet 的禁止修改标志。
- 用 sheet 解析 promise。
- 返回 promise。
replaceSync(text) 方法必须对该 CSSStyleSheet 执行同步替换 CSSStyleSheet 规则的步骤(给定 text)。
若要对 sheet同步替换 CSSStyleSheet 规则(给定 text),运行以下步骤:
- 如果未设置构造标志,或者设置了禁止修改标志,则抛出
NotAllowedErrorDOMException。 - 设 rules 为从 text 解析规则列表的结果。如果 rules 不是规则列表,则将 rules 设置为空列表。
- 如果 rules 包含一个或多个 @import 规则,从 rules 中移除这些规则。
- 将 sheet 的CSS 规则设置为 rules。
6.1.2.1. 已弃用的 CSSStyleSheet 成员
注:这些成员是为与现有站点兼容而必需的。
partial interface CSSStyleSheet { [SameObject ]readonly attribute CSSRuleList rules ;long addRule (optional DOMString = "undefined",selector optional DOMString = "undefined",style optional unsigned long );index undefined removeRule (optional unsigned long = 0); };index
rules 属性必须遵循与 cssRules 相同的步骤,并返回 cssRules 本应返回的相同对象。
removeRule(index) 方法必须执行与 deleteRule() 相同的步骤。
addRule(selector, block, optionalIndex) 方法必须执行以下步骤:
- 设 rule 为空字符串。
- 将 selector 追加到 rule。
- 将
" { "追加到 rule。 - 如果 block 不为空,则将 block 后跟空格追加到 rule。
- 将
"}"追加到 rule。 - 设 index 为 optionalIndex(如果已提供),否则为样式表中CSS 规则的数量。
- 调用
insertRule(),并将 rule 和 index 作为参数。 - 返回
-1。
作者不应使用这些成员,而应使用并教授前文定义的标准 CSSStyleSheet 接口,该接口与 CSSGroupingRule 一致。
6.2. CSS 样式表集合
下面定义了与每个 DocumentOrShadowRoot 对象相关联的各种新概念。
每个 DocumentOrShadowRoot 都有一个关联的零个或多个CSS 样式表列表,名为文档或影子根 CSS 样式表。这是一个有序列表,包含:
- 任何由 HTTP
Link头部创建的CSS 样式表(按头部顺序)。 - 任何与
DocumentOrShadowRoot关联的CSS 样式表(按树顺序)。
每个 DocumentOrShadowRoot 都有一个关联的零个或多个CSS 样式表列表,名为最终 CSS 样式表。这是一个有序列表,包含:
- 文档或影子根 CSS 样式表。
DocumentOrShadowRoot的adoptedStyleSheets的底层列表的内容(按数组顺序)。
若要创建一个 CSS 样式表,运行以下步骤:
- 创建一个新的CSS 样式表对象并按指定设置其属性。
- 然后为新创建的CSS 样式表运行添加 CSS 样式表步骤。
如果源纯净标志被取消设置,这可能会暴露来自用户内网的信息。
若要添加一个 CSS 样式表,运行以下步骤:
- 将该CSS 样式表添加到文档或影子根 CSS 样式表列表的适当位置。其余步骤处理禁用标志。
- 如果已设置禁用标志,则返回。
- 如果标题不是空字符串,替代标志被取消设置,且首选 CSS 样式表集名称为空字符串,则更改首选 CSS 样式表集名称为该标题。
- 如果以下任何条件为真,则取消设置禁用标志并返回:
- 标题为空字符串。
- 上次使用的 CSS 样式表集名称为 null,且标题与首选 CSS 样式表集名称区分大小写匹配。
- 标题与上次使用的 CSS 样式表集名称区分大小写匹配。
- 设置禁用标志。
要移除 CSS 样式表,请执行以下步骤
持久 CSS 样式表是指来自文档或影子根 CSS 样式表中的一个 CSS 样式表,其标题为空字符串且其替代标志未设置。
CSS 样式表集是指来自文档或影子根 CSS 样式表的一个或多个 CSS 样式表组成的有序集合,它们具有相同且非空字符串的标题。
启用的 CSS 样式表集是指一个 CSS 样式表集,其中每个 CSS 样式表的禁用标志均未设置。
要启用名称为 name 的 CSS 样式表集,请执行以下步骤
- 如果 name 为空字符串,则为每个处于 CSS 样式表集中的 CSS 样式表设置禁用标志并返回。
- 取消设置每个处于 CSS 样式表集中的 CSS 样式表的禁用标志(其中该 CSS 样式表集名称与 name 区分大小写匹配),并为所有其他处于 CSS 样式表集中的 CSS 样式表设置该标志。
要选择名称为 name 的 CSS 样式表集,请执行以下步骤
- 启用名称为 name 的 CSS 样式表集。
- 将上次的 CSS 样式表集名称设为 name。
上次的 CSS 样式表集名称是一个用于确定最后选中了哪个 CSS 样式表集的概念。其初始值为 null。
首选 CSS 样式表集名称是一个用于确定哪些 CSS 样式表需要取消设置其禁用标志的概念。其初始值为空字符串。
要更改首选 CSS 样式表集名称为 name,请执行以下步骤
- 设 current 为首选 CSS 样式表集名称。
- 将首选 CSS 样式表集名称设为 name。
- 如果 name 与 current 不匹配(区分大小写)且上次的 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,给定 value 和 index 的设置索引值算法如下:
- 如果 value 的构造标志未设置,或其构造文档不等于此
DocumentOrShadowRoot的节点文档,则抛出 "NotAllowedError"DOMException。
6.3. 样式表关联
本节定义了 CSS 样式表的拥有节点必须实现的接口,并定义了当链接关系类型与 "stylesheet" 不区分大小写(ASCII)匹配时,对 xml-stylesheet 处理指令和 HTTP Link 标头的要求。
6.3.1. 获取 CSS 样式表
要获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer、文档 document 以及可选的参数集 parameters,后者用作创建请求的输入),请遵循以下步骤:
- 设 origin 为 document 的源。
- 设 request 为一个新的请求,包含 URL parsed URL、源 origin、引用者 referrer,以及如果指定了参数集 parameters,则一并传入。
- 设 response 为获取 request 的结果。
- 等待直到 response 可用。
- 如果 response 是网络错误,则返回错误。
- 如果 document 处于怪异模式,且 response 为同源(CORS-same-origin),且 response 的内容类型元数据不是受支持的样式语言,则将 response 的内容类型元数据更改为
text/css。 - 如果 response 不属于受支持的样式语言,则返回错误。
- 返回 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 成为序言的一部分、不再是序言的一部分或其数据发生更改时,必须执行以下步骤:
- 如果此算法的实例当前正在针对 node 运行,则中止该实例,并在适用时停止关联的获取。
- 如果 node 具有关联 CSS 样式表,则将其移除。
- 如果 node 不是 xml-stylesheet 处理指令,则返回。
- 如果 node 没有
href伪属性,则返回。 - 设 title 为
title伪属性的值,如果未指定title伪属性,则为空字符串。 - 如果存在一个
alternate伪属性,其值与 "yes" 区分大小写匹配,且 title 为空字符串,则返回。 - 如果存在一个
type伪属性,其值不是受支持的样式语言,用户代理可以选择返回。 - 设 input URL 为
href伪属性指定的值。 - 设 document 为 node 的节点文档。
- 设 base URL 为 document 的文档基础 URL。
- 设 referrer 为 document 的地址。
- 设 parsed URL 为调用 URL 解析器(使用字符串 input URL 和基础 URL base URL)的返回值。
- 如果 parsed URL 解析失败,则返回。
- 设 response 为获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer 和文档 document)的结果。
- 如果 response 为错误,则返回。
-
创建 CSS 样式表(具有以下属性):
- location (位置)
- 调用 URL 序列化器(使用 parsed URL)的结果。
- 父级 CSS 样式表
- null。
- 所有者节点
- node (节点).
- 所有者 CSS 规则
- null。
- media
media伪属性的值(如有),否则为空字符串。- title
- title.
- 替代标志
- 如果
alternate伪属性值与 "yes" 区分大小写匹配,则设置该项,否则取消设置。 - 源干净标志
- 如果 response 为同源(CORS-same-origin),则设置该项,否则取消设置。
CSS 环境编码是运行以下步骤的结果:
若在 Document 的 XML 解析器上下文中,通过本节规则使用 xml-stylesheet 处理指令引用的样式表,满足以下条件,则称其为阻塞脚本的样式表:该 ProcessingInstruction 节点是由该 Document 的解析器创建的;且节点由解析器创建时样式表已启用;且上次事件循环到达步骤 1 时,节点处于该 Document 中;且用户代理尚未放弃加载该特定样式表。用户代理可在任何时候放弃此类样式表。
6.3.5. 对实现 HTTP Link 标头的用户代理的要求
对于每个链接关系类型中包含与 "stylesheet" 不区分大小写(ASCII)匹配的 HTTP Link 标头,必须执行以下步骤:
- 设 title 为所有
title参数中第一个参数的值。如果没有此类参数,则为空字符串。 - 如果(其他)链接关系类型之一与 "
alternate" 不区分大小写(ASCII)匹配,且 title 为空字符串,则返回。 - 设 input URL 为指定的值。
- 设 base URL 为文档的文档基础 URL。
- 设 referrer 为文档的地址。
- 设 origin 为文档的源。
- 设 parsed URL 为调用 URL 解析器(使用字符串 input URL 和基础 URL base URL)的返回值。
- 如果 parsed URL 解析失败,则返回。
- 设 response 为获取 CSS 样式表(使用解析后的 URL parsed URL、引用者 referrer 和该文档)的结果。
-
创建 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 规则,请执行以下步骤
- 设 rule 为调用解析规则(使用 string)的返回值。
- 如果 rule 是语法错误,则返回 rule。
- 设 parsed rule 为根据相应 CSS 规范解析 rule 的结果,丢弃被认为应忽略的部分。如果整个样式规则被丢弃,则返回语法错误。
- 返回 parsed rule。
要序列化 CSS 规则,请根据 CSS 规则的类型执行以下操作之一:
CSSStyleRule- 返回执行以下步骤的结果:
- 设 s 初始为对规则关联选择器执行序列化选择器组的结果,后跟字符串 "
{"(即一个空格 (U+0020),后跟左花括号 (U+007B))。 - 设 decls 为对规则关联声明执行序列化 CSS 声明块的结果;若无此类声明,则为 null。
- 设 rules 为对规则
cssRules列表中的每个规则执行序列化 CSS 规则的结果;若无此类规则,则为 null。 - 如果 decls 和 rules 均为 null,则向 s 追加 " }"(即一个空格 (U+0020) 后跟右花括号 (U+007D))并返回 s。
- 如果 rules 为 null:
- 向 s 追加一个空格 (U+0020)。
- 向 s 追加 decls。
- 向 s 追加 " }"(即一个空格 (U+0020) 后跟右花括号 (U+007D))。
- 返回 s。
- 否则
- 如果 decls 不为 null,将其前置于 rules。
- 对于 rules 中的每个 rule:
- 向 s 追加一个换行符,后跟两个空格。
- 向 s 追加 rule。
- 向 s 追加一个换行符,后跟右花括号 (U+007D)。
- 返回 s。
- 设 s 初始为对规则关联选择器执行序列化选择器组的结果,后跟字符串 "
CSS导入规则- 连接以下内容的结果:
CSS媒体规则- 连接以下内容的结果:
- 字符串 "
@media",后跟一个空格 (U+0020)。 - 对规则媒体查询列表执行序列化媒体查询列表的结果。
- 一个空格 (U+0020),后跟字符串 "{"(即左花括号 (U+007B)),后跟一个换行符。
- 对规则
cssRules列表中的每个规则执行序列化 CSS 规则的结果,以换行符分隔并缩进两个空格。 - 一个换行符,后跟字符串 "}"(即右花括号 (U+007D))。
- 字符串 "
CSS字体规则- 连接以下内容的结果:
- 字符串 "
@font-face {",后跟一个空格 (U+0020)。 - 字符串 "
font-family:",后跟一个空格 (U+0020)。 - 对规则字体族名称执行序列化字符串的结果。
- 字符串 "
;",即分号 (U+003B)。 - 如果规则关联的源列表不为空,执行以下子步骤:
- 如果存在规则关联的 unicode-range 描述符,则为一个空格 (U+0020),后跟字符串 "
unicode-range:",后跟一个空格 (U+0020),后跟<'unicode-range'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 如果存在规则关联的 font-variant 描述符,则为一个空格 (U+0020),后跟字符串 "
font-variant:",后跟一个空格 (U+0020),后跟 <'font-variant'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 如果存在规则关联的 font-feature-settings 描述符,则为一个空格 (U+0020),后跟字符串 "
font-feature-settings:",后跟一个空格 (U+0020),后跟<'font-feature-settings'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 如果存在规则关联的 font-stretch 描述符,则为一个空格 (U+0020),后跟字符串 "
font-stretch:",后跟一个空格 (U+0020),后跟<'font-stretch'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 如果存在规则关联的 font-weight 描述符,则为一个空格 (U+0020),后跟字符串 "
font-weight:",后跟一个空格 (U+0020),后跟<'font-weight'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 如果存在规则关联的 font-style 描述符,则为一个空格 (U+0020),后跟字符串 "
font-style:",后跟一个空格 (U+0020),后跟<'font-style'> 序列化的结果,后跟字符串 ";"(即分号 (U+003B))。 - 一个空格 (U+0020),后跟字符串 "}"(即右花括号 (U+007D))。
需要定义
CSSFontFaceRule描述符的值是如何序列化的。 - 字符串 "
CSS页面规则-
需要定义
CSSPageRule是如何序列化的。 CSSNamespaceRule- 字面字符串 "
@namespace",后跟一个空格 (U+0020),后跟prefix属性(如有)的标识符序列化,后跟一个空格 (U+0020)(若存在前缀),后跟namespaceURI属性的 URL 序列化,后跟字符 ";" (U+003B)。 CSSKeyframesRule- 连接以下内容的结果:
- 字面字符串 "
@keyframes",后跟一个空格 (U+0020)。 name属性的标识符序列化。- 对规则
cssRules列表中的每个规则执行序列化 CSS 规则的结果,以换行符分隔并缩进两个空格。 - 一个换行符,后跟字符串 "}"(即右花括号 (U+007D))。
- 字面字符串 "
CSSKeyframeRule- 连接以下内容的结果:
keyText。- 字符串 "
{"(即一个空格 (U+0020),后跟左花括号 (U+007B))。 - 对规则关联声明执行序列化 CSS 声明块的结果。
- 如果规则关联有一个或多个声明,则为字符串 "
"(即一个空格 (U+0020))。 - 字符串 "
}",右花括号 (U+007D)。
“缩进两个空格”部分与浏览器行为一致,但仍需改进,详见 #5494
要将 CSS 规则 rule 插入到 CSS 规则列表 list 的索引 index 处,请执行以下步骤:
- 将 length 设为 list 中的项目数。
- 如果 index 大于 length,则抛出一个
IndexSizeError异常。 - 将 new rule 设为对参数 rule 执行解析 CSS 规则的结果。
- 如果 new rule 是语法错误,则抛出一个
SyntaxError异常。 - 如果由于 CSS 指定的约束,new rule 无法插入到 list 的零索引位置 index 处,则抛出一个
HierarchyRequestError异常。 [CSS21]注:例如,CSS 样式表不能在样式规则之后包含
@import@规则。 - 如果 new rule 是
@namespace@规则,且 list 包含除@import@规则和@namespace@规则以外的任何内容,则抛出一个InvalidStateError异常。 - 将 new rule 插入到 list 的零索引位置 index 处。
- 返回 index。
要从 CSS 规则列表 list 中移除索引 index 处的 CSS 规则,请执行以下步骤:
- 将 length 设为 list 中的项目数。
- 如果 index 大于或等于 length,则抛出一个
IndexSizeError异常。 - 将 old rule 设为 list 中的第 index 个项。
- 如果 old rule 是
@namespace@规则,且 list 包含除@import@规则和@namespace@规则以外的任何内容,则抛出一个InvalidStateError异常。 - 从 list 的零索引位置 index 处移除规则 old rule。
- 将 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) 方法必须返回集合中第 index 个 CSSRule 对象。如果集合中不存在第 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 historicalreadonly attribute unsigned short type ;const unsigned short = 1;STYLE_RULE const unsigned short = 2;CHARSET_RULE const unsigned short = 3;IMPORT_RULE const unsigned short = 4;MEDIA_RULE const unsigned short = 5;FONT_FACE_RULE const unsigned short = 6;PAGE_RULE const unsigned short = 9;MARGIN_RULE const unsigned short = 10; };NAMESPACE_RULE
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,它将返回类似 的字符串。
6.4.3. CSSStyleRule 接口
CSSStyleRule 接口表示样式规则。
[Exposed =Window ]interface :CSSStyleRule CSSRule {attribute CSSOMString selectorText ; [SameObject ,PutForwards =cssText ]readonly attribute CSSStyleDeclaration style ; };
selectorText 属性在获取时,必须返回序列化关联的选择器组的结果。设置 selectorText 属性时,必须执行以下步骤:
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 = 0);index 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 属性时,必须执行以下步骤:
- 对给定值运行解析 CSS 页面选择器列表算法。
- 如果算法返回非 null 值,则用返回的值替换关联的 CSS 页面选择器列表。
- 否则,如果算法返回 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 声明块,请执行以下步骤:
- 设 declarations 为调用解析声明列表(使用 string)的返回值。
- 设 parsed declarations 为一个新的空列表。
- 对于 declarations 中的每个项目 declaration,执行以下子步骤:
- 设 parsed declaration 为根据相应 CSS 规范解析 declaration 的结果,丢弃被认为应忽略的部分。如果整个声明被丢弃,则设 parsed declaration 为 null。
- 如果 parsed declaration 不为 null,则将其追加到 parsed declarations。
- 返回 parsed declarations。
要序列化 CSS 声明(具有属性名称 property、值 value 以及可选的 important 标志),请执行以下步骤:
- 设 s 为空字符串。
- 向 s 追加 property。
- 向 s 追加 "
:" (U+003A U+0020)。 - 向 s 追加 value。
- 如果设置了
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)。 - 向 s 追加 "
;" (U+003B)。 - 返回 s。
要序列化 CSS 声明块 declaration block,需执行以下步骤:
- 设 list 为一个空数组。
- 设 already serialized 为一个空数组。
-
声明循环:对于 declaration block 的声明中的每个 CSS 声明 declaration,执行以下子步骤:
- 设 property 为 declaration 的属性名称。
- 如果 property 已在 already serialized 中,则继续执行标注为声明循环的步骤。
- 如果 property 映射到一个或多个简写属性,则设 shorthands 为这些简写属性的数组,按首选顺序排列。
-
简写循环:对于 shorthands 中的每个 shorthand,执行以下子步骤:
- 设 longhands 为 declaration block 的声明中所有 CSS 声明组成的数组,且这些声明不在 already serialized 中,且其属性名称映射到 shorthands 中的某个简写属性。
- 如果映射到 shorthand 的所有属性均未出现在 longhands 中,则继续执行标注为简写循环的步骤。
- 设 current longhands 为一个空数组。
- 将 longhands 中所有 CSS 声明(其属性名称映射到 shorthand)追加到 current longhands。
- 如果有任何 CSS 声明在 current longhands 中设置了重要(important)标志,而其他声明未设置,则继续执行标注为简写循环的步骤。
- 如果在 declaration block 中,位于 current longhands 中第一个和最后一个长写声明之间的任何声明属于同一个逻辑属性组,但具有与 current longhands 中任何长写声明不同的映射逻辑,且不在 current longhands 中,则继续执行标注为简写循环的步骤。
- 设 value 为对 current longhands 调用序列化 CSS 值的结果。
- 如果 value 为空字符串,则继续执行标注为简写循环的步骤。
- 设 serialized declaration 为调用序列化 CSS 声明(属性名称为 shorthand,值为 value,且如果 current longhands 中的 CSS 声明设置了重要标志,则设置
important标志)的结果。 - 向 list 追加 serialized declaration。
- 向 already serialized 追加 current longhands 中所有项的属性名称。
- 继续执行标注为声明循环的步骤。
- 设 value 为对 declaration 调用序列化 CSS 值的结果。
- 设 serialized declaration 为调用序列化 CSS 声明(属性名称为 property,值为 value,且如果 declaration 设置了重要标志,则设置
important标志)的结果。 - 向 list 追加 serialized declaration。
- 向 already serialized 追加 property。
- 返回连接了 "
" (U+0020) 的 list。
注:空 CSS 声明块的序列化为空字符串。
注:非空 CSS 声明块的序列化不包括任何周围的空格,即第一个属性名称之前没有空格,最后一个属性值后的最终分号定界符之后也没有空格。
CSS 声明块对于其拥有节点具有以下属性更改步骤,包含 localName、value 和 namespace:
- 如果设置了计算标志,则返回。
- 如果设置了更新标志,则返回。
- 如果 localName 不是 "
style" 或 namespace 不为 null,则返回。 - 如果 value 为 null,则清空声明。
- 否则,设声明为从字符串 value 解析 CSS 声明块的结果。
当创建 CSS 声明块对象时:
- 设 owner node 为拥有节点。
- 如果 owner node 为 null 或设置了计算标志,则返回。
- 设 value 为获取属性(给定 null、"
style" 和 owner node)的结果。 - 如果 value 不为 null,设声明为从字符串 value 解析 CSS 声明块的结果。
要更新声明块 declaration block 的 style 属性,需运行以下步骤:
- 断言:declaration block 的计算标志未设置。
- 设 owner node 为 declaration block 的拥有节点。
- 如果 owner node 为 null,则返回。
- 设置 declaration block 的更新标志。
- 设置属性值(使用 "
style" 和序列化 declaration block 的结果)作用于 owner node。 - 取消设置 declaration block 的更新标志。
简写属性列表 shorthands 的首选顺序如下:
- 按字典顺序排序 shorthands。
- 将 shorthands 中所有以 "
-" (U+002D) 开头的项移至列表末尾,保留其相对顺序。 - 将 shorthands 中所有以 "
-" (U+002D) 开头但不以 "-webkit-" 开头的项移至列表末尾,保留其相对顺序。 - 按映射到它的长写属性数量对 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 属性必须运行以下步骤:
设置 cssText 属性时,必须运行以下步骤:
- 如果设置了计算标志,则抛出一个
NoModificationAllowedError异常。 - 清空声明。
- 解析给定的值,如果返回值不是空列表,则将列表中的项按指定顺序插入到声明中。
- 更新该CSS 声明块的 style 属性。
item(index) 方法必须返回位置 index 处的 CSS 声明的属性名称。
getPropertyValue(property) 方法必须执行以下步骤
getPropertyPriority(property) 方法必须执行以下步骤
- 如果 property 不是自定义属性,请执行以下子步骤
- 令 property 为转换为 ASCII 小写后的 property。
- 如果 property 是缩写属性,请执行以下子步骤
- 令 list 为一个新的数组。
- 对于 property 所映射的每个长写属性 longhand,将以 longhand 为参数调用
getPropertyPriority()的结果追加到 list。 - 如果 list 中的所有项均为字符串“
important”,则返回字符串“important”。
- 如果 property 与声明中设置了重要标志的某个 CSS 声明的属性名称区分大小写匹配,则返回字符串“
important”。 - 返回空字符串。
setProperty(property, value, priority) 方法必须执行以下步骤
- 如果设置了计算标志,则抛出一个
NoModificationAllowedError异常。 - 如果 property 不是自定义属性,请执行以下子步骤
- 令 property 为转换为 ASCII 小写后的 property。
- 如果 property 与支持的 CSS 属性不区分大小写匹配,则返回。
- 如果 value 是空字符串,则以 property 为参数调用
removeProperty()并返回。 - 如果 priority 不是空字符串且与字符串“
important”不ASCII 不区分大小写匹配,则返回。 - 令 component value list 为对属性 property 解析 value 的结果。
注:value 不能包含“
!important”。 - 如果 component value list 为 null,则返回。
- 令 updated 为 false。
- 如果 property 是缩写属性,则对于 property 所映射的每个长写属性 longhand,按规范顺序执行以下子步骤
- 否则,令 updated 为设置 CSS 声明 property 的结果(使用值 component value list,如果 priority 不是空字符串则设置重要标志,否则取消设置,并使用声明列表)。
- 如果 updated 为 true,则更新该CSS 声明块的 style 属性。
要设置 CSS 声明 property(使用值 component value list 以及可选的重要标志,在声明列表 declarations 中),用户代理必须确保其步骤之后满足以下约束
- 在 declarations 中必须存在且仅存在一个 CSS 声明,其属性名称与 property 区分大小写匹配。此类声明在下文中被称为目标声明。
- 目标声明的值必须为 component value list,且若设置了重要标志,则目标声明的重要标志必须已设置,否则未设置。
- 任何非目标声明的 CSS 声明不得在 declarations 中被更改、插入或删除。
- 如果 declarations 中存在 CSS 声明,其属性名称与 property 处于相同的逻辑属性组中,但具有不同的映射逻辑,则目标声明的索引必须位于所有这些 CSS 声明之后。
- 如果执行步骤导致 declarations 的序列化发生变化,则该步骤必须返回 true。否则可以返回 false。
我们是否应该添加诸如“任何可观察的副作用不得在 declarations 之外产生”之类的说明?当前的约束听起来像是未定义行为的一个漏洞。
注:设置 CSS 声明的步骤在此级 CSSOM 中未定义。只要满足上述约束,用户代理可以使用不同的算法。
另一种可能的算法是
- 如果 property 与 declarations 中某个 CSS 声明的属性名称区分大小写匹配,请执行以下子步骤
- 向 declarations 追加一个新的 CSS 声明,其属性名称为 property,值为 component value list,若设置了重要标志则设置重要标志。
- 返回 true。
removeProperty(property) 方法必须执行以下步骤
- 如果设置了计算标志,则抛出一个
NoModificationAllowedError异常。 - 如果 property 不是自定义属性,令 property 为转换为 ASCII 小写后的 property。
- 令 value 为以 property 为参数调用
getPropertyValue()的返回值。 - 令 removed 为 false。
- 如果 property 是缩写属性,则对于 property 所映射的每个长写属性 longhand
- 否则,如果 property 与声明中某个 CSS 声明的属性名称区分大小写匹配,则移除该 CSS 声明并令 removed 为 true。
- 如果 removed 为 true,则更新该CSS 声明块的 style 属性。
- 返回 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()。任何抛出的异常必须被重新抛出。
对于每个作为支持的 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()。任何抛出的异常必须被重新抛出。
webkitTransform IDL 属性。由于驼峰命名属性的规则,还会存在一个 WebkitTransform IDL 属性。对于每个作为支持的 CSS 属性的 CSS 属性 property(属性名称中没有“-” (U+002D) 的属性除外),以下部分接口适用,其中 带横线属性 为 property 本身。
partial interface CSSStyleDeclaration { [CEReactions ]attribute [LegacyNullToEmptyString ]CSSOMString ; };_dashed_attribute
带横线属性在获取时,必须返回以 带横线属性 为参数调用 getPropertyValue() 的结果。
设置带横线属性必须以 带横线属性 为第一个参数,给定值作为第二个参数,无第三个参数,调用 setProperty()。任何抛出的异常必须被重新抛出。
font-size IDL 属性。在 JavaScript 中,假设 element 是一个 HTML 元素,可以通过以下方式访问该属性:element.style['font-size'];
针对 property(可选设置首字母小写标志)的CSS 属性转 IDL 属性算法如下:
- 令 output 为空字符串。
- 令 uppercase next 为未设置。
- 如果设置了首字母小写标志,从 property 中移除第一个字符。
- 对于 property 中的每个字符 c
- 如果 c 为“
-” (U+002D),令 uppercase next 为设置。 - 否则,如果 uppercase next 为设置,令 uppercase next 为未设置,并将 c 转换为 ASCII 大写后追加到 output。
- 否则,将 c 追加到 output。
- 如果 c 为“
- 返回 output。
针对 attribute(可选设置短横线前缀标志)的IDL 属性转 CSS 属性算法如下:
- 令 output 为空字符串。
- 如果设置了短横线前缀标志,将“
-” (U+002D) 追加到 output。 - 对于 attribute 中的每个字符 c
- 如果 c 在 U+0041 到 U+005A(ASCII 大写)范围内,追加“
-” (U+002D) 并随后追加 c 转换为 ASCII 小写后的值到 output。 - 否则,将 c 追加到 output。
- 如果 c 在 U+0041 到 U+005A(ASCII 大写)范围内,追加“
- 返回 output。
6.7. CSS 值
6.7.1. 解析 CSS 值
对于给定的 property,解析 CSS 值 value 意味着遵循以下步骤
- 令 list 为调用 解析组件值列表处理 value 所返回的值。
- 根据 CSS 规范中属性 property 的语法匹配 list。
- 如果上述步骤失败,则返回 null。
- 返回 list。
注:“!important”声明不属于属性值空间,因此会导致解析 CSS 值返回 null。
6.7.2. 序列化 CSS 值
要序列化 CSS 值(对于 CSS 声明 declaration 或长写 CSS 声明列表 list),请遵循以下规则
-
如果此算法在调用时传入了列表 list
-
将 declaration 的值表示为 CSS 组件值列表 components,该列表在根据属性语法解析后将表示该值。此外
-
如果某些组件值可以在不改变含义的情况下以任何顺序出现(这种模式通常在值语法中由双竖线 || 表示),则重新排列组件值,以使用属性定义表中给出的组件规范顺序。
-
如果组件值可以在不改变含义的情况下省略或替换为更短的表示形式,则省略/替换它们。
-
如果上述任何句法转换会导致向后兼容性变差,则不要执行它们。
注:此处描述的规则概述了序列化的一般原则。出于遗留原因,某些属性以不同方式进行序列化,由于资源不足,此处故意未予定义。请咨询当地的逆向工程人员获取详细信息。
-
-
从 components 中移除任何 <whitespace-token>。
-
将 components 中的每个组件值替换为调用序列化 CSS 组件值的结果。
-
将 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> 是指定值的组件,则按以下方式返回颜色
- 如果颜色是由作者明确指定的,则返回原始的、作者指定的颜色值。
- 否则,返回如果该颜色是计算值的组件时所返回的值。
- <alphavalue>
- 如果该值在内部表示为 0 到 255 之间的整数(即 8 位无符号整数),请执行以下步骤
- 令 alpha 为给定的整数。
- 如果存在一个 0 到 100 之间的整数,乘以 2.55 并四舍五入到最接近的整数后(如果两个值同样接近则向上取整)等于 alpha,则令 rounded 为该整数除以 100。
- 否则,令 rounded 为 alpha 除以 0.255 四舍五入到最接近的整数(如果两个值同样接近则向上取整),再除以 1000。
- 返回将 rounded 序列化为 <number> 的结果。
否则,返回将给定值序列化为 <number> 的结果。
- <counter>
- 以下算法的返回值
- 设 s 为空字符串。
- 如果 <counter> 有三个 CSS 组件值,将字符串“
counters(”追加到 s。 - 如果 <counter> 有两个 CSS 组件值,将字符串“
counter(”追加到 s。 - 令 list 为属于 <counter> 的 CSS 组件值列表,如果最后一个 CSS 组件值是“decimal”则将其省略。
- 令 list 中的每个项目为对该项目调用序列化 CSS 组件值的结果。
- 将对 list 调用序列化逗号分隔列表的结果追加到 s。
- 将“
)” (U+0029) 追加到 s。 - 返回 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>
- 以下算法的返回值
- 令 s 为字符串“
rect(”。 - 令 list 为属于 <shape> 的 CSS 组件值列表。
- 令 list 中的每个项目为对该项目调用序列化 CSS 组件值的结果。
- 将对 list 调用序列化逗号分隔列表的结果追加到 s。
- 将“
)” (U+0029) 追加到 s。 - 返回 s。
- 令 s 为字符串“
- <string>
- <family-name>
- <specific-voice>
- 字符串序列化为字符串。
- <time>(时间)
- 以秒为单位的时间按 <number> 序列化,后跟字面量字符串“
s”。 - <url>
- 绝对 URL 字符串序列化为 URL。
<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) 方法必须执行以下步骤
- 令 doc 为 elt 的节点文档。
- 令 obj 为 elt。
- 如果提供了 pseudoElt 且它不是空字符串,则
- 解析 pseudoElt 为 <伪元素选择器>,并令 type 为结果。
- 如果 type 解析失败,或是 ::slotted() 或 ::part() 伪元素,则抛出一个
TypeError异常。 - 否则,令 obj 为 elt 的给定伪元素。
注:CSS2 伪元素应同时匹配双冒号和单冒号版本。也就是说,
:before和::before都应匹配上述规则。 - 令 decls 为空的 CSS 声明列表。
- 如果 elt 是连接的,属于平面树,且其包含 shadow 的根节点拥有一个浏览上下文,该上下文要么没有浏览上下文容器,要么其浏览上下文容器正在被渲染,则将 decls 设置为所有支持的 CSS 属性(按字典顺序),其值为针对 obj 使用与 doc 关联的样式规则计算出的解析值。此外,将所有自定义属性追加到 decls,其针对 obj 的计算值不是保证无效值。
有些 UA 处理缩写属性,所有 UA 都处理曾经是长写属性的缩写,如 overflow,参见 #2529。
自定义属性的顺序目前未定义,参见 #4947。
- 返回一个具有以下属性的实时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 属性的解析值不为 none 或 contents,则解析值为使用值。否则解析值为计算值。
- bottom
- left
- inset-block-end
- inset-block-start
- inset-inline-end
- inset-inline-start
- right
- top
- 在其他规范中定义的解析值特殊情况属性(如 top)
- 如果该属性适用于定位元素,且 display 属性的解析值不为 none 或 contents,且属性未过度约束,则解析值为使用值。否则解析值为计算值。
- 在其他规范中定义的解析值特殊情况属性
- 按相关规范定义。
- 任何其他属性
- 解析值为计算值。
10. IANA Considerations
10.1. Default-Style
本节描述用于在永久消息头域注册表中注册的头域。
- 头字段名称
- Default-Style
- 适用协议
- http
- 状态
- 标准
- 作者/变更控制者
- W3C
- 规范文档
- 本文档是相关的规范。
- 相关信息
- 无。
11. 变更历史
本节记录了本规范各出版版本之间的一些变更。本节并不详尽。错误修复和编辑性更改通常不列出。
11.1. 2016 年 3 月 17 日之后的变更
-
<resolution> 的序列化已更改。
-
添加了
[CEReactions]IDL 扩展属性。 -
添加了逻辑属性的解析值。
-
MediaList.item现在返回序列化字符串。 -
如果重要性不同,
MediaList.item不再序列化缩写属性。 -
允许其他规范指定解析值。
-
insertRule中的index参数现在是可选的。 -
Stylesheet和CSSImportRule的href属性现在使用USVString。 -
引入了
CSSOMString。 -
添加了
CSSMediaRule和CSSFontFaceRule的序列化。 -
CSS 声明块中添加了更新标志,以避免在 style 属性上进行序列化-解析循环。
-
现在正确定义了声明值的序列化。
-
getComputedStyle现在返回节点文档的样式规则。 -
当传递给
getComputedStyle的伪元素未知或为 ::slotted() 时,会抛出TypeError。 -
CSS已从接口切换为命名空间。 -
由于缺乏实现的兴趣,
setPropertyValue和setPropertyPriority已从CSSStyleDeclaration中移除。 -
styleSheetsIDL 属性已从Document移动到DocumentOrShadowRoot。 -
LinkStyle.sheet 现在返回
CSSStyleSheet而不是StyleSheet。 -
定义了已弃用的 CSSStyleSheet 成员。
-
已弃用
CSSRule.type属性。 -
添加了 <ratio> 的序列化。
-
CSSStyleDeclaration.cssText现在为计算样式返回空字符串。 -
getComputedStyle中包含了自定义属性。 -
引入了 MathML IDL。
-
添加了
CSSKeyframesRule和CSSKeyframeRule的序列化。 -
媒体查询的序列化已更改。
-
如果缩写属性的长写属性之间存在其他属性组/映射逻辑的长写属性,则不再序列化该缩写。
-
CSSStyleRule序列化现在支持嵌套。 -
引入了可构造样式表。
11.2. 2013 年 12 月 5 日之后的变更
-
移除了替代样式表的 API:
Document上的selectedStyleSheetSet,lastStyleSheetSet,preferredStyleSheetSet,styleSheetSets,enableStyleSheetsForSet()。 -
移除了
Element上的pseudo()方法和PseudoElement接口。 -
移除了
Element上的cascadedStyle,defaultStyle,rawComputedStyle和usedStyleIDL 属性。 -
添加了
CSSStyleDeclaration上形式为webkitFoo(小写w)的 IDL 属性。 -
CSSNamespaceRule改回只读。 -
移除了对
insertRule()中@charset的处理。 -
再次移除了
CSSCharsetRule。 -
标识符和字符串的序列化已更改。
-
选择器的序列化现在支持组合符“>>”和“||”以及属性选择器中的“i”标志。
-
:lang() 的序列化已更改。
-
CSSStyleDeclaration上的setProperty()已更改。
11.3. 2011 年 7 月 12 日至 2013 年 12 月 5 日之间的变更
- 跨域样式表不允许被读取或更改。
- 重新引入了
CSSCharsetRule。 - 引入了
CSSGroupingRule和CSSMarginRule。 CSSNamespaceRule现在是可变的。- 现在定义了解析和序列化 CSS 声明块。
- 现在在
setProperty(),getPropertyValue()等中支持缩写。 - 向
CSSStyleDeclaration添加了setPropertyValue和setPropertyPriority。 - 各种接口的
style和media属性使用[PutForwards]WebIDL 扩展属性进行了注解。 - 引入了
Element上的pseudo()方法。 - 引入了
PseudoElement接口。 - 引入了
Element和PseudoElement上的cascadedStyle,rawComputedStyle和usedStyle属性。 - 引入了 CSS.escape() 静态方法。
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 值的规范化(现为序列化)规则。