我了解CSS仅支持像这样的多行注释
/* foobar */
为什么不支持单行注释。
// foobar
它们在编程中同样常见,并且对于像CSS这样的语言(每个规则都在一行上)特别有用。
如果此决定没有特殊的历史原因,是什么阻止了浏览器转向支持该决定?
我了解CSS仅支持像这样的多行注释
/* foobar */
为什么不支持单行注释。
// foobar
它们在编程中同样常见,并且对于像CSS这样的语言(每个规则都在一行上)特别有用。
如果此决定没有特殊的历史原因,是什么阻止了浏览器转向支持该决定?
Answers:
向后兼容
在CSS语法中引入单行注释可能会更改当前使用令牌的文件的含义//
。浏览器供应商非常不愿意引入可能破坏现有页面的更改。
CSS是用非常精确的“容错”解析规则定义的,这意味着即使您在语法上写某些东西都是非法的,对于解析应该如何进行也有精确的规则。如果//
在声明中检测到非法的字符序列(如),则当前的声明将被丢弃,直到下一个分号的所有内容都将被跳过。
这样设计CSS即可在不破坏旧浏览器的情况下引入新语法。旧的浏览器只会跳过包含不支持语法的声明,然后继续。
但是此逻辑假定要处理或跳过的“单位”是声明。如果引入单行注释,则意味着之后的解析//
应跳过直到下一个换行符,而不是直到下一个分号,这将更改要解析和跳过的规则。这可能会以令人惊讶的方式改变现有CSS文件的含义。
一个例子:
P { font: 12px//16px; }
... hundreds of additional lines of CSS...
在这里,我错误地将斜杠加倍。结果是字体声明被忽略,但其余所有工作正常。如果//
引入了对-comments的支持,突然间右括号将被注释掉,从而有可能破坏样式表的其余部分。
现在您可以说这是我的错,因为我犯了一个错误,但这并不能改变互联网上未知数量的页面可能由于晦涩的原因而中断或呈现异常。
任何此类会破坏向后兼容性的更改都应非常谨慎地考虑,单行注释可能不足以吸引风险,因为唯一的好处是它节省了一些按键操作。
因此,如果CSS应该有单行注释,则可能应该从一开始就引入它。但是CSS最初是一种非常简单的语言,并且具有两种不同的注释语法在当时被认为是不必要的复杂性。(即使ANSI C也没有单行注释。)
//
将被解析为两个“ delim令牌”,反过来在语法中的任何地方都不允许。有关详细信息,请参见w3.org/TR/css-syntax-3/#tokenization。
/**/
,但接受它却是因为它也解决了为什么没有变化的原因。
支持另一个语法元素并不是那么容易:有很多工具应该能够处理其他注释样式。实际上,看到大多数令牌生成器/解析器只是忽略换行符,可能用来代替它们,我不会感到惊讶;
。
如果这对语言至关重要,即使开发人员的生活变得更加轻松,则可以这样做。例如,在CSS中没有任何类型的注释会很烂,因此值得添加分隔注释的特定语法元素。//
另一方面是风格评论?...我看不到重点。参见/* Hello, World! */
:单行注释。
实际上,您可能希望使用//
-style注释,因为您已习惯使用C ++或类似语言。但是,CSS并非从C ++继承,因此期望类似的语法功能是很奇怪的。
同样,Python程序员会声称CSS还应该具有#
-style注释;所以现在,我们需要同时支持两种样式吗?然后,来自Haskell世界的一个家伙会要求包含--
和{- -}
,并且您会问自己为什么不再识别CSS代码。
这样做的微小好处//
是,您不必在单行注释的末尾再键入三个字符(实际上,如果我们开始计算字符,CSS应该使用Python样式的注释)。但是,如果使用体面的文本编辑器,则只需按快捷键即可对文本进行注释/取消注释。
它们似乎对于像CSS这样的语言特别有用,因为每个规则都是独立的。
正如我所解释的,对于使用一小部分文本编辑器的一小部分程序员而言,它们仅稍微有用。至于您对每条规则的评论(顺便说一句,我不同意您的评论),这使我想到了另一点:评论的实际使用方式。
这是我能想到的CSS注释的用法:
在前三种情况下,无论如何都将使用多行样式的注释。这对于文件头和黑客的解释是显而易见的(大多数黑客至少需要一个句子和指向StackOverflow或博客文章的超链接);至于分隔符:
/**
* Footer and sitemap styles.
*/
C样式的注释比:
// Footer and sitemap styles.
埋在文字中。
//
注释。
//
在许多语言中都很常见,其背后的概念不仅仅是语法,它的功能也有所不同。也就是说,这是迄今为止最深入的答案。
问题是大多数带有注释的语言(例如C#,Java)都是编译语言,并且编译器在将内容呈现给使用者(CPU)之前会剥离所有注释。CSS未编译;通常,文件是在设计人员开发文件时原封不动地发送的,因此没有机会删除注释。//样式注释然后需要//符号和换行符以保持语法正确性。
是的,存在缩小符,是的,javascript允许这种类型的注释。Javascript还允许eval(),因此我认为我们不想将其作为模型。
/* */
注释?
//
在可以删除注释时不能删除注释/* */
呢?