HTML:包含还是排除可选的闭合标签?

150

一些HTML1的闭合标签是可选的,例如:

</HTML>
</HEAD>
</BODY>
</P>
</DT>
</DD>
</LI>
</OPTION>
</THEAD>
</TH>
</TBODY>
</TR>
</TD>
</TFOOT>
</COLGROUP>

注意:不要与禁止包含的关闭标签混淆,例如:

</IMG>
</INPUT>
</BR>
</HR>
</FRAME>
</AREA>
</BASE>
</BASEFONT>
</COL>
</ISINDEX>
</LINK>
</META>
</PARAM>

注意:xhtml与HTML不同。xhtml是xml的一种形式,要求每个元素都有一个闭合标签。在html中,可以禁止使用闭合标签,但在xhtml中则是强制的。

可选的闭合标签

  • 理想情况下应该包含,但如果您忘记了,我们也会接受它们,或者
  • 理想情况下应该不包含,但如果您加入了它们,我们也会接受它们。

换句话说,我应该包含它们,还是不包含它们?

HTML 4.01规范谈到闭合元素标签是可选的,但并没有说明包含它们是否更好,或者不包含它们是否更好。

另一方面,DevGuru上的一篇随机文章说

结束标记是可选的。然而,建议将其包含在内。

我问的原因是因为您知道出于兼容性考虑,它是可选的;如果可以的话,他们会使它们(强制|禁止)。

换句话说:HTML 1、2、3对于这些现在可选的闭合标签做了什么?HTML 5又做了什么?我应该怎么做?

注意

HTML中有一些元素是禁止使用闭合标签的。你可能不同意,但这是规范,不容置疑。我问的是可选的闭合标签,以及其意图。

脚注

1HTML 4.01


