让我们看看这个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"模块已过时,并且使用起来不安全。
好的,让我解释一下。我的解释基于这些定义:
标准规定,在声明块中,分号是分隔符,出现个别声明:
声明块以左大括号({)开头,以匹配的右大括号(})结束。在它们之间必须有一个零或多个以分号分隔(;)声明的列表。
所以,根据上面的定义,我只在>两个声明之间出现一个分号,即一个分号必须都在前面,然后是一个声明。
< / LI>该标准将声明定义为:
声明为空或由属性名称组成,后跟冒号(:),后跟属性值。
上述定义声明声明可以为空。不幸的是,该标准没有定义术语“空声明”,也没有在标准中的任何其他地方提到过该术语。
让我们回到这个例子:
#foo { color: red; }
以上规则是有效的CSS。通过应用分号的定义(从上面),此规则中的分号必须都在前面,然后是声明。但是,分号后面是结束大括号(结束声明)。为了解释这个矛盾,我在;
和}
之间插入了一个空声明,并提供了这个定义:
空声明是声明块中某个位置没有声明,声明我需要但未找到。
标准的这种解释是否正确,声明块确实包含两个声明吗?
答案 0 :(得分:2)
是的,这在计算机语言中是正常的,它将分号定义为分隔符,而不是语句(或声明或其他)的一部分。没有其他可能的解释,这个问题没有实际影响,因为空声明没有效果。
答案 1 :(得分:2)
我同意你的看法,说明你的情况显示一个空的声明。实际上,在大多数情况下,您的参考页面在其示例中的结束括号之前没有最终;
。我认为你的定义很接近,但并没有完全触及'#34;空的想法。&#34;代替:
空声明是没有任何内容的声明 在需要声明的声明栏内。
或者,given the note here,这......
空声明是一个不超过空格作为内容的声明 在需要声明的声明栏内。
Contra Jukka的评论&#34;没有实际影响......没有效果,&#34; 我倾向于认为会有如此轻微的影响 因为他们是为这样的代码块做一个额外的解析(实现,正如一些人似乎认为的那样)当我不在时,我在争论它没有功能效果)。页面说明:
此规范将ignore定义为表示用户代理正在解析 非法部分(为了找到它的开始和结束),但是 否则就好像它不在那里一样。
虽然空声明不是非法的,但我相信解析器需要执行一个额外的步骤以确定它是空的,然后才意识到它是在声明块的末尾。
答案 2 :(得分:1)
declaration
制作定义为property ':' S* expr prio?
,这绝不是空的。但是,只要declaration
出现在任何其他作品中,就会始终跟?
,将其标记为可选;换句话说,在语法允许declaration
的任何地方,它也允许[无]。
我们可以通过说出“规范”这一术语来解决这种不一致性,该术语出现在规范的英文散文中,是指declaration?
(declaration
- 或 - [无])而不是{{{ 1}};但我认为主要的关键点是无关紧要。规范的编写方式使得空声明真的没有效果。
(嘿,可能会更糟。Standard ML允许空声明,和允许在声明之间省略分号;因此像declaration
这样的东西可以解析为任意多个空声明的序列,其中混合了两个非空声明。)