【问题标题】:Will CSS 3 still allow omitting final semicolons?CSS 3 是否仍允许省略最后的分号?
【发布时间】:2012-06-19 05:29:04
【问题描述】:

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

比较旧的措辞(W3C Working Draft 13 August 2003):

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

用新的 (Editor's Draft 14 June 2012):

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

(强调我的)。

这样漂亮的简短形式,例如:

em { color: lime }

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

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

【问题讨论】:

  • 趣事:编辑草稿中example 2的最后一个代码省略了最后的分号:body{font-size: 10pt}

标签: css


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    目前规范中似乎存在歧义。

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

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

    同时,3.6.8. Declaration-value mode 部分中对解析自动机的描述表明,不带分号的右大括号同时正确地结束了声明和当前规则:

    } 令牌

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

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

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

    【讨论】:

    • 感谢您指出解析器的详细信息。但是我想您打算引用 } 标记,而不是分号标记(无论是否需要,; 显然都会以任何一种方式完成声明)。我应该使用www-style@w3.org 邮件列表来报告这种歧义吗?尽管claim 每个人 都可以参与讨论,但名单似乎相当精英。
    • @heapunderrun 感谢您的更正,我编辑了答案。是的,如果你有时间的话,最好给邮件列表写信。虽然我会在一周内自己完成(我现在大学毕业有点忙)。
    • @NichtVerstehen W3C 有没有澄清他们对此的立场?
    【解决方案3】:

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

    W3C validation service 表示没有尾随分号的示例是有效的 CSS 级别 3。

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

    【讨论】:

    • 没有什么比刷新页面并进入“WTF?Y U NO WORK!”更烦人了
    • 我不会依赖验证服务来识别最近的变化,尤其是在处理解析中的根本变化时。我记得 W3C 的官方 XHTML 验证器无法处理 UTF-16 而是对输入文件中的每个字符都发出错误提示的时候。这在很长一段时间内都没有得到解决。此外,还有一个问题。在 有效的 CSS 信息 部分,W3C 的验证器不仅自动缩进,而且还默默地插入尾随分号(就好像这些分号最初存在一样)!这很令人困惑,您不能使用 通过文件上传验证 来发现缺少的分号。
    • @heapunderrun:如果解析真的从使用分号作为分隔符变为使用结束分号,那将是语法上的主要变化,使得 a很多当前的 CSS 标记与 CSS 3 不兼容。如果真的有这种情况,我认为他们很可能会让验证服务正确验证它。
    • 应该注意的是,这些 cmets 和 W3C 验证器仍然没有将丢失的分号标记为错误已经 9 年了。我不确定他们的官方立场是什么,但在这一点上,后面的分号似乎是 100% 可选的。
    猜你喜欢
    • 2012-08-09
    • 2016-02-24
    • 2017-12-12
    • 1970-01-01
    • 2014-03-01
    • 2011-08-02
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多