4
难题……一些 W3C 推荐甚至包括同时进行两种方法的示例:http://www.w3.org/TR/html401/struct/global.html#id-and-class。第一个示例有闭合的 </p> 标签,而第二个则省略了它们! - Richard JP Le Guen
1
еҸӘжҳҜдёәдәҶжҫ„жё… - еңЁHTML5дёӯзҰҒжӯўдҪҝз”Ёзҡ„ж ҮзӯҫпјҢ"жҳҫејҸ"/XMLжңүж•Ҳзҡ„и§ЈеҶіж–№жЎҲжҳҜз”Ё/>е…ій—ӯе®ғ们пјҢдҫӢеҰӮ<meta charset="utf-8" />пјҢеҚідҪҝ<meta charset="utf-8">жҳҜжңүж•Ҳзҡ„HTML5пјҹ - cboettig
1
@IanBoyd 真的吗?在HTML5中?W3C混合语言HTML/XHTML作者指南草案建议使用带有闭合标签的<meta charset="UTF-8"/>。否则,混合语言或XHTML如何能够验证为HTML5和XML呢? - cboettig
@cboettig 你是对的。多语言标记(即HTML兼容XHTML文档不能成为有效的HTML 4.01。HTML5(仍在进行中)有“Void”元素的概念-不能有结束标记的元素。大多数浏览器可能会宽容一些,并原谅您的标记错误。 - Ian Boyd
我曾经通过程序生成内部HTML报告类型的文档,一旦移除了所有可选的闭合标签,文档大小就会变成原来的三分之一。因此,当我需要通过电子邮件发送超过19MB的HTML时,我会省略可选的闭合标签。 - Matthew Lock
显示剩余4条评论
14个回答

62

有些情况下,显式标签是有帮助的,但有时这只是无谓的追求。

请注意,HTML规范明确指定何时可以省略标签,因此并不总是错误。

例如,您永远不需要 </body></html>。没有人会记得明确放置 <tbody>(以至于XHTML对其进行了例外处理)。

除非您有DOM操作脚本实际搜索 <head>,否则您不需要 </head><body>(然后最好明确地关闭它,因为隐含结束 <head> 的规则可能会使您感到惊讶)。

嵌套列表实际上最好不要使用 </li>,因为这样更难创建出错误的 ul > ul 树。

有效:

<ul>
  <li>item
  <ul>
    <li>item
  </ul>
</ul>

无效:

<ul>
  <li>item</li>
  <ul>
    <li>item</li>
  </ul>
</ul>

请注意,无论您尝试关闭所有元素还是不尝试关闭,结束标记都是隐含的。添加结束标记并不会自动使解析更加健壮:

<p>foo <p>bar</p> baz</p>

将解析为:

<p>foo</p><p>bar</p> baz

只有在验证文档时才能提供帮助。


4
为什么<p>foo <p>bar</p> baz</p>不会被解析为两个嵌套的p标签? - Eric
20
因为<P>元素不能包含块级元素,而<P>本身就是一个块级元素。根据(http://www.w3.org/TR/REC-html40/struct/text.html#edef-P),“`<P>元素表示一个段落。它不能包含块级元素(包括<P>`本身)。”。 - Ian Boyd
1
@IanBoyd 你的意思是无论CSS规则如何,都不能包含块级元素吗? - Pacerier
6
@Pacerier CSS 无法以任何方式影响 DOM。DOM 首先被解析,然后 CSS 显示它。CSS 的 block 显示与 HTML 的块级内容是完全不同的东西(通常情况下,大多数 HTML 块级元素默认显示为 CSS block)。 - Kornel
3
不,这两者不同。省略可选的闭合标签的处理在所有兼容的浏览器中都有明确规定并且可以可靠地工作。然而,自定义的<t>标签不能像<title>标签一样正常工作。 - Kornel
显示剩余3条评论

51

可选的标签指那些在没有结束标签时也能清晰表达语义的标签。 例如,每个 <li> 标签都暗示着前面没有 </li> 标签。

禁止使用的结束标签紧随其后就会被关闭,因此每次都需要输入 <img src="blah" alt="blah"></img> 有点多余。

我几乎总是使用可选标签(除非我有非常好的理由不这样做),因为它有助于编写更易读和可维护的代码。


20
现在我明白了。<LI>就像一个符号。没有人想要把一个整个的符号点用<LI>...</LI>包起来。所以从这个角度来看,LI标签与人们在标记时自然书写的方式是匹配的。同样适用于段落标志(<P>),在文字处理中,你会在段落开头添加段落标志,而不是在每个段落结尾处添加。因此,在这种解释中,闭合标签是可选的,因为普通人不会想到要使用它们。此外,该元素本身没有内容-元素就是内容。 - Ian Boyd
9
“我几乎总是使用可选标签”这句话的意思是你是“包括”结束标签,还是“省略”它?(在阅读你的回答时,我有这样一种印象,即你会“包括”它,但上面Ian Boyd的评论给了我一个印象,即你会“省略”它。) - KajMagnus
3
@IanBoyd,最后一个段落呢? - Pacerier
22
几百年来,人们已经开始写文字段落。当一个段落结束时,从来没有人会感到困惑。 - Ian Boyd
4
对于那些在寻找实际参考文档时发现这个答案的人,这是HTML5相关链接:http://www.w3.org/TR/html5/syntax.html#optional-tags - Mike 'Pomax' Kamermans
显示剩余3条评论

20

我在这里添加一些链接,帮助你了解HTML的历史,以便理解各种矛盾之处。这不是你问题的答案,但是阅读这些摘要后,你会更加了解。

深入HTML5中的一些摘录:

“破碎”的HTML标记仍然能在Web浏览器中正常工作,这导致作者创建了大量的破碎页面。据估计,今天Web上超过99%的HTML页面都至少有一个错误。但是由于这些错误不会导致浏览器显示可见的错误消息,因此没有人修复它们。 W3C认为这是Web的根本问题,并着手纠正。1997年发布的XML打破了原谅客户端的传统,并规定消耗XML的所有程序必须将所谓的“格式良好性”错误视为致命错误。这个在第一个错误时失败的概念被称为“严格错误处理”,得名于希腊领袖Draco,他对相对较小的违规行为实施了死刑。当W3C将HTML重新制定为XML词汇表时,他们规定使用新的application / xhtml + xml MIME类型提供的所有文档都将受到严格的错误处理。如果您的XHTML页面中有甚至一个格式良好性错误[...], Web浏览器将别无选择,只能停止处理并向最终用户显示错误消息。 这个想法并不普遍受欢迎。随着现有页面估计错误率达到99%,始终存在向最终用户显示错误的可能性,以及XHTML 1.0和1.1中缺乏新功能来证明成本的合理性,Web作者基本上忽略了application / xhtml + xml。但这并不意味着他们完全忽略了XHTML。哦,绝对不是。 XHTML 1.0规范的附录C为世界各地的Web作者提供了一个漏洞:“使用类似XHTML语法的东西,但将其保持为text / html MIME类型提供。”数千个Web开发人员就是这样做的:他们“升级”到XHTML语法,但仍然使用text / html MIME类型提供它。 即使在今天,数百万个Web页面声称自己是XHTML。它们从第一行开始使用XHTML文档类型声明,使用小写标记名称,在属性值周围使用引号,并在空元素之后添加尾随斜杠,例如<br /><hr />。但是,只有其中一小部分页面使用会触发XML严格错误处理的application / xhtml + xml MIME类型。使用任何MIME类型为text / html的页面-无论doctype,语法或编码风格如何-都将使用“宽容”的HTML解析器进行解析,默默地忽略任何标记错误,即使页面在技术上是破碎的,也不会警告最终用户(或其他人)。 XHTML 1.0包含了这个漏洞,但XHTML 1.1关闭了它,而从未最终确定的XHTML 2.0继续要求进行严格的错误处理。这就是为什么有数十亿个页面声称自己是XHTML 1.0,只有少数声称自己是XHTML 1.1(或XHTML 2.0)的原因。那么你真的在使用XHTML吗?检查您的MIME类型。(实际上,如果您不知道自己正在使用的MIME类型,我几乎可以保证您仍在使用text / html。)除非您使用application / xhtml +
[T]提出发展HTML和HTML表单的人们面临两个选择:放弃或在W3C之外继续工作。他们选择了后者,注册了whatwg.org域名,并在2004年6月成立了WHAT工作组
[T] WHAT工作组还悄悄地开展了其他一些工作。其中之一是一个规范,最初被称为Web Forms 2.0,它向HTML表单添加了新类型的控件。(您将在A Form of Madness中了解更多关于网络表单的内容。)另一个是一个草案规范,称为“Web Applications 1.0”,其中包括主要的新功能,如直接模式绘图画布和本机支持音频和视频无需插件
在2009年10月,W3C 关闭了XHTML 2工作组发布了这份声明来解释他们的决定:
当W3C在2007年3月宣布了HTML和XHTML2工作组时,我们表示将继续监测XHTML 2市场。W3C认识到向社区传达有关HTML未来的明确信号的重要性。
虽然我们认识到XHTML 2工作组多年来所做出的贡献的价值,但在与参与者讨论后,W3C管理层已决定允许工作组的特许权在2009年底到期,并不予续订。
胜利者是那些成功推出产品的人。

13
我询问的原因是因为你知道这些标签是可选的,出于兼容性考虑;如果可以的话,他们会使它们成为(强制|禁止)的。
这是一个有趣的推论。我的理解是,只要能够可靠地推断出标签,标签就是可选的。设计表明意图是使编写快速简便。
HTML 2的DTD嵌入在RFC中,连同最初的HTML DTD一起,所有地方都有可选的开始和结束标记。
HTML 3被放弃了(由于浏览器战争),并被HTML 3.2所取代(旨在描述当时的网络状态)。
HTML 5从一开始就致力于“铺设奶牛路径”。
那我该怎么做?
啊,现在这是主观的和有争议的 :)
有些人认为,显式标记更易于阅读和维护,因为它们在读者眼前。
有些人认为,推断标记更易于阅读和维护,因为它们不会混乱编辑器。

1
+1 我之前没有想到“可靠推断”的概念。这表明并没有真正的倾向于任何一方的想法。我认为规范试图尽可能与现有的HTML内容和HTML规范兼容。 - Ian Boyd
抱歉,戴夫,我把它给了aslum;他需要声望 :) 但你有相同的想法,更多的链接和引用内容。不过回答很好。 - Ian Boyd

