为啥“<!--”注释掉样式规则,而“<!--”没有?

Posted

技术标签:

【中文标题】为啥“<!--”注释掉样式规则,而“<!--”没有?【英文标题】:Why does "<! --" comment out a style rule, but "<!--" does not?为什么“<!--”注释掉样式规则,而“<!--”没有? 【发布时间】:2013-01-02 20:45:44 【问题描述】:

放过我吧。我只是在学习 html

根据http://www.w3.org/TR/html-markup/syntax.html#comments 和我见过的许多其他网站,例如http://www.w3schools.com/tags/tag_comment.asp

他们说 HTML 注释是 &lt;!-- text --&gt;! 和下一个破折号之间没有空格。

然而,我在下面显示,只有当我写 &lt;! -- test --&gt; 时,里面的东西才会真正被忽略。注意&lt;!--之间添加的空格

这是 HTML 代码

<!DOCTYPE HTML>
<html>
    <head>
     <style type="text/css">   
<!-- td border: 1px solid gray; -->
    </style>
</head>
<body>

<table>
  <tr>   <td>      test   </td>  </tr>
</table>

</body>
</html>

现在在你运行它之前,表格是否应该有边框?

如果text/css中的东西真的被注释掉了,那么表格应该没有边框吧?但确实如此。我在 linux mint 14 和 firefox 18.0 下的 chrome 版本 24.0.1312.52 上试过这个

现在当我将行改为

 <! -- td border: 1px solid gray; -->

现在注意额外的空间。然后表格按预期显示没有边框。当我实际删除整行时也会发生同样的情况:

<!DOCTYPE HTML>
<html>
    <head>
     <style type="text/css">   
     </style>
</head>
<body>

<table>
  <tr>   <td>      test   </td>  </tr>
</table>

</body>
</html>

问题是:评论是&lt;!-- text --&gt;还是&lt;! -- text --&gt;

【问题讨论】:

【参考方案1】:

CSS 不接受 HTML &lt;!-- comment here --&gt; cmets。相反,CSS 使用/* comment */ 来注释行。试试吧。

【讨论】:

jsfiddle.net 是 web 开发人员的一个很好的资源,您可以在互联网上测试代码并在故障排除时将其提供给其他人,它非常有用,您应该经常使用它或找到一个同样有用的代码共享工具。 +1 @Ilan Biala,你成功了。为了清楚起见,@Nasser:HTML cmets 应该转义&lt;!-- text --&gt;,但是在发表评论时,您处于 CSS 块中,因此适用其他规则。 是的,html 的真正用途是构建文档,而 css 用于对其进行样式设置。它们真的更好分开,您应该考虑将内联样式更改为链接到 html 页面的外部样式表。 @IlanBiala 或 w3schools.com 就像这个例子中的 w3schools.com/code/tryit.asp?filename=G0QISZ7D46ZI【参考方案2】:

字符串&lt;! -- 没有注释掉任何内容。相反,在 CSS 中这是一个语法错误,并且 CSS error processing 规则暗示在这种情况下所有样式表都被忽略了。

字符串&lt;!-- 也不会开始注释,但根据CSS comment 规则,它(以及--&gt;)在某些上下文中是允许和忽略(跳过)的。因此,样式表

<!-- td border: 1px solid gray; -->

被视为

border: 1px solid gray;

您可以使用 W3C CSS Validator 进行检查。第一种情况,带空格,报错,不报有效的CSS规则。第二种情况,不报错,规则显示为有效。

在 CSS 中,注释始终以 /* 开头并以 */ 结尾。

&lt;!----&gt; 的特殊规则的原因是很久以前(我们说的是 Netscape 1 还在使用的时候),一些浏览器无法识别 style 元素全部。这意味着他们忽略了&lt;style&gt;&lt;/style&gt; 标签并将它们之间的内容处理为普通的HTML 内容。这将导致样式表显示在此类浏览器的页面内。为了防止这种情况,为了“隐藏样式表”,样式表被包裹在 HTML 注释分隔符之间。旧浏览器会简单地忽略 style 元素的内容。但随后必须在 CSS 规范中添加一条特殊规则以允许使用分隔符。

这是古老的历史,但旧习惯盛行,甚至从其他人的代码中复制而不理解它们的含义。长期以来,没有理由“隐藏样式表”,而这个技巧现在已成为潜在风险(由于可能干扰 XHTML 规则或人们的混淆和输入错误)。

因此,切勿在 CSS 中使用 &lt;!--(或 &lt;! --)。

【讨论】:

我认为是早期的 Netscape(以及当时的其他浏览器),但不仅仅是 Netscape 1。【参考方案3】:

我看到人们出于兼容性目的在 CSS 样式块中使用 &lt;!-- --&gt;

在这种情况下,不支持 CSS 的旧浏览器会将其注释掉以避免错误。

<style type="text/css">   
<!-- td border: 1px solid gray; -->
</style>

将被解释为

<style type="text/css">
</style>

不支持 CSS 的旧浏览器。这样,这些浏览器就可以避免潜在的错误。

然而,在现代浏览器中,CSS 样式块中的 &lt;!-- --&gt; 将被忽略。

<style type="text/css">   
<!-- td border: 1px solid gray; -->
</style>

将被解释为

<style type="text/css">
td border: 1px solid gray;
</style>

通过支持 CSS 的浏览器。

【讨论】:

没有注释不会是错误,页面只会显示 td border: 1px solid gray; (这不是开发人员想要的,但这不是错误)。

以上是关于为啥“<!--”注释掉样式规则,而“<!--”没有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在标准浏览器里<col>标签不能用了,是w3c废弃掉了<colgroup>系列标签吗?

注释掉 Vue 模板元素的一部分

注释掉Vue模板元素的一部分

为啥 className 出现在我的样式规则中?

c++ 函数模板的问题,请看代码,为啥去掉注释后,visual studio 2012会无法运行。

外部样式表用标签<link/>导入放在头部,为啥不需要<style></style>,而@import要放在 <style>里面?