CSS 块中的未封闭报价

Unclosed quote in a CSS block

此代码段在 Firefox 上为红色,在 Chrome 上为蓝色。谁是对的?

* { background: red; '}
* { background: blue; }

§4.1.6 Blocks 说:

Single (') and double quotes (") must also occur in matching pairs, and characters between them are parsed as a string.

但是如果'"没有出现在匹配对中,语法错误应该如何处理?

根据我对 4.2 Parsing Errors 的阅读,以及所谓的“匹配对规则”的构造:

* { background: red; '}
* { background: blue; }

应读作:

* { background: red; ...<EOF> }

也就是说,'} 之后的文件中的所有内容 都将被丢弃,因为 { 没有匹配的 }在那一行(因为在看到另一个 } 之前总会先有另一个 {),所以它不会被关闭,直到文件末尾隐式关闭它。

当然,它真的很复杂,所以我可能是错的...


进一步阅读 CSS21 语法似乎证实了这一点。基本上,这里有两种效果:

  1. 不匹配的 ' 将导致忽略当前行末尾的所有内容。而且,
  2. 不匹配的 { 将导致文件末尾的所有内容都被解析,就好像它仍然是同一声明块的一部分。

所以基本上,#1 导致结束 } 丢失。 #2 可能会导致它之后的所有内容都丢失,因为它不能被解析为块的有效声明(因为 {..} 嵌套计数总是错误的)。

虽然 Chrome 只是忽略了这一行而没有抱怨,Firefox 停止处理 CSS 并记录警告(这至少适用于 Chrome 41.0.2.. 和Mac OS X Yosemite 上的 FF 36.0.1:

Found unclosed string ''}'. Expected declaration but found ''}'. Skipped to next declaration.

虽然警告说 Skipped to next declaration.,但 FF 在我的情况下实际上没有(在提供的代码前后添加了一点 css)。

在我看来,这两者都不是一个很好的解决方案,因为现在网络在很大程度上依赖于 CSS,所以浏览器既不应该忽略语法错误,也不应该停止处理 [=25= 】 总而言之。

我知道问题中没有提到 Safari,我也不是它的忠实粉丝,但它的作用如下:记录警告,跳过该行并处理文件的其余部分。这就是我所期望的。

只是我的 0.02..