CSS语法模块级别3规范即将到来的草案中似乎存在破坏(即向后不兼容)的更改:现在可能需要在块中的最后一个声明之后使用尾随分号。
比较旧措辞(W3C Working Draft 13 August 2003):
4.8。规则集,声明块和选择器
声明块(在下文中也称为{} -block)以左大括号({)开头,以匹配的右大括号(})结束。在两者之间必须有一个零或多个分号分隔(;)声明的列表。
使用新的(Editor's Draft 14 June 2012):
2。 CSS语法的描述
规则以选择器(由Selectors规范定义)开始,然后有一个包含声明序列的{} -wrapped块。选择器指定声明将应用于哪些元素。每个声明都有一个属性名称,后跟冒号和属性值,已完成,带有分号。
(强调我的)。
这样简洁的短句形式,例如:
em { color: lime }
(目前在CSS Color Module Level 3建议中作为有效示例提供)将不再验证?
如果有人对整个3级草稿收藏有更多了解,请验证吗?对于面向未来的样式表,在规范最终确定之前,我们是否真的必须彻底检查现有的CSS文件(如果缺少则插入分号)或者我是否误解了某些内容?
答案 0 :(得分:6)
看起来规范中目前存在歧义。
您正确地指出2. Syntax Description section规定以分号结束每个规则:
每个声明都有一个属性名称,后跟冒号和属性值,并以分号结束。
与此同时,第3.6.8. Declaration-value mode节中解析自动机的描述读取了没有分号的右括号正确地同时结束了声明和当前规则:
}令牌
将当前声明附加到当前规则的值。从打开规则堆栈中弹出当前规则,并将其附加到新当前规则的值。切换到当前规则的内容模式。
因此根据 3.6.8 尾随分号是可选的。
我不能说规范作者的实际意图。但目前的情况应该得到报道和修复。大多数情况下,他们无意破坏与CSS 2.1的兼容性,并将在最终版本中重新编写语法描述部分。
答案 1 :(得分:5)
我认为编写规范时只是一个错误,而真正的意图是将它作为分隔符,就像以前的版本一样。我希望在以后的草稿中对此进行调整。
W3C validation service表示没有尾随分号的示例是有效的CSS级别3。
但是,我会像往常一样用分号结束每个声明。这是一个很好的做法,因此在添加更多声明时不要忘记分隔符。答案 2 :(得分:2)
这是'separator-terminator'问题的一个例子。显然,CSS 3已经从分号作为分隔符移动到分号作为终结符。这意味着它需要在每个元素之后,而不仅仅是元素之间。 Pascal(分隔符)和C(终止符)提供了其他示例。这导致Pascal中明显的异常,例如分号在'else'或'until'之前是非法的。为什么CSS 3采用CSS-2不兼容的规则超出了我的范围,实现是否会坚持它是另一回事,但引用的意图很明确:它是一个终结符,因此必须出现在包括最后一个条目在内的所有条目上。