8

+1 针对草案 HTML 5 规范的链接和适当的章节。但是 HTML 5 没有明确说明。 - Ian Boyd

7
如果它是多余的,请省略它。
如果它有用(即使是看似微不足道的目的,比如取悦你的IDE或眼睛),请保留它。
在一个明确定义的规范中,很少看到对行为没有影响的可选项。当然,“注释”除外。但HTML规范不太像设计规范,更像当前主要实现状态的文档。因此,当一个项目在HTML中是可选的,并且似乎没有任何作用时,我们可以猜测可选性仅仅是特定浏览器中的怪癖的文档记录。
查看上面链接的HTML-5规范RFC部分,您会发现可选标签与注释的存在奇怪地相关!这应该告诉您作者们没有戴上设计帽子。他们正在玩“记录主要实现中的怪癖”的游戏。因此,在这方面我们不能太认真地看待规范。
所以,解决方案是:不要过于纠结,转而关注实际重要的事情。 :)

5

我认为最好的做法是包含闭合标签以便于阅读或者错误检测。然而,如果你有大量生成的HTML(比如数据表格),可以省去可选标签来节省带宽。


2
Richard:当你有深度嵌套的结构时,更容易找到错误,因为闭合标签提供了更多关于意图的信息。 - Gabe
1
我认为“闭合标签提供更多关于意图的信息”是对这个问题最好的简明回答。它提出了一个很好清晰的理由,支持某一种方式。 - squarecandy

