CSS为什么不允许单行注释?[关闭]


14

我了解CSS仅支持像这样的多行注释

/* foobar */

为什么不支持单行注释。

// foobar

它们在编程中同样常见,并且对于像CSS这样的语言(每个规则都在一行上)特别有用。

如果此决定没有特殊的历史原因,是什么阻止了浏览器转向支持该决定?


3
那是一个糟糕的决定。他们应该允许单行注释。
图兰斯·科尔多瓦

1
@Goose:您看过sass-lang.com吗?
凯文·克莱恩


1
@TulainsCórdova我不赞成回答,只是指出已经进行了讨论。
埃里克·金

2
该问题的答案确实比此处的答案更具技术性。“ CSS像对待所有其他空格一样对待换行符,并且如果没有终止定界符,将无法确定注释的结尾。”
Goose Goose 2016年

Answers:


9

向后兼容

在CSS语法中引入单行注释可能会更改当前使用令牌的文件的含义//。浏览器供应商非常不愿意引入可能破坏现有页面的更改。

CSS是用非常精确的“容错”解析规则定义的,这意味着即使您在语法上写某些东西都是非法的,对于解析应该如何进行也有精确的规则。如果//在声明中检测到非法的字符序列(如),则当前的声明将被丢弃,直到下一个分号的所有内容都将被跳过。

这样设计CSS即可在不破坏旧浏览器的情况下引入新语法。旧的浏览器只会跳过包含不支持语法的声明,然后继续。

但是此逻辑假定要处理或跳过的“单位”是声明。如果引入单行注释,则意味着之后的解析//应跳过直到下一个换行符,而不是直到下一个分号,这将更改要解析和跳过的规则。这可能会以令人惊讶的方式改变现有CSS文件的含义。

一个例子:

P { font: 12px//16px; }
... hundreds of additional lines of CSS...

在这里,我错误地将斜杠加倍。结果是字体声明被忽略,但其余所有工作正常。如果//引入了对-comments的支持,突然间右括号将被注释掉,从而有可能破坏样式表的其余部分。

现在您可以说这是我的错,因为我犯了一个错误,但这并不能改变互联网上未知数量的页面可能由于晦涩的原因而中断或呈现异常。

任何此类会破坏向后兼容性的更改都应非常谨慎地考虑,单行注释可能不足以吸引风险,因为唯一的好处是它节省了一些按键操作。

因此,如果CSS应该有单行注释,则可能应该从一开始就引入它。但是CSS最初是一种非常简单的语言,并且具有两种不同的注释语法在当时被认为是不必要的复杂性。(即使ANSI C也没有单行注释。)


哦,//是CSS中的令牌吗?一定要告诉。
迈克尔·布莱克本

当前//将被解析为两个“ delim令牌”,反过来在语法中的任何地方都不允许。有关详细信息,请参见w3.org/TR/css-syntax-3/#tokenization
JacquesB

MainMa为何以+1开头/**/,但接受它却是因为它也解决了为什么没有变化的原因。
Goose Goose 2016年

8

支持另一个语法元素并不是那么容易:有很多工具应该能够处理其他注释样式。实际上,看到大多数令牌生成器/解析器只是忽略换行符,可能用来代替它们,我不会感到惊讶;

如果这对语言至关重要,即使开发人员的生活变得更加轻松,则可以这样做。例如,在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.

埋在文字中。


JavaScript还支持单行//注释。
图兰斯·科尔多瓦

我认为这//在许多语言中都很常见,其背后的概念不仅仅是语法,它的功能也有所不同。也就是说,这是迄今为止最深入的答案。

我认为这根本不是一小部分。几乎任何使用原始语言编写CSS的人都会发现使用//添加注释更加容易。但是向后兼容的观点使它无济于事。
O'Rooney

-5

问题是大多数带有注释的语言(例如C#,Java)都是编译语言,并且编译器在将内容呈现给使用者(CPU)之前会剥离所有注释。CSS未编译;通常,文件是在设计人员开发文件时原封不动地发送的,因此没有机会删除注释。//样式注释然后需要//符号和换行符以保持语法正确性。

是的,存在缩小符,是的,javascript允许这种类型的注释。Javascript还允许eval(),因此我认为我们不想将其作为模型。


3
这个答案根本没有任何意义。“没有机会删除注释”-当然,解析器也完全像其他任何语言一样删除注释。否则CSS怎么会有/* */注释?
JacquesB

我的意思是设计师和消费者之间的第三方中介。编译器是该中介的编译语言。您所指的“解析器”是浏览器的子系统,它是内容的最终使用者。
迈克尔·布莱克本

那么,为什么解析器//在可以删除注释时不能删除注释/* */呢?
JacquesB

1
它可以,但随后必须同时查找//和换行符,换行符主要是语义内容,而不是语法内容。按照设计,CSS会将所有空白视为相同。为了支持//,您现在有了“特殊”空格,而且,“特殊”空格可能是一个字符(\ n),可能是两个字符(\ r \ n)。
迈克尔·布莱克本

3
@MichaelBlackburn:DSSSL(这是使用S-expression语法的CSS的前身)也具有单行注释。它与命令式语言与声明式语言无关。
JacquesB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.