此附录是说明性的,而非规范性的。
以下是相对于CSS2(CSS 2.1)第一个修订版的更改。CSS2规范(见 [CSS2])与 CSS 2.1(见 [CSS21])之间的更改可以在CSS 2.1的更改章节中找到。
本章并非更改的完整列表。较小的编辑更改和大多数示例更改未在此列出。
[2011-10-12] 在“6.2.1 'inherit' 值”中更改
每个属性还可以有一个继承的层叠值,这意味着对于给定元素,该属性将取
与父元素属性相同的指定值作为指定值,取父元素的计算值。
[2011-10-12] 在“6.1.1 指定值”中添加如下说明:
- 如果层叠结果为一个值则使用它。但是,如果该值是 'inherit',则指定值定义在下面的“'inherit' 值”中。
[2012-04-04] 在“8.3.1 折叠边距”中新增一项如下:
相邻的垂直边距折叠,除非:
- 根元素的框的边距不折叠。
- 如果具有清除浮动的元素的上下边距相邻,其边距与后续兄弟元素的相邻边距折叠,但结果边距不会与父块的底部边距折叠。
- 如果具有非零计算 'min-height' 和 'auto' 计算 'height' 的框的上边距与其最后一个流内子元素的底部边距折叠,则该子元素的底部边距不会与父元素的底部边距折叠。
[2012-04-11] 在“10.7 最小高度和最大高度:'min-height' 和 'max-height'”中澄清如下说明:
这些步骤不会影响上述属性的实际计算值。使用 'height' 的变化对边距折叠没有影响,除非“折叠边距”(8.3.1)中的规则特别要求。这些步骤不会影响 'height' 的实际计算值。因此,例如,它们不会影响边距折叠,因为边距折叠取决于计算值。
[2012-04-11] 在“8.3.1 折叠边距”中澄清第二个注释中的第七个要点:
如果一个具有 'auto' 的 'height' 和零 'min-height' 的流内块框的底部边距与其最后一个流内块级子元素的底部边距折叠,而该框没有底部填充和底部边框,并且该子元素的底部边距没有与具有清除浮动的顶部边距折叠。如果一个具有 'auto' 的 'height' 的流内块框的底部边距与其最后一个流内块级子元素的底部边距折叠,且:
- 该框没有底部填充,并且
- 该框没有底部边框,并且
- 该子元素的底部边距既没有与具有清除浮动的顶部边距折叠,也没有(如果该框的 'min-height' 为非零)与该框的顶部边距折叠。
[2012-05-02] 在“15.3 字体系列:'font-family' 属性”中澄清未使用引号的字体名称“inherit”是错误的:
与关键字值('inherit'、'serif'、'sans-serif'、'monospace'、'fantasy' 和 'cursive')相同的字体系列名称必须加引号,以防与相同名称的关键字混淆。关键字 'initial' 和 'default' 为将来保留,当用作字体名称时也必须加引号。用户代理不得将这些关键字视为与 'family-name' 类型匹配。未加引号的字体系列名称与关键字值 'inherit'、'default' 和 'initial' 或通用字体关键字('serif'、'sans-serif'、'monospace'、'fantasy' 和 'cursive')相同,则不匹配 'family-name' 类型。这些名称必须加引号,以防与相同名称的关键字混淆。请注意,“font-family: Times, inherit”因此是无效声明,因为在该位置 'inherit' 既不能是有效关键字,也不能是有效字体名称。
[2012-05-02] 在数字、长度或百分比的符号和数字之间不允许有空格和注释。在“4.3.1 整数和实数”中插入“立即”如下:
整数和实数可以立即以 "-" 或 "+" 开头以指示符号。
在“4.1.1 词法分析”中允许在 {num} 宏的开头使用 "+" 或 "-":
num [-+]?[0-9]+|[-+]?[0-9]*\.[0-9]+
(请注意,这改变了三个标记的定义:NUMBER、DIMENSION 和 PERCENTAGE,因此改变了 CSS 的标记化,但并没有改变语法整体生成的语言。)
在 4.3.2 (<length>) 或 4.3.3 (<percentage>) 中不需要做任何更改,因为它们引用了 4.3.1。
[2012-08-01] 在“10.1 ‘包含块’的定义”中更改:
- […]
- 对于其他元素,如果元素的位置是 'relative' 或 'static',则包含块由最近的作为 块容器
祖先框或建立格式化上下文的祖先框的内容边缘形成。
[2012-08-01] 在“9.4 正常流”中更改如下:
正常流中的框属于格式化上下文,在CSS 2 中它可以是 表格、块或内联
,但不能同时是两者。在未来的 CSS 级别中,将引入其他类型的格式化上下文。 块级框参与块格式化上下文。内联级框参与内联格式化上下文。表格格式化上下文在表格章节中描述。
[2012-08-01] 在“9.4.2 内联格式化上下文”中添加如下句子:
内联格式化上下文由包含无块级框的块容器框建立。在内联格式化上下文中,框从包含块的顶部开始水平布局,一个接一个地排列。
[2012-08-01] 在“17.4 可视化格式模型中的表格”中更改如下:
如果表格是块级的,表格包装框是一个 'block' 框,如果表格是内联级的,表格包装框是一个 'inline-block' 框。表格包装框建立块格式化上下文,而表格框建立表格格式化上下文。
[2012-08-01] 在“17.5 表格内容的视觉布局”中更改如下:
内部表格元素生成矩形框
并具有这些框参与由表格框建立的表格格式化上下文。这些框具有内容和边框。,并且单元格也有填充。内部表格元素没有边距。
[2012-08-01] 在“11.1.1 溢出:'overflow' 属性”中更改如下:
适用于:块容器和建立格式化上下文的框。
[2013-04-29] URI 词法单元的 u、r 和 l 字母可以写成转义字符。在 4.1.1 “词法分析”中的第一个表格中更改:
URI
url{U}{R}{L}\({w}{string}{w}\)
|url{U}{R}{L}\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w}\)
在第二个表格中更改:
baduri1
url{U}{R}{L}\({w}([!#$%&*-~]|{nonascii}|{escape})*{w}baduri2
url{U}{R}{L}\({w}{string}{w}baduri3
url{U}{R}{L}\({w}{badstring}
并在第二个表格中添加:
L l|\\0{0,4}(4c|6c)(\r\n|[ \t\r\n\f])?|\\l
R r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r
U u|\\0{0,4}(55|75)(\r\n|[ \t\r\n\f])?|\\u
[2013-04-29] URI 词法单元的 u、r 和 l 字母可以写成转义字符(参见之前的勘误表)。在 G.2 “词法扫描器”中更改:
baduri1url{U}{R}{L}\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w} baduri2url{U}{R}{L}\({w}{string}{w} baduri3url{U}{R}{L}\({w}{badstring}
并且
"url("{U}{R}{L}"("{w}{string}{w}")" {return URI;}"url("{U}{R}{L}"("{w}{url}{w}")" {return URI;}
[2013-04-29] 在标识符和 URI 词法单元中可以使用 U+0080 到 U+009F 之间的 Unicode 控制字符。(以前这些字符会使样式表无效。)在 4.1.1 “词法分析”中更改:
nonascii [^\0- \237\177]
[2013-04-29] 在标识符和 URI 词法单元中可以使用 U+0080 到 U+009F 之间的 Unicode 控制字符。(以前这些字符会使样式表无效。)在 4.1.3 “字符和大小写”中更改:
- 在 CSS 中,标识符(包括选择器中的元素名称、类和 ID)只能包含字符 [a-zA-Z0-9] 和 ISO 10646 字符
U+00A0U+0080 及更高的字符,此外还包括连字符 (-) 和下划线 (_);
[2013-05-02] 当根据带外信息确定 CSS 文件采用基于 UTF 的字符编码时,并且文件以BOM开头,则 BOM 决定采用哪种基于 UTF 的编码,覆盖带外信息。在 4.4 “CSS 样式表表示”中插入:
如果上述规则 1(如 HTTP “charset” 参数或类似的)得出一种字符编码,并且该编码是 UTF-8、UTF-16 或 UTF-32,则文件开头的 BOM(如果有的话)会覆盖该字符编码,如下所示:
前几个字节(十六进制) 结果编码 00 00 FE FF UTF-32,大端 FF FE 00 00 UTF-32,小端 FE FF UTF-16,大端 FF FE UTF-16,小端 EF BB BF UTF-8 如果规则 1 得出的字符编码是 UTF-16BE、UTF-16LE、UTF-32BE 或 UTF-32LE,那么如果文件以 BOM 开头,这是一个错误。CSS 用户代理必须通过忽略指定的编码并使用上述表格来恢复。
请注意,[UNICODE]规范指出,UTF-16BE、UTF-16LE、UTF-32BE 或 UTF-32LE 中文件开头的 BOM 是错误的。
[2013-07-15] 在“11.1.1 溢出:'overflow' 属性”中更改 'scroll' 和 'auto' 的定义:
[2013-07-15] 在“15.3 字体系列:'font-family' 属性”中语法缺少一对括号:
值:[[ <family-name> | <generic-family> ] [, [ <family-name>| <generic-family> ] ]* ] | inherit
[2013-07-15] 数字、长度或百分比的符号和数字之间不允许有空格和注释。在 “G.2 词法扫描器”中更改 {num} 宏如下:
num [-+]?[0-9]+|[-+]?[0-9]*"."[0-9]+
在 “G.1 语法”中删除 unary_operator:
unary_operator : '-' | '+' ;
并且
term :unary_operator?[ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | TIME S* | FREQ S* ] | STRING S* | IDENT S* | URI S* | hexcolor | function ;
[2013-07-18] 即使未使用,高度的百分比值也可以继承。在 “10.5 内容高度:'height' 属性”中更改“计算值”一行如下:
计算值: the percentage or 'auto' (参见 <percentage> 下的正文)(如指定)
在 <percentage> 的定义中:
- <percentage>
- 指定一个百分比高度。该百分比是根据生成的框的包含块的高度计算的。如果包含块的高度未明确指定(即,它取决于内容高度),并且此元素不是绝对定位的,
该值计算为 'auto'使用的高度按指定 'auto' 计算。
[2013-09-09] 在 “4.1.1 词法分析”中使 UNICODE-RANGE 词法单元更加精确:
UNICODE-RANGE
u\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?
u\+[?]{1,6}|
u\+[0-9a-f]{1}[?]{0,5}|
u\+[0-9a-f]{2}[?]{0,4}|
u\+[0-9a-f]{3}[?]{0,3}|
u\+[0-9a-f]{4}[?]{0,2}|
u\+[0-9a-f]{5}[?]{0,1}|
u\+[0-9a-f]{6}|
u\+[0-9a-f]{1,6}-[0-9a-f]{1,6}
例如,“U+A?5” 以前是一个单一的 UNICODE-RANGE 词法单元(尽管它在语义上是没有意义的),现在这是两个词法单元:“U+A?”(表示 16 个字符范围 U+A0-AF)和数字“5”。
[2012-09-19] 修改 “9.2 控制框生成”和 “9.2.1 块级元素和块框”如下:
控制框生成
以下部分描述了 CSS 2.1 中可能生成的框类型。框的类型部分影响其在可视化格式化模型中的行为。'display' 属性在下文中描述,指定框的类型。
'display' 属性的某些值使源文档的元素生成一个主框,该框包含后代框和生成的内容,并且也是参与任何定位方案的框。一些元素可能会生成除主框之外的其他框:'list-item' 元素。这些附加框相对于主框放置。
9.2.1 块级元素和块框
块级元素是源文档中在视觉上格式化为块(例如段落)的元素。以下 'display' 属性的值使元素成为块级:'block'、'list-item' 和 'table'。块级元素——源文档中在视觉上格式化为块的元素(例如段落)——是生成块级主框的元素。使元素成为块级的 'display' 属性值包括:'block'、'list-item' 和 'table'。块级框是参与块格式化上下文的框。
块级框是参与块格式化上下文的框。每个块级元素生成一个主块级框,该框包含后代框和生成的内容,并且也是参与任何定位方案的框。一些块级元素可能会生成除主框之外的其他框:'list-item' 元素。这些附加框相对于主框放置。
除表格框之外,表格框在后面的章节中描述,替换元素除外,在CSS 2中,块级框也是块容器框,除非它是一个表格框或替换元素的主框。块容器框要么只包含块级框,要么建立内联格式化上下文,因此只包含内联级框。主框是块容器框的元素是块容器元素。使非替换元素生成块容器的 'display' 属性值包括 'block'、'list-item' 和 'inline-block'。并非所有块容器框都是块级框:非替换内联块和非替换表格单元格是块容器,但不是块级框。同时也是块容器的块级框称为块框。“块级框”、“块容器框”和“块框”这三个术语有时会在不含糊的情况下缩写为“块”。
[2012-09-19] 修改 “9.2.4 'display' 属性”如下:
- block
- 此值使元素生成一个主块框。
- inline-block
- 此值使元素生成
一个一个主内联级块容器。(inline-block 的内部格式化为块框,元素本身格式化为原子内联级框。)
[2012-09-19] 修改 “17.4 可视化格式模型中的表格”如下:
在这两种情况下,表格都会生成一个名为表格包装框的主块容器框,其中包含表格框本身和所有标题框(按文档顺序)。表格框是一个块级框,包含表格的内部表格框。标题框是主块级框,保留它们自己的内容、填充、边距和边框区域,并在表格包装框内按正常块框渲染。标题框放置在表格框之前或之后由 'caption-side' 属性决定,如下所述。
表格包装框是
当表格是块级时的 'block' 框'display: table' 时的块级,当表格是内联级时的 'inline-block' 框'display: inline-table' 时的内联级。表格包装框建立块格式化上下文,而表格框建立表格格式化上下文。在为 'inline-table' 做基线垂直对齐时使用的是表格框(而不是表格包装框)。表格包装框的宽度是其内部表格框的边框边缘宽度,如 17.5.2 节所述。表格上的 'width' 和 'height' 的百分比相对于表格包装框的包含块,而不是表格包装框本身。
[2012-09-19] 为了兼容 SVG,在 “4.1.1 词法分析”中修改 num 宏的定义如下:
num[-+]?[0-9]+|[-+]?[0-9]*\.[0-9]+
num [+-]?([0-9]+|[0-9]*\.[0-9]+)(e[+-]?[0-9]+)?
[2014-07-16] 画布的背景不能从使用 'display: none' 抑制的元素中获取。另一方面,如果元素仅不可见('visibility: hidden'),其背景仍可用于画布。换句话说,如果根元素具有 'display: none',则画布的背景是未定义的。在 (X)HTML 文档的情况下,如果根元素具有 'background: transparent' 且 <body> 元素具有 'display: none',则画布的背景同样是未定义的。在 “14.2 背景”中更改如下内容:
[…] 这些背景还必须锚定在与仅为根元素绘制它们时相同的位置。
但是,如果没有为将用于画布背景的元素生成框,则画布背景是透明的。(在 CSS 2 中,当元素或其祖先具有 'display: none' 时就是这种情况。)
请注意,如果元素具有 'visibility: hidden' 而不是 'display: none',则为其生成框,并且其背景用于画布。
[2015-07-01] 具有 'position: fixed' 的元素始终建立一个新的层叠上下文。(这与 'position: absolute' 不同,在 'z-index' 决定元素是否建立层叠上下文。)
在 “9.9.1 指定堆叠层次:'z-index' 属性”中更改 'auto' 的定义如下:
- auto
- 生成框在当前层叠上下文中的堆叠层次为 0。
除非它是根元素,否则该框不会建立新的层叠上下文。如果框具有 'position: fixed' 或者它是根元素,它还会建立一个新的层叠上下文。
[2015-09-05] 当格式错误的声明的开头符合 at-rule 的语法时,格式错误的声明的处理方式有所不同。在这种情况下,解析不会在下一个分号或封闭块的右大括号处恢复,而是立即在该 at-rule 之后恢复。这通过将 at-rule 添加到规则集的核心语法中来表达,如下所示。
在 “4.1.1 词法分析”中更改 ruleset 的生成规则如下:
ruleset : selector? '{' S* declaration? [ ';' S* declaration? ]* '}' S*;ruleset : selector? '{' S* declaration-list '}' S*; declaration-list: declaration [ ';' S* declaration-list ]? | at-rule declaration-list | /* empty */;
在 “4.1.7 规则集、声明块和选择器”中更改第二段如下:
声明块以左大括号({)开始,并以匹配的右大括号(})结束。中间必须有零个或多个
以分号分隔的(;)声明声明和 at-rule。声明必须以分号(;)结束,除非它们是列表中的最后一项。注意:CSS Level 2 没有可以出现在规则集中的 at-rule,但此类 at-rule 可能会在将来的版本中定义。
在 “4.2 处理解析错误的规则”中更改格式错误的声明规则如下:
格式错误的声明。 用户代理必须通过读取声明的结尾来处理在解析声明时遇到的意外标记,同时遵循匹配 ()、[]、{}、"" 和 '' 的规则,并正确处理转义。例如,格式错误的声明可能缺少属性名称、冒号 (:) 或属性值。
当用户代理期望声明或 at-rule 的开始(即 IDENT 词法单元或 ATKEYWORD 词法单元),但发现意外的词法单元时,该词法单元被视为格式错误的声明的第一个词法单元。即,在这种情况下,使用格式错误的声明规则,而不是格式错误的语句规则来确定要忽略哪些词法单元。
以下内容均等效:
p { color:green } p { @foo { bar: baz } color:green } /* 未知 at-rule */ p { color:green; color } /* 格式错误的声明缺少“:”和值 */ p { color:red; color; color:green } /* 相同的预期恢复 */ p { color:green; color: } /* 格式错误的声明缺少值 */ p { color:red; color:; color:green } /* 相同的预期恢复 */ p { color:green; color{;color:maroon} } /* 意外的标记 { } */ p { color:red; color{;color:maroon}; color:green } /* 相同的恢复 */
最后,在 “13.2 页面框:@page 规则”中删除以下现在已多余的文本:
在 @page 内处理格式错误的声明、格式错误的语句和无效的 at-rule 的规则如 第 4.2 节中定义,附加如下:当用户代理期望声明或 at-rule 的开始(即 IDENT 词法单元或 ATKEYWORD 词法单元),但发现意外的词法单元时,该词法单元被视为格式错误的声明的第一个词法单元。即,在这种情况下,使用格式错误的声明规则,而不是格式错误的语句规则来确定要忽略哪些词法单元。