10

即将发布的 CSS 语法模块第 3 级规范草案中似乎有一个重大更改(即向后不兼容):现在可能需要在块中的最后一个声明之后使用分号。

比较旧的措辞(W3C 工作草案 2003 年 8 月 13 日):

4.8. 规则集、声明块和选择器 声明块(在下文中也称为 {} 块)以左大括号 ({) 开始,以匹配的右大括号 (}) 结束。在两者之间必须有零个或多个分号分隔(;) 声明的列表。

使用新的(编辑草稿 2012 年 6 月 14 日):

2. CSS 语法描述 规则以选择器(由选择器规范定义)开始,然后有一个包含一系列声明的 {} 包装块。选择器指定声明将应用于哪些元素。每个声明都有一个属性名称,后跟一个冒号和属性值,并分号结尾。

(强调我的)。

所以漂亮的简短形式,例如:

em { color: lime }

(目前在 CSS 颜色模块级别 3 建议中作为有效示例给出)将不再验证。

有人可以对整个 3 级草稿集合更了解吗?对于面向未来的样式表,我们真的必须在规范最终确定之前彻底检查现有的 CSS 文件(如果缺少则插入分号)还是我误解了什么?

4

3 回答 3

6

看起来目前规范中存在歧义。

您正确地指出2. Syntax Description 部分规定每条规则都以分号结尾:

每个声明都有一个属性名称,后跟一个冒号和属性值,并以分号结尾。

同时,第3.6.8 节中对解析自动机的描述。声明值模式读取不带分号的右大括号同时正确结束声明和当前规则:

} 令牌

将当前声明附加到当前规则的值。从打开的规则堆栈中弹出当前规则,并将其附加到新的当前规则的值中。切换到当前规则的内容模式。

所以根据3.6.8尾随分号是可选的。

我不能说规范作者的实际意图。但目前的情况可能应该报告和修复。可以肯定的是,他们无意破坏与 CSS 2.1 的兼容性,并将在最终版本中改写他们的语法描述部分。

于 2012-06-16T10:48:03.937 回答
5

我认为在编写规范时这只是一个错误,真正的意图是把它作为分隔符,就像在以前的版本中一样。我希望在以后的草稿中对此进行调整。

W3C 验证服务表示没有尾随分号的示例是有效的 CSS 级别 3 。

但是,我将一如既往地用分号结束每个声明。这是一个很好的做法,这样您在添加更多声明时就不会忘记分隔符。

于 2012-06-16T10:41:43.313 回答
2

这是“分隔符-​​终结符”问题的一个例子。显然,CSS 3 已经从分号作为分隔符转变为分号作为终止符。这意味着在每个元素之后都需要它,而不仅仅是在元素之间。Pascal(分隔符)和 C(终止符)提供了其他示例。这导致 Pascal 中的明显异常,例如分号在“else”或“until”之前是非法的。为什么 CSS 3 采用与 CSS-2 不兼容的规则超出了我的理解,实现是否会坚持是另一回事,但引用的意图很明确:它是一个终止符,因此必须出现在包括最后一个在内的所有条目上。

于 2012-06-16T10:31:03.363 回答