10

CSS语法模块第3级规范即将推出的草案中似乎有一个突破性的(即向后不兼容)更改:现在可能需要在块中最后一个声明之后添加尾随分号。

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

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

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

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

(重点是我的)。

因此,漂亮的缩写形式,例如:

em{颜色:石灰}

(这是目前CSS颜色模块3级推荐中的有效示例)将不再验证。

请有人对整个三级草案集有更深入的了解吗?对于未来的样式表,我们真的必须在规范最终确定之前彻底检查现有的CSS文件(如果缺少,则插入分号)吗,或者我误解了什么?

1
  • 2
    有趣的事实:最后一个代码示例2编辑草稿中省略了最后一个分号:正文{font-size:10pt}.
    ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––泽塔
    2012年6月16日10:35

3个答案

重置为默认值
6

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

你正确地指出了2.语法描述部分规定用分号结束每条规则:

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

同时,第节中对解析自动机的描述3.6.8. 声明值模式显示没有分号的右大括号同时正确结束声明和当前规则:

}代币

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

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

我不能说规范作者的实际意图。但目前的情况可能需要报告和修复。当然,他们无意破坏与CSS2.1的兼容性,并将改写他们的语法描述部分。

  • 1
    感谢您指出解析器的详细信息。但我想你是想引用}代币,而不是分号标记(是否必需,;显然会以任何方式完成声明)。我应该使用[电子邮件保护]用邮件列表报告这种模糊性?尽管声称那个每个人可以参加讨论的,名单似乎相当精英。 2012年6月17日15:20
  • @heapunderrun谢谢你的更正,我修改了答案。是的,如果你有时间的话,最好给邮件列表写信。虽然我会在一周内亲自完成(我现在有点忙于大学毕业)。 2012年6月18日11:36
  • @NichtVerstehen W3C有没有澄清过他们对此的立场? 2021年6月22日16:18
5

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

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

然而,我将一如既往地以分号结束每个声明。这是一个很好的实践,以便在添加更多声明时不要忘记分隔符。

4
  • 没有什么比刷新页面并显示“WTF?YU NO WORK!”更烦人的了 2012年6月16日16:26
  • 1
    我不会依赖验证服务识别最近的更改尤其是在处理句法分析的基本变化时。我记得有一次W3C的官方XHTML验证器无法处理UTF-16,而是在输入文件中的每个字符处都会出现错误。这一问题长期未解决。此外,还有一个陷阱。有效的CSS信息secton,W3C的验证器不仅可以自动缩进,还可以无声地插入尾随的分号(就好像这些分号最初存在一样)!这很令人困惑,你不能使用通过文件上传验证找出缺失的分号。 2012年6月17日15:18
  • @heapunderrun:如果解析真的会从使用分号作为分隔符更改为使用结束分号,那将是一个专业语法中的更改,使很多的当前CSS标记与CSS 3不兼容。如果真的有这样的情况,我认为他们很可能会让验证服务正确地验证它。 2012年6月17日16:04
  • 应该注意的是,这些评论已经过去9年了,W3C验证器仍然没有将缺少分号标记为错误。我不确定他们的官方立场是什么,但在这一点上,后面的分号似乎是100%可选的。 2021年6月22日16:13
2

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

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.