【问题标题】:Does an empty declaration appear after the last semi-colon if that semi-colon is followed by a closing brace?如果分号后跟右大括号,是否在最后一个分号后出现空声明?
【发布时间】:2012-11-26 02:01:29
【问题描述】:

让我们看看这个 CSS 规则:

#foo { color: red; }

如您所见,上述规则的声明块包含一个声明,即color: red。但是,根据我对 CSS 标准的解释,上述声明块还包含第二个空声明,它位于字符 ;} 之间。

#foo { color: red; }
                  ^ --- an empty declaration is located here

我在 Stack Overflow 上提出这个问题,以确定我的解释是否正确,即上述 CSS 规则中是否确实存在第二个空声明。

顺便说一句,我使用的是 CSS 2.1 标准,特别是 "Chapter 4: Syntax",因为 "CSS Syntax" 模块已经过时,使用起来不安全。

好的,让我解释一下。我的解释基于以下定义:

  • 标准规定,在声明块中,分号是分隔符,出现在各个声明之间:

    声明块以左大括号 ({) 开始,并以匹配的右大括号 (}) 结束。在两者之间必须有零个或多个分号分隔 (;) 声明的列表。

    所以,根据上述定义,分号只能出现在两个声明之间,即分号必须在声明之前和声明之后。

  • 标准将声明定义为:

    声明要么为空,要么由属性名称、冒号 (:) 和属性值组成。

    上面的定义声明一个声明可以是空的。不幸的是,该标准没有定义术语“空声明”,该术语也没有在标准的其他任何地方提及。

让我们回到例子:

#foo { color: red; }

上述规则是有效的 CSS。通过应用分号的定义(从上面),此规则中的分号必须在前面和后面都有一个声明。但是,分号后面是右花括号(结束声明)。为了解释这个矛盾,我在;}之间插入一个空声明,并提供这个定义:

空声明是在声明块中需要声明但未找到的位置中没有声明。

这种对标准的解释是否正确,声明块是否确实包含两个声明?

【问题讨论】:

  • 抱歉不敏感,但为什么要关心呢?也许有人可以向我解释一下。
  • @njk 它叫做pedantry。我没有选择迂腐,我的大脑就是这样工作的。
  • 我认为你应该进一步评估如果有......两个,是的,分号后有两个空格会发生什么。那么会有两个空声明吗?我们可能永远不会知道。
  • 您没有在这里回答您自己的问题吗:stackoverflow.com/a/5732519/116614?
  • @mellamokb 否。该答案仅使用我的解释,但我显然无法验证我自己的解释。为此我需要第二意见(我猜这叫做同行评审),这就是我问这个问题的原因。

标签: css


【解决方案1】:

是的,这在将分号定义为分隔符而不是语句(或声明或其他任何内容)的一部分的计算机语言中很正常。没有其他可能的解释,这个问题没有实际影响,因为空的声明没有效果。

【讨论】:

  • 虽然我没有数据来证明(或反驳)它,但我倾向于不同意它“没有效果”。我在回答中注明“为什么”。
  • @ScottS:没有功能影响。很明显,有 some 效果;对于初学者,必须从磁盘上的文件中读取冒号。
  • @LightnessRacesinOrbit——同意。似乎其他人也误解了我的观点,所以我澄清说反对意见是在“没有实际影响”的背景下,而速度可以是一个实际问题。诚然,可能需要 无数 个案例才能看到对渲染速度的明显影响。
【解决方案2】:

我同意您的观点,即阅读说明您的情况显示为空声明。实际上,在大多数情况下,您的参考页面在其示例中的结束大括号之前没有最终的;。我认为您的定义很接近,但并没有完全触及“空”的想法。而是:

空声明是没有任何内容的声明 在需要声明的声明块中。

或者,given the note here,这个...

一个空的声明是一个不超过空格作为内容的声明 在需要声明的声明块中。

Contra Jukka 关于“没有实际影响......没有影响”的评论,我倾向于认为会有如此轻微的影响,因为他们是为这样的代码块做一个额外的解析(意识到,正如一些人似乎认为我在争论的那样,当我不是时,它没有功能效果)。页面状态:

本规范定义忽略意味着用户代理解析 非法部分(为了找到它的开始和结束),但是 否则就好像它不存在一样。

虽然空声明不是非法的,但我相信解析器需要执行一个额外的步骤来确定它是空的,然后才能意识到它位于声明块的末尾。

【讨论】:

  • 我原则上不同意这个答案。分号的存在与否显然会对整个宇宙产生影响:它会影响存储在服务器上或传输到浏览器的字节序列,它会影响任何阅读 CSS 的人的视神经,等等。但这些影响根本不算数。当规范说除了collapse"Other values for 'visibility' have no effect"(在表格列上)之外,这并不意味着形而上学意义上的。它不需要浏览器使用 [continued]
  • [继续] 量子计算技术,以确保无论是否使用 visibility 的其他值之一,宇宙的状态都是相同的。它只是意味着这些值对语义没有影响。
  • 也可以说,由于空白字符创建的文件大小增加,额外空间的总和在下载时间和渲染速度上显示出明显的差异。 (但是,无论如何,这就是缩小的目的。;))
  • @ruakh——我的“没有效果”的论点也是在 Jukka 所说的“没有实际影响”的上下文中,我指出它可能对解析速度有实际影响。这不仅仅是简单的“不计算[ing]”。 @Shauna 添加了关于下载速度的注释,这有助于缩小,但解析是浏览器实际运行通过解释要执行的命令。因此,虽然在大多数情况下影响可能很小,但对于敏感的速度测量设备来说,一个包含一堆不需要的 ; 的巨大文件可能会导致每次额外的解析步骤。
  • @ScottS: 或者相反,; 可以实现无限快的解析。它完全取决于解析器,绝对不值得担心。
【解决方案3】:

乍一看,规范在这方面似乎略有不一致;尽管您引用了这些段落,the formal grammardeclaration 产生式定义为property ':' S* expr prio?,它永远不会为空。但是,每当declaration 出现在任何其他产品中时,它后面总是跟着?,将其标记为可选;换句话说,语法允许declaration 的任何地方,它也允许[无]。

我们可以通过说出现在规范的英文散文中的术语“声明”指的是declaration?declaration-or-[nothing])而不是declaration来解决不一致的问题;但我认为主要的要点是这并不重要。规范的编写方式使得空声明真正无效。

(嘿,情况可能更糟。Standard ML 允许空声明,and 允许在声明之间省略分号;所以像 val a = 7 val b = 20 这样的东西可以被解析为任意多的序列空声明,混入两个非空声明。)

【讨论】:

  • 形式文法提供了不同的定义。相关部分是'{' S* declaration? [ ';' S* declaration? ]* '}',它“涵盖所有基础”,因为它支持{ color: red ;;;;;;;; } 之类的东西。
  • @Šime Vidas:是的,绝对的。
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多