为什么HTML中的<img>标签不需要闭合?

67

出于好奇,为什么在HTML中<img>标签没有关闭?

<img src="smiley.gif" alt="Smiley face" height="42" width="42">

我也注意到在XHTML中,<img>标签是明确关闭的...

<img src="smiley.gif" alt="Smiley face" height="42" width="42"/>

W3Schools:图像标签


因为它没有内容,所有的操作都通过属性完成,不可能有子元素或文本,没有东西可以放在里面,只有自我关闭才有意义。不幸的是,HTML 标准化过于宽松,永远不需要明确要求使用自我关闭标签。 - scragar
7
我不确定你最后一句话的意思是什么——HTML已经非常明确定义和标准化了,并且已经有很多年了。 - BoltClock
1
@BoltClock 我的意思是标准非常宽容,不关闭标签是完全可以的,浏览器会根据语言的一般规则猜测标签的关闭位置。<p>text1<p>text2<p>text3应该创建3个段落,但大多数浏览器会假设每个 <p>标签在下一个开始时关闭,尽管它有一个常用的关闭标签。标准说这是可以接受的行为。 - scragar
@scragar:这是预期的行为,因为段落不能包含另一个段落(只能是内联元素)。 - Madara's Ghost
@SecondRikudo 请仔细阅读我写的内容,我说的是根据HTML标准来看这是正确的行为,只是根据XML标准来看这不是正确的行为,而我们在这里比较的是HTML和XML。HTML遵循一套更加宽容的规则。 - scragar
顺便提一下,值得注意的是audiovideo不是空元素,因为它们可以包含回退元素。如果你不小心的话,这会导致奇怪的布局故障。 - Sam Dutton
5个回答

61

从历史上看,HTML 基于 SGML(标准通用标记语言),在某些情况下允许省略标签。

<img> 元素不能有任何子节点,因此被定义为 EMPTY 元素,禁止使用结束标签(因为它没有作用)。

XHTML 是 XML 表示的 HTML,而 XML 不支持可选或禁止的标签(尽管它允许一个自闭合标签替代一个起始+结束标签对),因此必须在那里显式关闭。

HTML 5 向后兼容基于 SGML 的 HTML 版本。


1
值得补充的是,XHTML(顾名思义)旨在成为格式良好的XML,因此具有关闭标记。 - Ben
2
历史上,<img>标签最初是以一种快速而粗略的方式定义和实现的,后来被正式(仅仅是正式)改进为SGML语法。HTML的任何真正的实现都不是基于SGML的。 - Jukka K. Korpela
“结束标签被禁止”?我尝试过 <img src="http://www.mozilla.org/images/mozilla-banner.gif"></img>,没有错误?也许 Chrome 只是忽略了 </img> - Tina Chen
5
浏览器会对格式错误的HTML进行大量的错误恢复。使用验证器来测试HTML错误,不要依赖浏览器来报告它们。 - Quentin

22
<img>标签代表一个被称为空元素(参见HTML5规范)的元素,因为它不能有任何内容(与<a><div>等不同)。因此,在HTML中它没有语法上的需要被闭合。
然而,XHTML基于XML,其中每个标签都需要被关闭。

5
这是所谓的空元素,这意味着该元素不能有任何内容(但可以有属性)。HTML5规范对空元素有如下说明:
如果该元素是空元素之一,或者是外来元素,则可能会有一个斜杠“/”(U+002F)字符。该字符对空元素没有影响。 因此,没有实际理由添加单个斜杠“/”(U+002F)字符,但如果包含该字符,也不会破坏任何内容。

1
请注意,快捷语法“/”仅作为方便而允许使用。HTML5规范明确禁止使用显式的结束标签,如“</img>”。 - BoltClock

4

<img>标签基本上是一个Void元素。

为了您的理解:

图片没有任何内容。 图像标签只会通过src属性提供从哪里加载资源的路径。因此,它不需要任何结束元素。

<img src="smiley.gif" alt="Smiley face" height="42" width="42"/>,这段代码是用于XHTML版本的。


0

在图像中,你不会像在 h1 中放置文本一样放置任何内容。

例如:

<h1>hi</h1>
<img src=blblb alt=blbl/>

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