4
我建议您省略大多数可选的结束标签和所有可省略的属性。许多 IDE 将提示错误,因此您可能无法省略其中一些,但通常更好的方式是减小文件大小和减少混乱。如果您有代码生成器,一定要省略结束标记,因为可以从中获得很好的大小减少。通常,这并不重要。
但是,在重要的情况下一定要采取行动。在我最近的工作中,通过消除大部分生成的结束标记和开放标记的冗余值属性(其中元素文本与值相同)来减小了呈现 HTML 的大小,将其从1.5 MB降至800 KB。我有大约200个标记。我可以完全以其他方式实现它,但那需要更多的工作($$$),所以这使我能够轻松地使页面更具响应性。
只是出于好奇,我发现如果删除不需要引号的属性,可以节省20 KB,但我的IDE(Visual Studio)不喜欢它。我还惊讶地发现,ASP.NET 生成的非常长的 ID 占据了文件的 20%。
我们能够严格有效地获得任何相关的 HTML 的想法本身就是错误的,因此做出最适合您和您的客户的操作即可。我曾经看到或使用过的大多数工具都会说它们生成 XHTML,但它们并不真正 100% 工作,严格遵守也没有任何好处。

我几乎无法接受省略可选的结束标签,但我认为省略属性引号是一个非常糟糕的想法。这样做会使您的网站在某些浏览器中出现故障。如果您有800kb的HTML文件,则表示您的操作存在严重问题。 - Christoph
2
@Christoph:根据HTML规范,省略可选的结束标签(如</p></li>)是完全可以的。如果浏览器无法理解,则是浏览器的问题。 - Konrad Borowski

2

个人而言,我喜欢XHTML,并且像ghoppe一样,“我尽量不省略结束标签,因为这有助于我保持严谨,不会省略必要的标签。”

但是

如果您有意使用HTML 4.n,则无法争论包含它们使文档更易消费,因为良好格式的概念与有效性不同,是XML的概念,当您禁止某些关闭标签时,您将失去这种好处。所以唯一的问题就变成了有效性...如果没有它们仍然有效...那么您可能会节省带宽,对吗?


2
使用结束标记使处理片段更容易,因为它们的行为不依赖于同级元素。仅此原因就足以引人入胜。还有谁会处理单块的html文档呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接