1. 介绍
CSS 样式表被解析为抽象的 UA 内部数据结构,称为 CSS 的内部表示, 各种规范算法会对其进行操作。
内部表示 无法直接操作,因为它们依赖于实现;UA 必须同意如何解释 内部表示, 但这些表示本身故意未定义,以便 UA 可以以最有效的方式存储和操作 CSS。
以前,唯一的读取或写入 内部表示 的方式是通过字符串——样式表或 CSSOM 允许作者将字符串发送给 UA, 这些字符串被解析为 内部表示,并且 CSSOM 允许作者请求 UA 将其内部表示重新序列化为字符串。
本规范引入了一种与 内部表示交互的新方法, 通过使用特殊的 JS 对象表示这些内部表示,使其比字符串解析/拼接更易于操作和理解。 这种新方法对作者来说更简单 (例如,数值通过实际的 JS 数字反映,并为其定义了单位感知的数学运算), 在许多情况下性能更高,因为值可以直接操作,然后以较低的成本重新转换为 内部表示,而无需构建和解析 CSS 字符串。
2. CSSStyleValue
对象
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface {
CSSStyleValue stringifier ; [Exposed =Window ]static CSSStyleValue parse (USVString ,
property USVString ); [
cssText Exposed =Window ]static sequence <CSSStyleValue >parseAll (USVString ,
property USVString ); };
cssText
CSSStyleValue
对象是通过 Typed OM API 访问的所有 CSS 值的基类。
CSSStyleValue 对象的字符串化行为在§ 6 CSSStyleValue 序列化中定义。
parse(property, cssText)
方法,当调用时,
必须解析
CSSStyleValue,使用属性property、
cssTextcssText,并将parseMultiple设置为false,并返回结果。
parseAll(property, cssText)
方法,
当调用时,必须解析
CSSStyleValue,
使用属性property、cssTextcssText,并将parseMultiple设置为true,并返回结果。
-
如果property不是自定义属性名称字符串,则将property设置为其 ASCII 小写形式。
-
如果property不是有效的 CSS 属性,抛出一个
TypeError
。 -
根据property的语法,尝试解析 cssText。 如果失败,抛出一个
TypeError
。 否则,令whole value为解析结果。自定义属性在通过 JavaScript 修改时的行为与在样式表中定义时不同。当自定义属性在样式表中以无效语法定义时,该值将被记录为“未设置”,以避免在注册自定义属性时重新解析每个样式表。
相反,当通过 JavaScript API 修改自定义属性时,任何解析错误都会通过
TypeError
传播到编程环境中。这允许开发人员更及时地反馈错误。 -
根据property,将整个值划分为迭代,并将values作为结果。
-
如果parseMultiple为 false,返回values[0]。否则,返回values。
<foo>#
术语),
但某些遗留属性(如counter-reset)不会用逗号分隔其迭代。
预计未来会严格定义,但目前明确是一个“你懂我们意思”的事。
2.1. 直接CSSStyleValue
对象
尚未能被更专业的CSSStyleValue
子类直接支持的值,将表示为CSSStyleValue
对象。
每个CSSStyleValue
对象通过其[[associatedProperty]]
内部槽与特定的
CSS 属性相关联,并且与特定的不可变的内部表示相关联。 这些对象被称为“表示”它们内部表示的特定内容,当它们重新设置到同一属性的样式表中时,它们会再现等效的内部表示。
这些CSSStyleValue
对象仅对它们所解析的属性有效。
这通过CSSStyleValue
对象的[[associatedProperty]]
内部槽来强制执行,该槽默认为null
,或为指定属性名称的字符串。
注意: 此槽由StylePropertyMap
.set()
/append()
检查。
3. StylePropertyMap
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface {
StylePropertyMapReadOnly iterable <USVString ,sequence <CSSStyleValue >>; (undefined or CSSStyleValue )get (USVString );
property sequence <CSSStyleValue >getAll (USVString );
property boolean has (USVString );
property readonly attribute unsigned long size ; }; [Exposed =Window ]interface :
StylePropertyMap StylePropertyMapReadOnly {undefined set (USVString , (
property CSSStyleValue or USVString )...);
values undefined append (USVString , (
property CSSStyleValue or USVString )...);
values undefined delete (USVString );
property undefined clear (); };
StylePropertyMap
是以对象形式表示CSS声明块的另一种方式(当通过[cssom]获取时,CSS声明块则表示为CSSStyleDeclaration
对象。)
StylePropertyMapReadOnly
对象具有一个[[declarations]]
内部槽,它是一个映射,反映了CSS声明块的声明。
注意:声明尚未使用[infra]术语定义,但在本规范中,它被假定为一个映射,其键是字符串(代表属性名称),其值是这些属性的内部表示。
除非另有说明,[[declarations]]
内部槽的初始排序基于每个条目的键:
StylePropertyMapReadOnly
对象this的要迭代的值对如下:
某些 CSS 属性是列表值属性, 例如background-image或animation; 它们的值是一个平行语法项的列表, 几乎总是以逗号分隔 (唯一的例外是某些遗留属性,例如counter-reset), 表示多个以相同方式解释的不同“值”。 其他属性, 例如color, 是单值属性; 它们只接受一个(可能是复杂的)值。
StylePropertyMap
是一个多重映射;
它为每个键存储列表值,
但允许您像只有单个值一样与它进行交互。
这意味着在StylePropertyMap
中某个属性的多个值
并不代表该属性值的多次定义;
相反,它们表示单个属性值中的多个以逗号分隔的子值,
就像background-image属性中的每一层。
get(property)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
让props成为this的
[[declarations]]
内部插槽的值。 -
如果props[property] 存在,则将其细分为迭代 props[property], 然后实现结果的第一个项 并返回它。
否则,返回
undefined
。
getAll(property)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
让props成为this的
[[declarations]]
内部插槽的值。 -
如果props[property] 存在,则将其细分为迭代 props[property], 然后实现结果的每个项, 并返回列表。
否则,返回一个空列表。
has(property)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
让props成为this的
[[declarations]]
内部插槽的值。 -
如果props[property] 存在, 返回
true
。 否则,返回false
。
set(property, ...values)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
如果values中的任何项具有非空
[[associatedProperty]]
内部槽,并且该槽的值不是property,则抛出TypeError
。 -
如果values的大小为两个或更多,并且其中一个或多个项是
CSSUnparsedValue
或CSSVariableReferenceValue
对象, 则抛出TypeError
。注意:多个值意味着您正在设置一个列表值属性的多个项, 但是字符串中的var()函数 禁用了所有语法解析, 包括分割为独立的迭代(因为var()值中可能还有更多的逗号, 因此无法确定实际出现了多少项)。 此步骤的限制在Typed OM中保留了相同的语义。
-
让props成为this的
[[declarations]]
内部插槽的值。 -
让values to set成为一个空的列表。
-
对于values中的每个value,为property和value 创建内部表示, 并将结果附加到values to set。
-
将props[property]设置为values to set。
append(property, ...values)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
如果values中的任何项具有非空
[[associatedProperty]]
内部槽,并且该槽的值不是property,则抛出TypeError
。 -
如果values中的任何项是
CSSUnparsedValue
或CSSVariableReferenceValue
对象,则抛出TypeError
。注意:当属性通过字符串API设置时, 属性中的var()的存在阻止了整个内容被解释。 换句话说, 除var()之外的所有内容都是普通的组件值, 而不是有意义的类型。 此步骤的限制在Typed OM中保留了相同的语义。
-
让props成为this的
[[declarations]]
内部插槽的值。 -
让temp values成为一个空的列表。
-
对于values中的每个value,为property和value 创建内部表示, 并将返回值附加到temp values。
-
将temp values的条目附加到 props[property]。
delete(property)
方法,
在StylePropertyMap
this上调用时,
必须执行以下步骤:
-
如果property不是自定义属性名称字符串, 将property设置为property的ASCII 小写。
-
如果property不是有效的 CSS 属性,则抛出
TypeError
。 -
如果this的
[[declarations]]
内部插槽包含property,则移除它。
CSSStyleValue
:
- 如果value是直接的
CSSStyleValue
, -
返回value的关联值。
- 如果value是
CSSStyleValue
的子类, -
如果value不匹配property的列表值属性迭代的语法,抛出
TypeError
。如果property的CSS语法组件中的任何部分具有有限的数值范围, 并且value的相应部分是一个
CSSUnitValue
超出该范围, 使用一个新的CSSMathSum
包裹该值, 其values
内部槽仅包含value的该部分。返回value。
- 如果value是
USVString
, -
使用属性property,cssTextvalue,并将parseMultiple设置为
false
,解析CSSStyleValue, 并返回结果。注意:这可能会抛出
TypeError
。
CSSStyleValue
对象也可以与这些语法匹配。
一个CSSStyleValue
被称为根据以下规则匹配语法:
-
一个
CSSKeywordValue
如果其值
内部槽匹配语法中指定的标识符, 则匹配<ident>。如果案例折叠规则通常适用于该<ident>(例如Auto匹配关键字auto,正如语法中为width指定的一样), 则该比较也适用这些规则。
-
一个
CSSNumericValue
匹配它的类型匹配的内容。 -
一个
CSSUnparsedValue
匹配任何语法。 -
一个直接的
CSSStyleValue
对象(不是子类) 具有非空的[[associatedProperty]]
槽 与在其[[associatedProperty]]
槽中指定的属性的语法匹配, 无论它是什么。
注意:随着在Typed OM中创建更复杂值的能力增加, 本节将变得更加复杂。
一个字符串
是一个自定义属性名称字符串,
如果它以两个破折号(U+002D HYPHEN-MINUS)开头,比如--foo
。
(这对应于<custom-property-name>,
但适用于字符串,
而不是标识符;
它可以在不调用CSS解析器的情况下使用。)
一个字符串 是一个有效的CSS属性, 如果它是自定义属性名称字符串, 或者是用户代理识别的CSS属性名称。
3.1. 计算StylePropertyMapReadOnly
对象
partial interface Element { [SameObject ]StylePropertyMapReadOnly computedStyleMap (); };
计算
StylePropertyMap对象表示一个Element
的计算值,
可以通过调用computedStyleMap()
方法访问。
每个Element
都有一个[[computedStyleMapCache]]
内部槽,
初始设置为null
,
用于缓存首次调用computedStyleMap()
方法时的结果。
computedStyleMap()
方法,
在Element
this上调用时,
必须执行以下步骤:
-
如果this的
[[computedStyleMapCache]]
内部槽设置为null
, 将其值设置为一个新的StylePropertyMapReadOnly
对象, 其[[declarations]]
内部槽包含用户代理支持的所有长格式CSS属性的名称和计算值, 所有已注册的自定义属性, 以及未设置为初始值的所有未注册的自定义属性, 按标准顺序排列。此对象的
[[declarations]]
中的计算值 必须保持最新, 随着样式解析改变this上的属性及其计算方式而变化。注意: 实际上,由于这些值通过
.get()
方法调用“隐藏”, 用户代理可以推迟计算,直到实际请求某个属性。 -
返回this的
[[computedStyleMapCache]]
内部槽。
注意: 类似于Window.getComputedStyle()
,
此方法可以公开来自样式表的未设置origin-clean标志的信息。
注意: 此方法返回的StylePropertyMapReadOnly
表示的是实际的计算值,
而不是Window.getComputedStyle()
使用的已解析值概念。
因此,对于某些属性(如width),它返回的值可能与Window.getComputedStyle()
不同。
注意: 根据WG决议,
伪元素样式旨在通过将此方法添加到新的PseudoElement
接口中来获取,
而不是像pseudoElt
参数一样使用Window.getComputedStyle()
。
3.2.
声明和内联StylePropertyMap
对象
partial interface CSSStyleRule { [SameObject ]readonly attribute StylePropertyMap styleMap ; };partial interface mixin ElementCSSInlineStyle { [SameObject ]readonly attribute StylePropertyMap attributeStyleMap ; };
声明
StylePropertyMap对象
表示嵌入在样式规则或内联样式中的样式属性-值对,
可以通过CSSStyleRule
对象的styleMap
属性访问,
或通过实现ElementCSSInlineStyle
接口混入的对象的attributeStyleMap
属性访问
(如HTMLElement
)。
构造时,声明的StylePropertyMap对象的[[declarations]]
内部槽初始化为包含每个属性的条目,
这些属性在对象所代表的CSSStyleRule
或内联样式中具有有效值,
顺序与CSSStyleRule
或内联样式的顺序相同。
4. CSSStyleValue
子类
4.1. CSSUnparsedValue
对象
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSUnparsedValue CSSStyleValue {(
constructor sequence <CSSUnparsedSegment >);
members iterable <CSSUnparsedSegment >;readonly attribute unsigned long length ;getter CSSUnparsedSegment (unsigned long );
index setter CSSUnparsedSegment (unsigned long ,
index CSSUnparsedSegment ); };
val typedef (USVString or CSSVariableReferenceValue ); [
CSSUnparsedSegment Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface {
CSSVariableReferenceValue constructor (USVString ,
variable optional CSSUnparsedValue ?=
fallback null );attribute USVString variable ;readonly attribute CSSUnparsedValue ?; };
fallback
CSSUnparsedValue
对象表示引用自定义属性的属性值。
它们由字符串片段和变量引用的列表组成。
它们具有[[tokens]]
内部槽,
这是一个列表,
包含USVString
和CSSVariableReferenceValue
对象。
这个列表是对象的迭代值。
length
属性返回[[tokens]]
内部槽的大小。
CSSUnparsedValue
的this对象支持的属性索引是大于等于0的整数,
且小于this的[[tokens]]
内部槽的大小。
为了确定索引属性的值,对于一个CSSUnparsedValue
this对象和一个索引n,
让tokens成为this的[[tokens]]
内部槽,
并返回tokens[n]。
为了设置现有索引属性的值,对于一个CSSUnparsedValue
this对象,
一个索引n,
和一个值new value,
让tokens成为this的[[tokens]]
内部槽,
并将tokens[n]设置为new value。
为了设置新的索引属性的值,对于一个CSSUnparsedValue
this对象,
一个索引n,
和一个值new value,
让tokens成为this的[[tokens]]
内部槽。
如果n不等于tokens的大小,则抛出RangeError
。
否则,追加new value到tokens。
CSSVariableReferenceValue
this对象的variable
属性的getter
必须返回其variable
内部槽的值。
variable
属性的setter
必须在设置变量variable时执行以下步骤:
-
如果variable不是自定义属性名称字符串,则抛出
TypeError
。 -
否则,将this的
variable
内部槽设置为variable。
CSSVariableReferenceValue(variable, fallback)
构造函数必须在调用时执行以下步骤:
-
如果variable不是自定义属性名称字符串,则抛出
TypeError
。 -
返回一个新的
CSSVariableReferenceValue
, 其variable
内部槽设置为variable,并且其fallback
内部槽设置为fallback。
4.2. CSSKeywordValue
对象
CSSKeywordValue
对象表示CSS关键字和其他idents。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSKeywordValue CSSStyleValue {constructor (USVString );
value attribute USVString value ; };
CSSKeywordValue(value)
构造函数必须在调用时执行以下步骤:
-
否则,返回一个新的
CSSKeywordValue
, 其value
内部槽设置为value。
任何接受CSSKeywordValue
的地方
也接受一个原始的USVString
,
通过使用以下typedef和算法:
typedef (DOMString or CSSKeywordValue );
CSSKeywordish
-
如果val是
CSSKeywordValue
, 返回val。 -
如果val是
DOMString
, 返回一个新的CSSKeywordValue
, 其value
内部槽设置为val。
value
属性的CSSKeywordValue
this必须在设置value时执行以下步骤:
4.3. 数值:
CSSNumericValue
对象表示本质上是数值的CSS值
(<number>、<percentage>、<dimension>)。
有两个接口继承自CSSNumericValue
:
-
CSSUnitValue
对象表示包含单一单位类型的值 (例如 "42px")。 -
CSSMathValue
对象表示数学表达式, 其中可以包含多个值/单位 (例如 "calc(56em + 10%)")。
CSSNumericValue
对象没有范围限制。
任何有效的数值都可以由CSSNumericValue
表示,
并且该值在设置为声明的StylePropertyMap时不会被限制、四舍五入或拒绝。
相反,限制和/或四舍五入将在样式计算期间发生。
myElement. attributeStyleMap. set( "opacity" , CSS. number( 3 )); myElement. attributeStyleMap. set( "z-index" , CSS. number( 15.4 )); console. log( myElement. attributeStyleMap. get( "opacity" ). value); // 3 console. log( myElement. attributeStyleMap. get( "z-index" ). value); // 15.4 var computedStyle= myElement. computedStyleMap(); var opacity= computedStyle. get( "opacity" ); var zIndex= computedStyle. get( "z-index" );
执行后,opacity
的值是1
(opacity具有范围限制),
而zIndex
的值是15
(z-index被四舍五入为整数值)。
注意:包含变量引用的"数值"
将表示为CSSUnparsedValue
对象,
而关键字将表示为CSSKeywordValue
对象。
任何接受CSSNumericValue
的地方
也接受一个原始的double
,
通过使用以下typedef和算法:
typedef (double or CSSNumericValue );
CSSNumberish
-
如果num是一个
CSSNumericValue
, 返回num。 -
如果num是一个
double
, 返回一个新的CSSUnitValue
, 其value
内部槽设置为num,并且其unit
内部槽设置为unit。
4.3.1. 通用数值操作,以及CSSNumericValue
超类
所有数值类型的CSS值
(<number>、<percentage>,以及<dimension>)
由CSSNumericValue
接口的子类表示。
enum {
CSSNumericBaseType ,
"length" ,
"angle" ,
"time" ,
"frequency" ,
"resolution" ,
"flex" , };
"percent" dictionary {
CSSNumericType long ;
length long ;
angle long ;
time long ;
frequency long ;
resolution long ;
flex long ;
percent CSSNumericBaseType ; }; [
percentHint Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSNumericValue CSSStyleValue {CSSNumericValue add (CSSNumberish ...);
values CSSNumericValue sub (CSSNumberish ...);
values CSSNumericValue mul (CSSNumberish ...);
values CSSNumericValue div (CSSNumberish ...);
values CSSNumericValue min (CSSNumberish ...);
values CSSNumericValue max (CSSNumberish ...);
values boolean equals (CSSNumberish ...);
value CSSUnitValue to (USVString );
unit CSSMathSum toSum (USVString ...);
units CSSNumericType type (); [Exposed =Window ]static CSSNumericValue parse (USVString ); };
cssText
CSSNumericValue
超类中的方法表示所有数值都可以执行的操作。
以下是可以对维度执行的算术运算:
add(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
将values中的每个项替换为修正numberish值的结果。
-
如果this是
CSSMathSum
对象, 将this的values
内部槽中的项前置到values。 否则, 前置this到values。 -
如果values中的所有项都是
CSSUnitValue
且具有相同的unit
, 返回一个新的CSSUnitValue
, 其unit
内部槽设置为 this的unit
内部槽,且value
内部槽设置为 values中的各项value
内部槽之和。 该加法必须按“从左到右”的顺序执行 - 如果values是«1, 2, 3, 4», 则结果必须是(((1 + 2) + 3) + 4)。 (此细节对于在浮点运算存在时确保互操作性是必要的。) -
返回一个新的
CSSMathSum
对象,其values
内部槽设置为 values。
sub(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
将values中的每个项替换为为该修正numberish值的结果,然后取反 该值。
-
调用
add()
内部算法, 并传入this和values。
CSSNumericValue
this:
-
如果this是
CSSMathNegate
对象,返回this的value
内部槽。 -
如果this是
CSSUnitValue
对象,返回一个新的CSSUnitValue
,其unit
内部槽与this相同,并且其value
内部槽设置为this的相反数。 -
否则,返回一个新的
CSSMathNegate
对象, 其value
内部槽设置为this。
mul(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
将values中的每个项替换为为该修正numberish值的结果。
-
如果this是
CSSMathProduct
对象, 将this的values
中的项前置到values。 否则,前置this到values。 -
如果values中的所有项是
CSSUnitValue
且其unit
内部槽设置为"number", 返回一个新的CSSUnitValue
, 其unit
内部槽设置为"number",且value
内部槽设置为 values中的各项value
内部槽的乘积。该乘法必须按“从左到右”的顺序执行 - 如果values是«1, 2, 3, 4», 则结果必须是(((1 × 2) × 3) × 4)。该细节对于浮点数运算的互操作性至关重要。
-
如果values中的所有项是
CSSUnitValue
,且其unit
内部槽设置为"number", 除了一项设置为unit,返回一个新的CSSUnitValue
, 其unit
内部槽设置为unit,且value
内部槽设置为values中的各项value
内部槽的乘积。该乘法必须按“从左到右”的顺序执行 - 如果values是«1, 2, 3, 4», 则结果必须是(((1 × 2) × 3) × 4)。
-
返回一个新的
CSSMathProduct
对象, 其values
内部槽设置为values。
div(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
将values中的每个项替换为为该修正numberish值的结果, 然后取反该值。
-
调用
mul()
内部算法,并传入this和values。
CSSNumericValue
this:
-
如果this是
CSSMathInvert
对象, 返回this的value
内部槽。 -
如果this是一个
CSSUnitValue
对象,其unit
内部槽设置为"number":-
如果this的
value
内部槽设置为0或-0,抛出RangeError
。 -
否则返回一个新的
CSSUnitValue
, 其unit
内部槽设置为"number", 且value
内部槽设置为1除以this的{CSSUnitValue/value}内部槽。
-
-
否则,返回一个新的
CSSMathInvert
对象, 其value
内部槽设置为this。
min(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
将values中的每个项替换为为该修正numberish值的结果。
-
如果this是
CSSMathMin
对象, 将this的values
中的项前置到values。 否则,前置this到values。 -
如果 values 中的所有 项 都是
CSSUnitValue
且具有相同的单位
, 则返回一个新的CSSUnitValue
, 其单位
内部槽位设置为 this 的单位
内部槽位, 且值
内部槽位设置为 values 中 项 的最小值。 -
返回一个新的
CSSMathMin
对象,其values
内部槽位设置为 values。
max(...values)
方法,
当在CSSNumericValue
上调用时,必须执行以下步骤:
-
如果 this 是一个
CSSMathMax
对象,将 this 的values
内部槽中的 项 前置到 values。 否则,将 this 前置到 values。 -
如果 values 中的所有 项 都是
CSSUnitValue
并且具有相同的单位
, 则返回一个新的CSSUnitValue
,其单位
内部槽被设置为 this 的单位
内部槽, 其值
内部槽被设置为 values 中的所有 项 的最大值。 -
将 type 设置为通过添加 values 中每个 类型 的结果。 如果 type 失败,抛出 一个
TypeError
。 -
返回一个新的
CSSMathMax
对象,其values
内部槽被设置为 values。
CSSMathSum(CSS.px(1), CSS.px(2))
不等于CSSMathSum(CSS.px(2), CSS.px(1))
。
之所以使用这种精确的概念,是因为它允许非常快速地测试结构相等性; 如果我们使用更慢、更宽松的相等概念, 例如允许参数按任何顺序匹配, 那么我们可能希望彻底进行其他简化, 比如认为96px等于1in; 这种更宽松的相等概念可能会在未来添加。
CSSNumericValue
value1和value2是否为相等数值,
执行以下步骤:
-
如果value1和value2不是同一个接口的成员, 返回
false
。 -
如果value1和value2都是
CSSUnitValue
, 如果它们的unit
和value
内部槽相等,则返回true
,否则返回false
。 -
如果value1和value2都是
CSSMathSum
,CSSMathProduct
,CSSMathMin
, 或CSSMathMax
: -
断言:value1和value2都是
CSSMathNegate
或CSSMathInvert
。
to(unit)
方法将现有的CSSNumericValue
this转换为具有指定unit的另一个,
如果可能的话。
调用时,必须执行以下步骤:
toSum(...units)
方法将现有的CSSNumericValue
this转换为仅包含指定单位的CSSMathSum
,
如果可能的话。
(这类似于to()
,
但允许结果包含多个单位。)
如果没有指定单位,
它只会将this简化为CSSUnitValue
的最小和。
调用时,必须执行以下步骤:
-
遍历units中的每个unit, 如果从unit创建类型的结果为失败, 抛出
SyntaxError
。 -
让values成为从sum中的每个项创建CSSUnitValue的结果。 如果values中的任何项失败, 抛出
TypeError
。 -
如果units是空的, 按照items的
unit
内部槽的 代码点顺序对values进行排序, 然后返回一个新的CSSMathSum
对象, 其values
内部槽设置为values。 -
返回一个新的
CSSMathSum
对象, 其values
内部槽 设置为result。
type()
方法
返回 this 的 类型 的表示。
调用时,必须执行以下步骤:
-
让 result 为一个新的
CSSNumericType
。 -
对于 this 的 类型中的每个 baseType → power,
-
如果 power 不为 0, 将 result[baseType] 设置为 power。
-
-
如果 this 的 百分比提示 不为 null,
-
将
percentHint
设置为 this 的 百分比提示。
-
-
返回 result。
CSSNumericValue
的一个抽象表示,表示为带有(可能是复杂)单位的数值之和。
并非所有 CSSNumericValue
都能表示为 sum
value。
sum value 是一个列表。 列表中的每个条目是一个 元组,包含一个 值, 即一个数字, 和一个 单位映射, 即一个 有序映射,将单位(字符串)映射到幂(整数)。
-
1px 变为
«(1, «["px" → 1]»)»
-
calc(1px + 1in) 变为
«(97, «["px" → 1]»)»
(因为 in 和 px 是 兼容单位, 并且 px 是它们的 标准单位) -
calc(1px + 2em) 变为
«(1, «["px" → 1]»), (2, «["em" → 1]»)»
-
calc(1px + 2%) 变为
«(1, «["px" → 1]»), (2, «["percent" → 1]»)»
(百分比允许添加到其他单位, 但不会解析为其他单位, 就像在 类型 中一样) -
calc(1px * 2em) 变为
«(2, «["em" → 1, "px" → 1]»)»
-
calc(1px + 1deg) 不能表示为 sum value 因为这是无效的计算
-
calc(1px * 2deg) 变为
«(2, «["deg" → 1, "px" → 1]»)»
从 this CSSNumericValue
创建 sum value 的步骤因
this 的类而异:
CSSUnitValue
CSSMathSum
CSSMathNegate
CSSMathProduct
-
-
让 values 最初为 sum value «(1, «[ ]»)»。 (即,你从 1 得到的。)
-
返回 values。
-
CSSMathInvert
CSSMathMin
CSSMathMax
parse()
方法允许直接从包含CSS的字符串构造 CSSNumericValue
。
注意这是一个静态方法,
直接存在于 CSSNumericValue
接口对象上,
而不是 CSSNumericValue
的实例上。
parse(cssText)
方法,
当调用时,
必须执行以下步骤:
-
从 cssText 解析组件值,并让 result 成为结果。 如果 result 是语法错误,抛出
SyntaxError
并中止该算法。 -
如果 result 不是 <number-token>,<percentage-token>,<dimension-token>, 或 数学函数,抛出
SyntaxError
并中止该算法。 -
如果 result 是 <dimension-token>,并且从 result 的单位创建类型失败, 抛出
SyntaxError
并中止该算法。 -
转化为数值 result, 并返回结果。
4.3.2. 数值类型化
每个 CSSNumericValue
都有一个关联的 类型,
它是一个 映射,将 基本类型 映射到整数
(表示每种类型的指数,
因此一个 <length>2,
比如来自 calc(1px * 1em),
是 «[ "length" → 2 ]»),
以及一个关联的 百分比提示(表示该类型实际上持有百分比,
但该百分比最终会解析为提示的 基本类型,
因此在类型中已被其替代)。
基本类型 是 "length"(长度), "angle"(角度), "time"(时间), "frequency"(频率), "resolution"(分辨率), "flex"(弹性), 和 "percent"(百分比)。 类型条目的排序始终与此 基本类型 排序一致。 百分比提示 为空或是除 "percent" 之外的 基本类型。
注意: 随着新单位类型添加到 CSS, 它们将被添加到此 基本类型 列表中, 以及 CSS 数学函数中。
- unit 是 "number"
-
返回 «[ ]»(空映射)
- unit 是 "percent"
-
返回 «[ "percent" → 1 ]»
- unit 是 <length> 单位
-
返回 «[ "length" → 1 ]»
- unit 是 <angle> 单位
-
返回 «[ "angle" → 1 ]»
- unit 是 <time> 单位
-
返回 «[ "time" → 1 ]»
- unit 是 <frequency> 单位
-
返回 «[ "frequency" → 1 ]»
- unit 是 <resolution> 单位
-
返回 «[ "resolution" → 1 ]»
- unit 是 <flex> 单位
-
返回 «[ "flex" → 1 ]»
- 其他情况
-
返回失败。
在所有情况下,关联的 百分比提示 为空。
-
用 type1 的新副本替换 type1,用 type2 的新副本替换 type2。让 finalType 成为一个新的 类型,初始为一个空的 有序映射 和一个初始为 null 的 百分比提示。
-
- 如果 type1 所有具有非零值的 条目 都在 type2 中具有相同的值,并且反之亦然
-
将 type1 的所有 条目 复制到 finalType,然后将 type2 的所有 条目 复制到 finalType,这些条目尚未包含在 finalType 中。将 finalType 的 百分比提示 设置为 type1 的 百分比提示。返回 finalType。
- 如果 type1 和/或 type2 包含非零值的 "percent", 且 type1 和/或 type2 包含非 "percent" 的键,且其值非零
-
对于每个非 "percent" 的 基本类型 hint:
-
暂时将百分比提示 应用 到 type1 和 type2。
-
如果之后,type1 中所有具有非零值的条目都在 type2 中具有相同的值,并且反之亦然, 则将 type1 的所有条目复制到 finalType,然后将 type2 的所有条目复制到 finalType,这些条目尚未包含在 finalType 中。将 finalType 的 百分比提示 设置为 hint。返回 finalType。
-
否则,恢复 type1 和 type2 到此循环开始时的状态。
如果循环完成而没有返回 finalType,则这些类型不能相加。返回失败。
注意: 在某些情况下,你可以通过仅检查 type1 和 type2 的值之和来简化此过程。如果总和不同,这些类型不能相加。
-
- 否则
-
这些类型不能相加。返回失败。
-
用 type1 的新副本替换 type1,用 type2 的新副本替换 type2。让 finalType 成为一个新的 类型,初始为一个空的 有序映射 和一个初始为空的 百分比提示。
-
如果 type1 和 type2 都有非空的 百分比提示 且值不同, 则类型无法相乘。返回失败。
-
如果 type1 有一个非空的 百分比提示 hint, 而 type2 没有,应用百分比提示 hint 到 type2。
反之亦然,如果 type2 有非空的 百分比提示, 而 type1 没有。
-
将 type1 的所有 条目 复制到 finalType, 然后 对于每个 baseType → power 的 type2:
-
如果 finalType[baseType] 存在, 则其值加 power。
-
否则,将 finalType[baseType] 设置为 power。
-
-
返回 finalType。
-
如果 类型 仅包含一个非零的 条目,即 «[ "length" → 1 ]»,则它匹配 <length>。 同样适用于 <angle>、<time>、<frequency>、<resolution> 和 <flex>。
如果使用该值的上下文不允许 <percentage>, 则 类型 必须还具有空的 百分比提示,以被认为是 匹配。
-
如果 类型 的唯一非零 条目 是 «[ "percent" → 1 ]», 则它匹配 <percentage>。
-
如果 类型 的唯一非零 条目 是 «[ "length" → 1 ]» 或 «[ "percent" → 1 ]»,则它匹配 <length-percentage>。 同样适用于 <angle-percentage>、<time-percentage>,等等。
-
如果使用该值的上下文不允许 <percentage>, 则 类型 必须还具有空的 百分比提示,以被认为是 匹配。
注意: 类型 在加法下形成半群, 并在乘法下形成幺半群(乘法的恒等元是 «[ ]»,其 百分比提示 为空), 这意味着它们是结合律和交换律的。因此,规范可以,例如,添加 无限制数量的类型,而无需手动 逐对添加。
4.3.3. 数值 + 单位:CSSUnitValue
对象
可以用一个单一单位(或纯数字或百分比)表示的数值
表示为 CSSUnitValue
。
CSSUnitValue
表示,
其 value
属性设置为 5
,unit
属性设置为 "px"
。
同样,样式表中的值 10
将由一个 CSSUnitValue
表示,
其 value
属性设置为 10
,unit
属性设置为 "number"
。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSUnitValue CSSNumericValue {constructor (double ,
value USVString );
unit attribute double ;
value readonly attribute USVString ; };
unit
CSSUnitValue(value, unit)
构造函数在调用时,必须执行以下步骤:
CSSUnitValue
对象, 其 value
内部槽设置为
num,并且其 unit
内部槽设置为 unit。
注意: 这是一个规范内部算法,旨在使算法中需要时更容易创建单位值。
4.3.4. 复杂的数值:CSSMathValue
对象
比单一值+单位更复杂的数值由 CSSMathValue
子类构成的树来表示,最终在叶节点处终止为 CSSUnitValue
对象。CSS 中的 calc()、min() 和 max() 函数就是以这种方式表示的。
CSSMathSum
表示,如 CSSMathSum(CSS.em(1), CSS.px(5))
。
一个更复杂的表达式,例如 calc(1em + 5px * 2),将由一个嵌套结构表示,
如 CSSMathSum(CSS.em(1), CSSMathProduct(CSS.px(5), 2))
。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathValue CSSNumericValue {readonly attribute CSSMathOperator operator ; }; [Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathSum CSSMathValue {constructor (CSSNumberish ...);
args readonly attribute CSSNumericArray ; }; [
values Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathProduct CSSMathValue {constructor (CSSNumberish ...);
args readonly attribute CSSNumericArray ; }; [
values Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathNegate CSSMathValue {constructor (CSSNumberish );
arg readonly attribute CSSNumericValue ; }; [
value Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathInvert CSSMathValue {constructor (CSSNumberish );
arg readonly attribute CSSNumericValue ; }; [
value Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathMin CSSMathValue {constructor (CSSNumberish ...);
args readonly attribute CSSNumericArray ; }; [
values Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathMax CSSMathValue {constructor (CSSNumberish ...);
args readonly attribute CSSNumericArray ; }; [
values Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMathClamp CSSMathValue {constructor (CSSNumberish ,
lower CSSNumberish ,
value CSSNumberish );
upper readonly attribute CSSNumericValue ;
lower readonly attribute CSSNumericValue ;
value readonly attribute CSSNumericValue ; }; [
upper Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface {
CSSNumericArray iterable <CSSNumericValue >;readonly attribute unsigned long length ;getter CSSNumericValue (unsigned long ); };
index enum {
CSSMathOperator ,
"sum" ,
"product" ,
"negate" ,
"invert" ,
"min" ,
"max" , };
"clamp"
注意: CSSMathValue 作为一个纯粹的超类,不能被直接构造。 它仅仅存在于承载所有“数学”运算的通用属性。
CSSMathValue
this 的 operator
属性,返回以下字符串,具体取决于 this 的接口:
CSSMathSum
-
"sum"
CSSMathProduct
-
"product"
CSSMathMin
-
"min"
CSSMathMax
-
"max"
CSSMathClamp
-
"clamp"
CSSMathNegate
-
"negate"
CSSMathInvert
-
"invert"
注意: 这些都是 CSSMathOperator
枚举的实例。
CSSMathSum(...args)
构造函数必须在调用时执行以下步骤:
-
如果 args 为空,抛出
SyntaxError
。 -
返回一个新的
CSSMathSum
,其values
内部槽设置为 args。
CSSMathMin(...args)
和 CSSMathMax(...args)
构造函数的定义与上述相同,只是在最后一步中,它们分别返回新的 CSSMathMin
或 CSSMathMax
对象。
CSSMathProduct(...args)
构造函数的定义与上述相同,除了第 3 步中它 相乘 类型而不是 相加,并且在最后一步它返回一个 CSSMathProduct
。
CSSMathClamp(lower, value, upper)
构造函数必须在调用时执行以下步骤:
CSSMathNegate(arg)
构造函数必须在调用时执行以下步骤:
-
将 arg 替换为通过 调整数值 得到的 arg。
-
返回一个新的
CSSMathNegate
,其value
内部槽设置为 arg。
CSSMathInvert(arg)
构造函数的定义与上述相同,只是在最后一步返回一个新的 CSSMathInvert
对象。
length
属性表示 CSSNumericArray
中包含的 CSSNumericValue
的数量。
索引属性获取器 用于从 CSSNumericArray
中检索提供索引的 CSSNumericValue
。
4.3.5. 数值工厂函数
以下工厂函数可以用来创建新的数值,比直接使用构造函数的方式更加简洁。
partial namespace CSS {CSSUnitValue (
number double );
value CSSUnitValue (
percent double ); // <length>
value CSSUnitValue (
cap double );
value CSSUnitValue (
ch double );
value CSSUnitValue (
em double );
value CSSUnitValue (
ex double );
value CSSUnitValue (
ic double );
value CSSUnitValue (
lh double );
value CSSUnitValue (
rcap double );
value CSSUnitValue (
rch double );
value CSSUnitValue (
rem double );
value CSSUnitValue (
rex double );
value CSSUnitValue (
ric double );
value CSSUnitValue (
rlh double );
value CSSUnitValue (
vw double );
value CSSUnitValue (
vh double );
value CSSUnitValue (
vi double );
value CSSUnitValue (
vb double );
value CSSUnitValue (
vmin double );
value CSSUnitValue (
vmax double );
value CSSUnitValue (
svw double );
value CSSUnitValue (
svh double );
value CSSUnitValue (
svi double );
value CSSUnitValue (
svb double );
value CSSUnitValue (
svmin double );
value CSSUnitValue (
svmax double );
value CSSUnitValue (
lvw double );
value CSSUnitValue (
lvh double );
value CSSUnitValue (
lvi double );
value CSSUnitValue (
lvb double );
value CSSUnitValue (
lvmin double );
value CSSUnitValue (
lvmax double );
value CSSUnitValue (
dvw double );
value CSSUnitValue (
dvh double );
value CSSUnitValue (
dvi double );
value CSSUnitValue (
dvb double );
value CSSUnitValue (
dvmin double );
value CSSUnitValue (
dvmax double );
value CSSUnitValue (
cqw double );
value CSSUnitValue (
cqh double );
value CSSUnitValue (
cqi double );
value CSSUnitValue (
cqb double );
value CSSUnitValue (
cqmin double );
value CSSUnitValue (
cqmax double );
value CSSUnitValue (
cm double );
value CSSUnitValue (
mm double );
value CSSUnitValue (
Q double );
value CSSUnitValue (
in double );
value CSSUnitValue (
pt double );
value CSSUnitValue (
pc double );
value CSSUnitValue (
px double ); // <angle>
value CSSUnitValue (
deg double );
value CSSUnitValue (
grad double );
value CSSUnitValue (
rad double );
value CSSUnitValue (
turn double ); // <time>
value CSSUnitValue (
s double );
value CSSUnitValue (
ms double ); // <frequency>
value CSSUnitValue (
Hz double );
value CSSUnitValue (
kHz double ); // <resolution>
value CSSUnitValue (
dpi double );
value CSSUnitValue (
dpcm double );
value CSSUnitValue (
dppx double ); // <flex>
value CSSUnitValue (
fr double ); };
value
CSSUnitValue
,其
value
内部槽位设置为 value,其 unit
内部槽位设置为在此处定义的方法名称。
注意:
使用的单位与函数的当前名称无关,即使它存储在另一个变量中;let foo = CSS.px; let val = foo(5);
不会返回
{value: 5, unit: "foo"}
的 CSSUnitValue
。上述关于名称的说明仅作为简写方式,以避免为所有约60个函数单独定义单位。
上述方法列表反映了CSS在某一特定时间点的有效预定义单位集合。此列表会随着时间更新,但在任何时刻都可能是过时的。如果某个实现支持附加的CSS单位,而这些单位没有在上述列表中定义的对应方法,但这些单位与现有的 CSSNumericType
值相对应,则该实现必须另外支持这些方法,方法名应与单位的规范大小写一致,并使用上面定义的通用行为。
如果某个实现支持的单位与现有的 CSSNumericType
值不对应,则该实现不得在此规范中定义的API中支持这些单位;应请求将这些单位及其类型显式添加到此规范中,因为从单位推导出适当的类型名称不是隐式的。
如果某个实现不支持给定单位,则不得实现该单位在上述列表中的对应方法。
CSS.dB()
和 CSS.st()
方法。
4.4. CSSTransformValue
objects
CSSTransformValue
对象表示 <transform-list> 值,
用于 transform 属性。
它们“包含”一个或多个 CSSTransformComponent
,
这些组件表示单个 <transform-function> 值。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSTransformValue CSSStyleValue {constructor (sequence <CSSTransformComponent >);
transforms iterable <CSSTransformComponent >;readonly attribute unsigned long length ;getter CSSTransformComponent (unsigned long );
index setter CSSTransformComponent (unsigned long ,
index CSSTransformComponent );
val readonly attribute boolean is2D ;DOMMatrix toMatrix (); };
A CSSTransformValue
的
迭代值 是一个 列表,其中包含 CSSTransformComponent
。
CSSTransformValue(transforms)
构造函数在调用时必须执行以下步骤:
-
返回一个新的
CSSTransformValue
, 其 迭代值 为 transforms。
toMatrix()
方法必须在调用时执行以下步骤:
length
属性表示 CSSTransformValue
中包含的变换组件的数量。
它们有一个 [[values]]
内部槽,
这是一个 列表,其中包含
CSSTransformComponent
对象。
这个列表是对象的 迭代值。
CSSTransformValue
this 的 支持的属性索引 是大于或等于 0 且小于 this 的 [[values]]
内部槽的 大小
的整数。
要 确定索引属性的值,
this 和索引 n,让 values 是 this 的 [[values]]
内部槽,并返回 values[n]。
要 设置现有索引属性的值,
this 的一个索引 n 和一个值 new value,让 values 是 this 的
[[values]]
内部槽,并将 values[n] 设置为 new value。
要 设置新的索引属性的值,
this 的一个索引 n 和一个值 new value,让 values 是 this 的
[[values]]
内部槽。
如果 n 不等于 values 的 大小,抛出 RangeError
。
否则,追加 new value 到 values。
typedef (CSSNumericValue or CSSKeywordish ); [
CSSPerspectiveValue Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface {
CSSTransformComponent stringifier ;attribute boolean is2D ;DOMMatrix toMatrix (); }; [Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSTranslate CSSTransformComponent {constructor (CSSNumericValue ,
x CSSNumericValue ,
y optional CSSNumericValue );
z attribute CSSNumericValue ;
x attribute CSSNumericValue ;
y attribute CSSNumericValue ; }; [
z Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSRotate CSSTransformComponent {constructor (CSSNumericValue );
angle constructor (CSSNumberish ,
x CSSNumberish ,
y CSSNumberish ,
z CSSNumericValue );
angle attribute CSSNumberish x ;attribute CSSNumberish y ;attribute CSSNumberish z ;attribute CSSNumericValue ; }; [
angle Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSScale CSSTransformComponent {constructor (CSSNumberish ,
x CSSNumberish ,
y optional CSSNumberish );
z attribute CSSNumberish x ;attribute CSSNumberish y ;attribute CSSNumberish z ; }; [Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSSkew CSSTransformComponent {constructor (CSSNumericValue ,
ax CSSNumericValue );
ay attribute CSSNumericValue ;
ax attribute CSSNumericValue ; }; [
ay Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSSkewX CSSTransformComponent {constructor (CSSNumericValue );
ax attribute CSSNumericValue ; }; [
ax Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSSkewY CSSTransformComponent {constructor (CSSNumericValue );
ay attribute CSSNumericValue ; }; /* 请注意,skew(x,y) 与 skewX(x) 和 skewY(y) 并不相同, 因此它们有各自的接口。 */ [
ay Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSPerspective CSSTransformComponent {constructor (CSSPerspectiveValue );
length attribute CSSPerspectiveValue ; }; [
length Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSMatrixComponent CSSTransformComponent {constructor (DOMMatrixReadOnly ,
matrix optional CSSMatrixComponentOptions = {});
options attribute DOMMatrix ; };
matrix dictionary {
CSSMatrixComponentOptions boolean ; };
is2D
is2D
属性表示变换是二维还是三维。
当它为true
时,与3D变换相关的属性(例如CSSTranslate.z
属性)对它们表示的变换不产生影响。
注意: 这会影响对象的序列化以及类似于对象的"等效4x4矩阵"等概念。
is2D
设计考虑
出于兼容性的原因,2D和3D变换是不同的,即使它们有相同的效果; 一个translateZ(0px)在页面上有可观察的效果, 即使它被定义为一个单位变换, 因为UA为该元素激活了一些基于3D的优化。
有几种可能的方法来反映这一点——可以使用可为空的3D相关属性、单独的2D和3D接口等等, 但我们选择了当前的设计(一个由作者控制的开关来决定行为), 因为它允许作者在大多数情况下不必关心变换是2D还是3D, 但也防止了"意外"将2D变换转换为3D。
toMatrix()
方法必须在调用时执行以下步骤:
CSSTranslate(x, y, z)
构造函数必须在调用时执行以下步骤:
CSSRotate(angle)
构造器必须在调用时执行以下步骤:
CSSRotate(x, y, z, angle)
构造器必须在调用时执行以下步骤:
CSSScale(x, y, z)
构造器必须在调用时执行以下步骤:
CSSSkew(ax, ay)
构造器必须在调用时执行以下步骤:
CSSSkewX(ax)
构造器必须在调用时执行以下步骤:
CSSSkewY(ay)
构造器必须在调用时执行以下步骤:
CSSPerspective(length)
构造器必须在调用时执行以下步骤:
-
如果 length 是一个
CSSNumericValue
: -
否则(即,如果 length 不是
CSSNumericValue
):-
从 length 纠正为关键字类型值,然后将 length 设置为结果的值。
-
如果 length 表示的值不是与关键字 none 的 ASCII 不区分大小写 匹配, 则 抛出 一个
TypeError
错误。
-
-
返回一个新的
CSSPerspective
对象,设置其内部槽length
为 length,并将其is2D
内部槽设置为false
。
is2D
属性必须在设置时不做任何操作。
注意: perspective() 函数总是表示 3D 变换。
CSSMatrixComponent(matrix, options)
构造器必须在调用时执行以下步骤:
CSSTransformComponent
可以对应多个底层变换函数。
例如,一个 CSSTranslate
,其
x 值为 10px,y 和 z 值为 0px,可以表示以下任一情况:
-
translate(10px)
-
translate(10px, 0)
-
translateX(10px)
-
translate3d(10px, 0, 0)
然而,在序列化时,它将始终打印为 translate(10px, 0px) 或 translate3d(10px, 0px,
0px),取决于其 is2D
内部槽是 true
还是 false
。
4.5. CSSImageValue
对象
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSImageValue CSSStyleValue { };
CSSImageValue
对象表示用于接受 <image>
生成的属性的值,例如 background-image、list-style-image 和 border-image-source。
注意: 此对象是有意保持不透明的,不暴露任何图像类型或图像的任何方面。这是因为需要表示图像以支持自定义绘制(Custom Paint),但由于处理 URL 和加载规范方面的复杂性,在本规范的时间表内难以完全明确。这将在未来的规范版本中得到扩展。
如果一个 CSSImageValue
对象表示包含 URL 的 <image>(例如
url() 或 image()),则此类值的处理方式与当前 CSS 的处理方式相同。特别是,解析相对 URL 或片段 URL 的行为与普通 CSS 相同。
style
元素或
style
属性中指定的,则相对于文档的 URL)。这种解析不是在解析时立即发生,而是在值计算期间的某个未指定的时间点进行。
因此,如果一个元素的样式设置为 background-image: url(foo);,并通过类型化对象模型(Typed OM)提取出该指定值,然后将其设置到另一个文档中的元素上,那么源元素和目标元素将会不同地解析该 URL,因为它们提供了不同的基准 URL。
另一方面,如果提取的值是 计算值(通过 computedStyleMap()
获得),那么它已经被解析为绝对 URL,因此无论你将它设置到哪里,它的行为都是相同的。(除非它是一个片段 URL,CSS 对此的处理不同,永远不会完全解析片段 URL,因此它始终是相对于当前文档进行解析的。)
4.6. CSSColorValue
对象
CSSColorValue
对象表示 <color> 值。它是一个抽象超类,子类代表各个 CSS 颜色函数。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSColorValue CSSStyleValue { [Exposed =Window ]static (CSSColorValue or CSSStyleValue )parse (USVString ); };
cssText
parse(cssText)
方法在调用时必须执行以下步骤:
-
解析 cssText 为 <color>,并让 result 是结果。如果 result 是语法错误, 抛出
SyntaxError
并中止此算法。 -
将颜色值具体化 从 result,并返回该结果。
多个 IDL 类型被定义用于 CSSColorValue
中:
typedef (CSSNumberish or CSSKeywordish );
CSSColorRGBComp typedef (CSSNumberish or CSSKeywordish );
CSSColorPercent typedef (CSSNumberish or CSSKeywordish );
CSSColorNumber typedef (CSSNumberish or CSSKeywordish );
CSSColorAngle
所有这些类型在类型签名上是相同的,但它们表示不同的值:CSSColorRGBComp
表示一个规范上为 <number>、<percentage> 或关键字 none
的值;CSSColorPercent
表示一个规范上为 <percentage> 或关键字 none
的值;CSSColorNumber
表示一个规范上为 <number> 或关键字
none 的值;CSSColorAngle
表示一个规范上为 <angle> 或关键字 none 的值。
它们对应的整形算法也各有不同,用于将 double
值转换为 CSSNumericValue
。
-
如果 val 是
CSSNumericValue
,并且它 匹配 <number> 或 <percentage>,则返回 val。 -
如果 val 是
CSSKeywordValue
,并且它的value
内部槽是 ASCII 不区分大小写 匹配"none"
,则返回 val。 -
抛出
SyntaxError
。
-
如果 val 是
CSSNumericValue
,并且它 匹配 <percentage>,则返回 val。 -
如果 val 是
CSSKeywordValue
,并且它的value
内部槽是 ASCII 不区分大小写 匹配"none"
,则返回 val。 -
抛出
SyntaxError
。
-
如果 val 是
CSSNumericValue
,并且它 匹配 <number>,则返回 val。 -
如果 val 是
CSSKeywordValue
,并且它的value
内部槽是 ASCII 不区分大小写 匹配"none"
,则返回 val。 -
抛出
SyntaxError
。
-
如果 val 是
CSSNumericValue
,并且它 匹配 <angle>,则返回 val。 -
如果 val 是
CSSKeywordValue
,并且它的value
内部槽是 ASCII 不区分大小写 匹配"none"
,则返回 val。 -
抛出
TypeError
。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSRGB CSSColorValue {(
constructor CSSColorRGBComp ,
r CSSColorRGBComp ,
g CSSColorRGBComp ,
b optional CSSColorPercent = 1);
alpha attribute CSSColorRGBComp r ;attribute CSSColorRGBComp g ;attribute CSSColorRGBComp b ;attribute CSSColorPercent alpha ; };
CSSRGB
类表示 CSS rgb()/rgba() 函数。
CSSRGB(r, g, b, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
用 整形 CSSColorRGBComp 的结果替换 r、g 和 b。用 整形 CSSColorPercent 的结果替换 alpha。
alpha
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorPercent 并将相应的内部槽设置为该结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSHSL CSSColorValue {(
constructor CSSColorAngle ,
h CSSColorPercent ,
s CSSColorPercent ,
l optional CSSColorPercent = 1);
alpha attribute CSSColorAngle h ;attribute CSSColorPercent s ;attribute CSSColorPercent l ;attribute CSSColorPercent alpha ; };
CSSHSL
类表示 CSS hsl()/hsla() 函数。
CSSHSL(h, s, l, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 h 替换为从其整形的 CSSColorAngle 结果。将 s、l 和 alpha 替换为从它们各自整形的 CSSColorPercent 结果。
h
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorAngle 并将相应的内部槽设置为该结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSHWB CSSColorValue {(
constructor CSSNumericValue ,
h CSSNumberish ,
w CSSNumberish ,
b optional CSSNumberish = 1);
alpha attribute CSSNumericValue h ;attribute CSSNumberish w ;attribute CSSNumberish b ;attribute CSSNumberish alpha ; };
CSSHWB(h, w, b, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 h 替换为从其整形的 CSSColorAngle 结果。将 w、b 和 alpha 替换为从它们各自整形的 CSSColorPercent 结果。
h
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorAngle 并将相应的内部槽设置为该结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSLab CSSColorValue {(
constructor CSSColorPercent ,
l CSSColorNumber ,
a CSSColorNumber ,
b optional CSSColorPercent = 1);
alpha attribute CSSColorPercent l ;attribute CSSColorNumber a ;attribute CSSColorNumber b ;attribute CSSColorPercent alpha ; };
CSSLab(l, a, b, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 a 和 b 替换为从它们各自整形的 CSSColorNumber 结果。将 l 和 alpha 替换为从它们整形的 CSSColorPercent 结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSLCH CSSColorValue {(
constructor CSSColorPercent ,
l CSSColorPercent ,
c CSSColorAngle ,
h optional CSSColorPercent = 1);
alpha attribute CSSColorPercent l ;attribute CSSColorPercent c ;attribute CSSColorAngle h ;attribute CSSColorPercent alpha ; };
CSSLCH(l, c, h, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 h 替换为从中整形的 CSSColorAngle 结果。将 l、c 和 alpha 替换为从中整形的 CSSColorPercent 结果。
h
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorAngle 并将相应的内部槽设置为该结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSOKLab CSSColorValue {(
constructor CSSColorPercent ,
l CSSColorNumber ,
a CSSColorNumber ,
b optional CSSColorPercent = 1);
alpha attribute CSSColorPercent l ;attribute CSSColorNumber a ;attribute CSSColorNumber b ;attribute CSSColorPercent alpha ; };
CSSOKLab(l, a, b, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 a 和 b 替换为从中整形的 CSSColorNumber 结果。将 l 和 alpha 替换为从中整形的 CSSColorPercent 结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSOKLCH CSSColorValue {(
constructor CSSColorPercent ,
l CSSColorPercent ,
c CSSColorAngle ,
h optional CSSColorPercent = 1);
alpha attribute CSSColorPercent l ;attribute CSSColorPercent c ;attribute CSSColorAngle h ;attribute CSSColorPercent alpha ; };
CSSOKLCH(l, c, h, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 h 替换为从中整形的 CSSColorAngle 结果。将 l、c 和 alpha 替换为从中整形的 CSSColorPercent 结果。
h
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorAngle 并将相应的内部槽设置为该结果。
[Exposed =(Window ,Worker ,PaintWorklet ,LayoutWorklet )]interface :
CSSColor CSSColorValue {(
constructor CSSKeywordish ,
colorSpace sequence <CSSColorPercent >,
channels optional CSSNumberish = 1);
alpha attribute CSSKeywordish colorSpace ;attribute ObservableArray <CSSColorPercent >;
channels attribute CSSNumberish alpha ; };
CSSColor(colorSpace, channels, optional alpha)
构造函数在调用时,必须执行以下步骤:
-
将 colorSpace 替换为从中整形的 关键字值 结果。将 channels 中的每一项替换为从中整形的 CSSColorPercent 结果。将 alpha 替换为从中整形的 CSSColorPercent 结果。
-
返回一个新的
CSSColor
,其colorSpace
、channels
和alpha
内部槽分别设置为 colorSpace、channels 和 alpha。
colorSpace
属性在设置为新值 val 时,必须从 val
中 整形关键字值 并将相应的内部槽设置为该结果。
alpha
属性在设置为新值 val 时,必须从 val 中 整形
CSSColorPercent 并将相应的内部槽设置为该结果。
5. CSSStyleValue
实体化
本节描述了如何通过 内部表示 构建 Typed OM 对象的过程,称为 实体化。
一些适用于所有 实体化 的一般原则不在每个具体实例中说明:
-
如果 内部表示 来自于 列表值 属性,则该列表定义了如何实体化该属性的单个迭代;多个迭代通过从
StylePropertyMap
.getAll()
返回多个值来反映。
5.1. 特定属性规则
以下列表定义了 CSS 中每个属性的 实体化 行为,包括指定值和计算值。
- 未注册的 自定义属性
-
对于指定值和计算值,从值中实体化组件值列表,并返回结果。
- 已注册的 自定义属性
-
根据 CSS Properties and Values API 1 § 6.2 CSSStyleValue 实体化 的描述进行实体化。
- align-content
- align-items
-
对于指定值和计算值:
-
如果值是 normal 或 stretch,从值中实体化标识符,并返回结果。
-
如果值是 baseline 或 first baseline,实体化标识符 "baseline",并返回结果。
-
如果值是一个 <self-position> 且没有 <overflow-position>,从值中实体化标识符,并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- align-self
-
对于指定值和计算值:
-
如果值是 auto,normal,或 stretch,从值中实体化标识符,并返回结果。
-
如果值是 baseline 或 first baseline,实体化标识符 "baseline",并返回结果。
-
如果值是一个 <self-position> 且没有 <overflow-position>,从值中实体化标识符,并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- alignment-baseline
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- all
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- animation-composition
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- appearance
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- azimuth
-
- 对于指定值:
-
-
如果值是单个关键词,从值中实体化标识符,并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
- 对于计算值:
-
从角度值中实体化数值,并返回结果。
- backdrop-filter
-
对于指定值和计算值:
-
如果值是 none,从值中实体化标识符,并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- backface-visibility
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- background
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - background-attachment
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- background-blend-mode
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- background-clip
-
对于指定值和计算值,从值中实体化标识符,并返回结果。
- background-color
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - background-image
-
对于指定值和计算值:
-
如果值是 none,从值中实体化标识符,并返回结果。
-
如果值是一个 url() 函数,从值中实体化 url 并返回结果。
-
否则,从值中实体化图像 并返回结果。
-
- background-position
-
对于指定值和计算值,从值中实体化位置,并返回结果。
- background-repeat
-
对于指定值和计算值:
-
如果值是单个关键词或相同关键词重复两次,从关键词中实体化标识符并返回结果。
-
如果值是 repeat no-repeat,实体化标识符 "repeat-x" 并返回结果。
-
如果值是 no-repeat repeat,实体化标识符 "repeat-y" 并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- baseline-shift
-
对于指定值和计算值:
- block-size
-
与 width 相同。
- block-step
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - block-step-align
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- block-step-insert
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- block-step-round
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- block-step-size
-
对于指定值和计算值:
- bookmark-label
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - bookmark-level
-
对于指定值和计算值:
- bookmark-state
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- border
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-block
-
与 border-block-start 相同。
- border-block-color
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-block-end
-
与 border-block-start 相同。
- border-block-end-color
-
与 border-top-color 相同。
- border-block-end-style
-
与 border-top-style 相同。
- border-block-end-width
-
与 border-top-width 相同。
- border-block-start
-
与 border-top 相同。
- border-block-start-color
-
与 border-top-color 相同。
- border-block-start-style
-
与 border-top-style 相同。
- border-block-start-width
-
与 border-top-width 相同。
- border-block-style
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-block-width
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-bottom
-
与 border-top 相同。
- border-bottom-color
-
与 border-top-color 相同。
- border-bottom-style
-
与 border-top-style 相同。
- border-bottom-width
-
与 border-top-width 相同。
- border-boundary
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- border-collapse
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- border-color
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-inline
- border-inline-color
- border-inline-end
- border-inline-end-color
- border-inline-end-style
- border-inline-end-width
- border-inline-start
- border-inline-start-color
- border-inline-start-style
- border-inline-start-width
- border-inline-style
- border-inline-width
- border-left
-
与 border-top 相同。
- border-left-color
-
与 border-top-color 相同。
- border-left-style
-
与 border-top-style 相同。
- border-left-width
-
与 border-top-width 相同。
- border-radius
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-right
-
与 border-top 相同。
- border-right-color
-
与 border-top-color 相同。
- border-right-style
-
与 border-top-style 相同。
- border-right-width
-
与 border-top-width 相同。
- border-spacing
- border-style
- border-top
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - border-top-color
-
对于指定值和计算值:
-
如果值为 currentcolor,从值中实体化标识符并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- border-top-style
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- border-top-width
-
对于指定值和计算值:
- border-width
-
对于指定值和计算值,实体化为
CSSStyleValue
并返回结果。 - bottom
-
对于指定值和计算值:
- box-decoration-break
- box-sizing
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- box-snap
- break-after
- break-before
- break-inside
- caption-side
- caret
- caret-color
-
对于指定值和计算值:
-
如果值为 currentcolor,从值中实体化标识符并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- caret-shape
- clear
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- clip
- clip-path
- clip-rule
- color
-
对于指定值和计算值:
-
如果值为 currentcolor,从值中实体化标识符并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- color-adjust
- color-interpolation
- color-rendering
- column-gap
- column-span
- contain
- content
- continue
- copy-into
- counter-increment
- counter-reset
- counter-set
- cue
- cue-after
- cue-before
- cursor
- cx
- cy
- d
- direction
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- display
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- dominant-baseline
- elevation
- empty-cells
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- fill
- fill-break
- fill-color
- fill-image
- fill-opacity
- fill-origin
- fill-position
- fill-repeat
- fill-rule
- fill-size
- 'filter-margin-top, filter-margin-right, filter-margin-bottom, filter-margin-left'
- flex
- flex-basis
- flex-direction
- flex-flow
- flex-grow
- flex-shrink
- flex-wrap
- float
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- float-defer
- font
-
对于指定值和计算值, 实体化为
CSSStyleValue
并返回结果。 - font-family
-
对于指定值和计算值, 实体化为
CSSStyleValue
并返回结果。 - font-language-override
-
对于指定值和计算值:
-
如果值为 normal,从值中实体化标识符并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- font-optical-sizing
-
对于指定值和计算值,从值中实体化标识符并返回结果。
- font-palette
-
对于指定值和计算值:
-
如果值为 normal, light 或 dark,从值中实体化标识符并返回结果。
-
否则,实体化为
CSSStyleValue
并返回结果。
-
- font-size
-
对于指定值和计算值:
-
如果值为 <absolute-size> 或 <relative-size>,从值中实体化标识符并返回结果。
-
否则,从值中实体化数值并返回结果。
-
- font-size-adjust
-
对于指定值和计算值:
- font-stretch
-
对于指定值和计算值:
-
如果值为 <percentage>,从值中实体化数值并返回结果。
-
否则,从值中实体化标识符并返回结果。
-
- font-style
-
对于指定值和计算值,具象化标识符,并返回结果。
- font-synthesis
-
对于指定值和计算值:
-
如果值为 none,weight,style 或 small-caps,具象化标识符 并返回结果。
-
否则,将其具象化为
CSSStyleValue
并返回结果。
-
- font-variant
-
对于指定值和计算值,将其具象化为
CSSStyleValue
并返回结果。 - font-variant-alternates
-
对于指定值和计算值:
-
如果值为 none 或 historical-forms,具象化标识符 并返回结果。
-
否则,将其具象化为
CSSStyleValue
并返回结果。
-
- font-variant-emoji
-
对于指定值和计算值,具象化标识符 并返回结果。
- font-variation-settings
-
对于指定值和计算值:
-
如果值为 normal,具象化标识符 并返回结果。
-
否则,将其具象化为
CSSStyleValue
并返回结果。
-
- font-weight
-
对于指定值和计算值:
- gap
- globalcompositeoperation
- glyph-orientation-vertical
- grid
- grid-area
- grid-auto-columns
- grid-auto-flow
- grid-auto-rows
- grid-column
- grid-column-end
- grid-column-gap
- grid-column-start
- grid-gap
- grid-row
- grid-row-end
- grid-row-gap
- grid-row-start
- grid-template
- grid-template-areas
- grid-template-columns
- grid-template-rows
- height
-
对于指定值和计算值:
-
如果值为 auto,具象化标识符 并返回结果。
-
如果值为 <length> 或 <percentage>,具象化数值 并返回结果。
-
- image-rendering
- image-resolution
- initial-letter
- initial-letter-align
- initial-letter-wrap
- inline-size
- inset
- inset-block
- inset-block-end
- inset-block-start
- inset-inline
- inset-inline-end
- inset-inline-start
- isolation
- justify-content
- justify-items
- justify-self
- left
-
对于指定值和计算值:
- letter-spacing
- line-grid
- line-height
-
对于指定值和计算值:
- line-height-step
- line-snap
- list-style
- list-style-image
-
对于指定值和计算值:
- list-style-position
-
对于指定值和计算值,具象化标识符 并返回结果。
- list-style-type
- margin
-
对于指定值和计算值,将其具象化为
CSSStyleValue
并返回结果。 - margin-block
- margin-block-end
- margin-block-start
- margin-bottom
-
与 margin-top 相同。
- margin-inline
- margin-inline-end
- margin-inline-start
- margin-left
-
与 margin-top 相同。
- margin-right
-
与 margin-top 相同。
- margin-top
-
对于指定值和计算值:
- marker
- marker-end
- marker-mid
- marker-side
- marker-start
- mask
- mask-border
- mask-border-mode
- mask-border-outset
- mask-border-repeat
- mask-border-slice
- mask-border-source
- mask-border-width
- mask-clip
- mask-composite
- mask-image
-
对于指定值和计算值:
- mask-mode
- mask-origin
- mask-position
- mask-repeat
- mask-size
- mask-type
- max-block-size
- max-height
- max-inline-size
- max-lines
- max-width
- min-block-size
- min-height
- min-inline-size
- min-width
- mix-blend-mode
- nav-down
- nav-left
- nav-right
- nav-up
- object-fit
- offset
- offset-anchor
- offset-distance
- offset-path
- offset-position
- offset-rotate
- opacity
-
对于指定值和计算值,从值中 具象化数值 并返回结果。
- order
- orphans
- outline
- outline-color
-
对于指定值和计算值:
-
如果值为 currentcolor,从值中具象化标识符 并返回结果。
-
否则,将其具象化为
CSSStyleValue
并返回结果。
-
- outline-offset
- outline-style
-
对于指定值和计算值,具象化标识符 并返回结果。
- outline-width
- overflow
-
对于指定值和计算值,将其具象化为
CSSStyleValue
并返回结果。 - overflow-anchor
-
对于指定值和计算值,具象化标识符 并返回结果。
- overflow-x
-
对于指定值和计算值,具象化标识符 并返回结果。
- overflow-y
-
对于指定值和计算值,具象化标识符 并返回结果。
- padding
-
对于指定值和计算值,将其具象化为
CSSStyleValue
并返回结果。 - padding-block
- padding-block-end
- padding-block-start
- padding-bottom
-
与 padding-top 相同。
- padding-inline
- padding-inline-end
- padding-inline-start
- padding-left
-
与 padding-top 相同。
- padding-right
-
与 padding-top 相同。
- padding-top
-
对于指定值和计算值,从值中 具象化数值 并返回结果。
- page
- page-break-after
- page-break-before
- page-break-inside
- paint-order
- pause
- pause-after
- pause-before
- perspective
- perspective-origin
- pitch
- pitch-range
- place-content
- place-items
- place-self
- play-during
- pointer-events
- position
-
对于指定值和计算值,具象化标识符 并返回结果。
- presentation-level
- quotes
- r
- region-fragment
- resize
-
对于指定值和计算值,具象化标识符 并返回结果。
- rest
- rest-after
- rest-before
- richness
- right
-
对于指定值和计算值:
- rotate
- row-gap
- ruby-align
- ruby-merge
- ruby-position
- rx
- ry
- scale
- scroll-behavior
- scroll-margin
- scroll-margin-block
- scroll-margin-block-end
- scroll-margin-block-start
- scroll-margin-bottom
- scroll-margin-inline
- scroll-margin-inline-end
- scroll-margin-inline-start
- scroll-margin-left
- scroll-margin-right
- scroll-margin-top
- scroll-padding
- scroll-padding-block
- scroll-padding-block-end
- scroll-padding-block-start
- scroll-padding-bottom
- scroll-padding-inline
- scroll-padding-inline-end
- scroll-padding-inline-start
- scroll-padding-left
- scroll-padding-right
- scroll-padding-top
- scroll-snap-align
- scroll-snap-stop
- scroll-snap-type
- scrollbar-gutter
- shape-inside
- shape-margin
- shape-padding
- shape-rendering
- shape-subtract
- speak
- speak-as
- speak-header
- speak-numeral
- speak-punctuation
- speech-rate
- stop-color
- stop-opacity
- stress
- stroke
- stroke-align
- stroke-break
- stroke-color
- stroke-dash-corner
- stroke-dash-justify
- stroke-dasharray
- stroke-dashoffset
- stroke-image
- stroke-linecap
- stroke-linejoin
- stroke-miterlimit
- stroke-opacity
- stroke-origin
- stroke-position
- stroke-repeat
- stroke-size
- stroke-width
- table-layout
- text-align
-
For both specified and computed values, reify an identifier from the value and return the result.
- text-anchor
- text-combine-upright
- text-decoration
- text-decoration-fill
- text-decoration-skip
- text-decoration-skip-ink
- text-decoration-stroke
- text-decoration-thickness
- text-emphasis-skip
- text-indent
- text-orientation
- text-overflow
- text-rendering
- text-size-adjust
- text-transform
-
对于指定值和计算值,具象化标识符 并返回结果。
- text-underline-offset
- top
-
对于指定值和计算值:
- transform-style
- transition
- transition-delay
- transition-duration
- transition-property
- transition-timing-function
- translate
- unicode-bidi
- user-select
- vector-effect
- vertical-align
-
对于指定值和计算值:
- visibility
-
对于指定值和计算值,具象化标识符 并返回结果。
- voice-balance
- voice-duration
- voice-family
- voice-pitch
- voice-range
- voice-rate
- voice-stress
- voice-volume
- volume
- white-space
-
对于指定值和计算值,具象化标识符 并返回结果。
- widows
- width
-
对于指定值和计算值:
-
如果值为 auto,从值中具象化标识符 并返回结果。
-
如果值为 <length> 或 <percentage>,从值中具象化数值 并返回结果。
-
- will-change
- word-spacing
- writing-mode
- x
- y
- z-index
5.2. 不可表示的值
并非所有的内部表示都足够简单,可以通过当前的一组CSSStyleValue
子类进行具象化。
在这种情况下,该属性会针对特定属性具象化为 CSSStyleValue,确保它可作为该属性的值使用,
且仅限于此。
-
返回一个新的
CSSStyleValue
对象,表示value,其[[associatedProperty]]
内部槽位设置为property。
5.3. 原始 CSS 令牌:具有var() 引用的属性
无论该属性的语法如何,
具有未替换的var()引用的属性值
表示为列表的组件值,
该值在 Typed OM 中成为CSSUnparsedValue
。
-
用
CSSVariableReferenceValue
对象替换list中的所有var()引用, 如§ 5.4 var() 引用中所述。 -
将list中的每个剩余最大子序列组件值替换为其串联序列的单个字符串。
-
返回一个新的
CSSUnparsedValue
, 其[[tokens]]
槽位设置为list。
CSSUnparsedValue
:
-
字符串 "calc(42px + "
-
一个
CSSVariableReferenceValue
,其中:-
variable
"--foo" -
fallback
一个包含 " 15em" 的CSSUnparsedValue
-
-
字符串 " + "
-
一个
CSSVariableReferenceValue
,其中:-
variable
"--bar" -
fallback
一个包含以下序列的CSSUnparsedValue
:-
字符串 " "
-
字符串 " + 15px"
-
-
-
字符串 ")"
5.4. var() 引用
var()引用在 Typed OM 中变为CSSVariableReferenceValue
。
-
令object为一个新的
CSSVariableReferenceValue
对象。 -
将object的
variable
内部槽位设置为提供变量名称的<custom-ident>的序列化。 -
如果var有一个回退值,将object的
fallback
内部槽位设置为具象化回退的组件值的结果。否则,将其设置为null
。 -
返回object。
5.5. 标识符值
CSS标识符在 Typed OM 中变为CSSKeywordValue
。
-
返回一个新的
CSSKeywordValue
, 其value
内部槽位设置为ident的序列化。
5.6. <number>, <percentage>, 和<dimension>值
CSS <number>, <percentage>, 和<dimension>值在 Typed OM 中变为CSSNumericValue
。
-
如果num是数学函数, 从num具象化数学表达式并返回结果。
-
如果num是无单位值0,并且num是<dimension>, 返回一个新的
CSSUnitValue
,其value
内部槽位被设置为0,并且其unit
内部槽位被设置为"px"。 -
返回一个新的
CSSUnitValue
, 其value
内部槽位设置为num的数值,并且其unit
内部槽位根据num的类型设置为: "number"如果num是<number>, "percent"如果num是<percentage>, 并且num的单位如果num是<dimension>。
-
-
返回一个新的
CSSMathMin
或CSSMathMax
对象, 分别将其values
内部槽位设置为values。
-
断言:否则,num是calc()。
-
将num的参数 转换为表达式树, 使用标准的PEMDAS优先规则, 但有以下例外/说明:
-
将减法视为加法, 右侧的参数用特殊的“negate”节点包装。
-
将除法视为乘法, 右侧的参数用特殊的“invert”节点包装。
-
加法和乘法是N元的; 每个节点可以有任意数量的参数。
-
如果表达式中只有一个值, 且没有操作, 将其视为具有单个参数的加法节点。
-
-
递归地将表达式树转换为对象, 如下所示:
- 加法节点
-
变为一个新的
CSSMathSum
对象, 其values
内部槽位设置为其参数列表 - 乘法节点
-
变为一个新的
CSSMathProduct
对象, 其values
内部槽位设置为其参数列表 - 取反节点
-
变为一个新的
CSSMathNegate
对象, 其value
内部槽位设置为其参数 - 取倒节点
-
变为一个新的
CSSMathInvert
对象, 其value
内部槽位设置为其参数 - 叶节点
-
根据需要具象化
CSSMathSum( CSS.px(1), CSSMathNegate( CSSMathProduct( 2, CSS.em(3) ) ) )
CSSMathSum( CSS.px(1), CSS.px(2), CSS.px(3) )
但calc(calc(1px + 2px) + 3px)产生结构:
CSSMathSum( CSSMathSum( CSS.px(1), CSS.px(2) ), CSS.px(3) )
注意: 值的计算过程可能将不同的单位转换为相同的单位,
简化结果表达式。
例如,calc(1px + 2em)作为指定值
产生CSSMathSum(CSS.px(1), CSS.em(2))
,
但作为计算值将返回CSS.px(33)
或类似值
(取决于该上下文中的em的值)。
5.7. <color> 值
CSS <color>值将变为CSSColorValue
(如果可以解析为绝对颜色),
否则为通用CSSStyleValue
。
-
如果val是<hex-color>、 rgb()函数, 或rgba() 函数, 则返回一个新的
CSSRGB
对象, 其r
、g
、b
, 和alpha
内部槽位分别设置为其红色、绿色、蓝色和alpha分量的具象化结果。 -
如果val是hsl()或 hsla()函数, 则返回一个新的
CSSHSL
对象, 其h
、s
、l
, 和alpha
内部槽位分别设置为其色相角度、饱和度、亮度和alpha分量的具象化结果。 -
如果val是hwb() 函数, 则返回一个新的
CSSHWB
对象, 其h
、w
、b
, 和alpha
内部槽位分别设置为其色相角度、白度、黑度和alpha分量的具象化结果。 -
如果val是lch() 函数, 则返回一个新的
CSSLCH
对象, 其l
、c
、h
, 和alpha
内部槽位分别设置为其亮度、色度、色相角度和alpha分量的具象化结果。 -
如果val是lab() 函数, 则返回一个新的
CSSLab
对象, 其l
、a
、b
, 和alpha
内部槽位分别设置为其亮度、a、b和alpha分量的具象化结果。 -
如果val是color()函数, 则返回一个新的
CSSColor
对象, 其colorSpace
内部槽位设置为通过从val的颜色空间具象化标识符的结果, 其channels
内部槽位的支持列表设置为具象化 val的非alpha分量的结果, 其alpha
内部槽位 设置为具象化其alpha分量的结果。 -
如果val是<named-color>或关键字transparent, 则返回一个新的
CSSRGB
对象, 其r
、g
、b
, 和alpha
内部槽位分别设置为其红色、绿色、蓝色和alpha分量的具象化结果。 -
如果val是任何其他颜色关键字, 返回通过从val具象化标识符的结果。
5.8. <transform-list> 和 <transform-function> 值
CSS <transform-list> 值在 Typed OM 中变为CSSTransformValue
,
而 CSS <transform-function> 值变为CSSTransformComponent
。
-
返回一个新的
CSSTransformValue
, 其要遍历的值是通过对list运行具象化 <transform-function>算法的结果。
- matrix()
- matrix3d()
-
-
返回一个新的
CSSMatrixComponent
对象, 其matrix
内部槽位 被设置为表示与func相同信息的4x4矩阵, 其is2D
内部槽位 如果func是matrix()则为true
, 否则为false
。
-
- translate()
- translateX()
- translateY()
- translate3d()
- translateZ()
- translateX()
-
-
返回一个新的
CSSTranslate
对象, 其x
、y
、z
内部槽位 被设置为指定的 x/y/z 偏移的具象化结果, 或者如果func未指定,则设置为0px的具象化结果, 其is2D
内部槽位 如果func是translate()、translateX()或translateY(), 则为true
, 否则为false
。
-
- scale()
- scaleX()
- scaleY()
- scale3d()
- scaleZ()
- scaleX()
- rotate()
- rotate3d()
- rotateX()
- rotateY()
- rotateZ()
- rotate3d()
- skew()
- skewX()
- skewY()
- perspective()
-
-
返回一个新的
CSSPerspective
对象, 其length
内部槽位 被设置为指定长度的具象化结果 (参见具象化数值,如果是长度, 并且如果是关键字,则为具象化标识符), 其is2D
内部槽位为false
。
-
6. CSSStyleValue
序列化
一个CSSStyleValue
的序列化方式取决于其是如何构造的。
- 如果该值是从 USVString 构造的
-
序列化为构造该值的 USVString。
- 否则,如果该值是使用 IDL 构造函数构造的
-
序列化方式在下方各节中指定。
- 否则,如果该值是从 CSSOM 提取的
-
序列化方式在§ 6.7 从 CSSOM 值序列化中指定。
例如:
var length1= CSSNumericValue. parse( "42.0px" ); length1. toString(); // "42.0px" var length2= CSS. px( 42.0 ); length2. toString(); // "42px"; element. style. width= "42.0px" ; var length3= element. attributeStyleMap. get( 'width' ); length3. toString(); // "42px";
6.1.
CSSUnparsedValue
序列化
CSSUnparsedValue
this:
-
令s初始为空的字符串。
-
对每个item在this的
[[tokens]]
内部槽位中:-
如果item是
USVString
, 将其追加到s。 -
否则,item是
CSSVariableReferenceValue
。 将其序列化, 然后将结果追加到s。
-
-
返回s。
CSSVariableReferenceValue
this:
6.2.
CSSKeywordValue
序列化
CSSKeywordValue
this:
-
返回this的
value
内部槽位。
6.3.
CSSNumericValue
序列化
CSSNumericValue
this,
给定可选的minimum,数值,
和可选的maximum,数值:
-
如果this是一个
CSSUnitValue
, 从this中序列化一个 CSSUnitValue, 传递minimum和maximum。 返回结果。 -
否则,序列化一个 CSSMathValue, 并返回结果。
6.4. CSSUnitValue
序列化
CSSUnitValue
this,
带有可选参数minimum,数值,
和maximum,数值:
-
根据<number>, 按照CSSOM § 6.7.2 序列化 CSS 值中的规定,序列化value并设置为s。
-
如果unit是:
- "number"
-
不做任何操作。
- "percent"
-
将"%"追加到s。
- 其他
-
将unit追加到s。
-
如果传递了minimum, 并且this小于minimum, 或者传递了maximum, 并且this大于maximum, 或者传递了minimum和/或maximum, 并且当前没有足够的信息来确定this和minimum/maximum的相对大小, 在s前加上 "calc(", 然后在s后加上 ")"。
-
返回s。
6.5. CSSMathValue
序列化
CSSMathValue
this,
可选参数nested,布尔值(如果未指定则默认为false),
paren-less,布尔值(如果未指定则默认为false),
执行以下步骤:
-
将s初始化为空的字符串。
-
如果this是一个
CSSMathMin
或CSSMathMax
: -
否则,如果this是一个
CSSMathSum
:-
如果paren-less为true, 继续下一步; 否则,如果nested为true, 将"("附加到s; 否则,将"calc("附加到s。
-
对于每个arg在this的
values
内部槽中超出第一个的项:-
如果arg是
CSSMathNegate
, 将" - "附加到s, 然后序列化arg的value
内部槽, 并将nested设置为true, 然后将结果附加到s。 -
否则,将" + "附加到s, 然后将arg序列化并将nested设置为true, 并将结果附加到s。
-
-
如果paren-less为false, 将")"附加到s,
-
返回s。
-
-
否则,如果this是
CSSMathNegate
:-
如果paren-less为true, 继续下一步; 否则,如果nested为true, 将"("附加到s; 否则,将"calc("附加到s。
-
将"-"附加到s。
-
序列化this的
value
内部槽, 将nested设置为true, 并将结果附加到s。 -
如果paren-less为false, 将")"附加到s,
-
返回s。
-
-
否则,如果this是
CSSMathProduct
:-
如果paren-less为true, 继续下一步; 否则,如果nested为true, 将"("附加到s; 否则,将"calc("附加到s。
-
对于每个arg在this的
values
内部槽中超出第一个的项:-
如果arg是
CSSMathInvert
, 将" / "附加到s, 然后序列化arg的value
内部槽, 将nested设置为true, 然后将结果附加到s。 -
否则,将" * "附加到s, 然后将arg序列化并将nested设置为true, 并将结果附加到s。
-
-
如果paren-less为false, 将")"附加到s,
-
返回s。
-
-
否则,如果this是
CSSMathInvert
:-
如果paren-less为true, 继续下一步; 否则,如果nested为true, 将"("附加到s; 否则,将"calc("附加到s。
-
将"1 / "附加到s。
-
序列化this的
value
内部槽, 将nested设置为true, 并将结果附加到s。 -
如果paren-less为false, 将")"附加到s,
-
返回s。
-
6.6.
CSSTransformValue
和 CSSTransformComponent
序列化
CSSTransformValue
this:
-
返回序列化this的项目的结果, 然后用空格将它们连接。
CSSTranslate
this:
CSSRotate
this:
CSSScale
this:
CSSSkew
this:
-
将s初始化为"skew("。
-
序列化this的
ax
内部槽,并追加到s。 -
如果this的
ay
内部槽为CSSUnitValue
, 且其value
为0
, 则追加")"到s并返回s。 -
否则,追加", "到s。
-
序列化this的
ay
内部槽,并追加到s。 -
追加")"到s, 然后返回s。
CSSPerspective
this:
-
将s初始化为"perspective("。
-
序列化this的
length
内部槽,最小值为0px,并追加到s。 -
追加")"到s, 然后返回s。
CSSMatrixComponent
this:
6.7. 从 CSSOM 值序列化
CSSStyleValue
由用户代理从 CSSOM 中的值生成的对象,而不是由作者直接构造的,根据它们来自的属性,按照以下规则序列化:
- background-color
-
-
如果该值是currentcolor关键字, 则返回"currentcolor"。
-
否则,返回序列化<color>值的结果。
-
- border-color
-
-
如果该值是currentcolor关键字, 则返回"currentcolor"。
-
否则,返回序列化<color>值的结果。
-
- border-image
-
-
将values初始化为空列表。
-
如果border-image-source不是none, 序列化border-image-source并将其追加到 values。
-
如果border-image-slice未指定所有边的100%并且省略了fill关键字, 则序列化border-image-slice并将其追加到 values。
-
如果border-image-width未指定所有边的1, 则将"/ "(U+002F 斜杠后跟 U+0020 空格)追加到序列化border-image-width的结果并将其追加到 values。
-
如果border-image-outset未为所有边指定0:
-
如果上一个border-image-width步骤未向 values追加任何内容, 则将prefix设为"// "(两个 U+002F 斜杠字符后跟 U+0020 空格); 否则将prefix设为"/ " (U+002F 斜杠后跟 U+0020 空格)
-
将prefix追加到序列化border-image-outset的结果并将其追加到 values。
-
-
如果border-image-repeat在两个轴上都不是 stretch, 则序列化border-image-repeat并将其追加到 values。
-
如果values是空, 则将"none"追加到values。
-
返回连接values中所有项的结果, 使用" "(U+0020 空格)分隔。
-
- bottom
-
-
如果该值是auto关键字, 则返回"auto"。
-
否则,返回序列化<percentage>值的结果。
-
- color
-
-
如果该值是currentcolor关键字, 则返回"currentcolor"。
-
否则,返回序列化<color>值的结果。
-
- left
-
-
如果该值是auto关键字, 则返回"auto"。
-
否则,返回序列化<percentage>值的结果。
-
- opacity
-
-
否则,返回序列化<percentage>值的结果。
- right
-
-
如果该值是auto关键字, 则返回"auto"。
-
否则,返回序列化<percentage>值的结果。
-
- top
-
-
如果该值是auto关键字, 则返回"auto"。
-
否则,返回序列化<percentage>值的结果。
-
7. 安全性考虑
这些特性未引入已知的安全问题。
8. 隐私性考虑
这些特性未引入已知的隐私问题。
9. 变更
9.1. 自 2018年4月10日工作草案以来的更改
-
修复了类型匹配算法,以更抽象的方式引用百分比提示。
-
澄清了"反转类型"需要保留百分比提示。
-
为CSS数字工厂添加了缺少的字体单位。(#1107)
-
指定了单位速记方法列表必须根据实现的支持进行减少或扩展。
-
为"StylePropertyMapReadOnly.get()"使用了未定义的联合值。(#1087)
-
移除了.to()和CSSColorValue.colorSpace,因为转换并不属于Typed OM的职责。(#1070)
-
为"序列化CSSUnitValue"添加了min/max,并在序列化CSSPerspective的参数时传递它们。(#1069)
-
将重新具体化从"CSSStyleValue"改为"标识符"。(#1068)
-
为新的视口/容器单位添加了工厂函数。(#1067)
-
为CSSNumericValue.parse添加了类型检查。(#1065)
-
移除了CSSDeviceCMYK,添加了CSSOKLab和CSSOKLCH,并让所有颜色类接受"none"关键字。
-
定义了如何具体化颜色值。
-
允许"新单位值"链接到"从对创建CSSUnitValue",因为这种表达已经被广泛使用。
-
为CSSPerspective添加了对perspective(none)的支持。(#1053)
-
修复了CSSClampValue.min/max与CSSNumericValue.min/max的冲突。(#855)
-
简化了摘要。
-
移除了CSSGray和相关的规范文本,因为Color 4在不久前放弃了gray()。(#1027)
-
将.colorSpace移到CSSColorValue超类。将.to*()颜色转换函数替换为通用的.to(colorSpace)方法。(#1036)
-
添加了device-cmyk()支持。
-
修复了CSSColor的OM以匹配最近的简化。
-
指定了每个CSSColorValue子类表示的颜色函数,并添加了CSSGray。
-
为联合添加了缺少的括号。(#1016)
-
添加了一些关于"type"构成的解释文本。
-
修复了算法嵌套。
-
添加了默认的字典值,WebIDL更新后需要。(#936)
-
将术语从"底层值"改为"内部表示",因为Web Animations已将"底层值"用于不同的含义。
-
澄清了将具体化为CSSStyleValue需要一个属性。
-
定义了注册自定义属性的具体化行为。(#886)
-
使用了局部接口mixin ElementCSSInlineStyle。(#853)
-
使用了WebIDL中的正确名称作为索引属性获取器。
-
为其他规范导出了许多术语。
-
从该层级中删除了CSSPositionValue。
-
为"clamp()"函数添加了CSSMathClamp。
-
使"匹配语法"算法更加精确。
-
重新具体化计算的数字值使用规范单位。(#725)
-
添加了关于新单位类型的注释。(#734)
-
使用正确的单位"percent",而不是"percentage" (#761)。
-
添加了关于自定义属性解析的注释。
-
将Naina Raisinghani移至前任编辑。
-
添加了"反转类型"操作。
-
为CSS Values & Units导出了几个数字类型术语。
-
将Shane Stephens移至前任编辑。