“空元素”一词来自 SGML,HTML5 之前的 HTML 标准基于 SGML,其中使用 EMPTY 关键字表示内容模型为空的元素。以下是
HTML 4 规范 的说明:
“元素允许的内容称为其内容模型。设计为不包含任何内容的元素类型称为‘空元素’。此类元素类型的内容模型使用关键字‘EMPTY’进行声明。”
下面是对
img
元素的示例声明:
This example illustrates the declaration of an empty element type:
<!ELEMENT IMG - O EMPTY>
- The element type being declared is IMG.
- The hyphen and the following "O" indicate that the end tag can be omitted, but together with the content model "EMPTY", this is strengthened to the rule that the end tag must be omitted.
- The "EMPTY" keyword means that instances of this type must not have content.
XML 定义"空元素"的方式与众不同:
[定义:没有内容的元素被称为空元素。]
这里的区别在于,XML并未说"空元素"是"其内容模型为空的元素"。相反,它只是说"空元素"是没有内容的元素。无论文档类型或XML模式是否定义了该特定元素必须没有内容,XML本身都不会施加此类限制。
另外一个术语"空元素标签"用于描述常用的表示空元素的快捷语法/>
(同样不管它们是否根据定义为空)。这也通常称为"自闭合"语法。
术语"空元素"是
HTML5中的新词。它与 HTML5 之前的“空元素”定义相同,即一个元素
仅有开始标签,没有结束标签,且不能包含任何内容。虽然 W3C HTML5 规范未涉及“空元素”这个术语,但在相关文档中使用了 XML 中描述的“空元素标签”的术语:
related document
在 HTML 语法中,无内容元素是一种始终为空且永远不具有结束标记的元素。在 HTML 规范或扩展规范中列出的所有无内容元素,在混合标记中必须具有 XML 空元素标签 的句法形式(<foo/>
)。其他元素不得使用 XML 空元素标签语法。
看起来现代HTML标准现在更喜欢XML定义,而避免以前的定义。这似乎很合适,因为现代HTML不再是SGML应用程序,而是一种标记语言“本身”。(它也不是XML,但这就是多语言标记的作用所在。)
因此,总结一下:
- 空元素是指没有内容的元素,无论它是否首先允许有内容。
- 无效元素是不能有任何内容的元素。
此外,可以说所有无效元素都是根据定义为空元素,但空元素不一定代表无效元素。
回答您的问题:
-
如果它们是同一件事,它们应该被称为空元素而不是无内容元素吗?在这种情况下,W3规范是否已经过时且不可信?还是说W3规范应该优先考虑,即使它已经过时?
例如area
、br
、col
和img
等元素更准确地被称为无内容元素,在HTML5中。它们也被认为是空的,但仅因为它们不能是“非空的”。
我不知道为什么MDN有一篇文章说“['Void elements']是一个不恰当的名称,应该避免使用。”,但它在大多数HTML参考中仍然使用这个名称。我看不出任何理由不相信官方规范。
-
如果它们不是同一件事,那么<col span="2" />
是否是有效的语法,或者应该是<col span="2">
(没有斜杠),因为结束标记是禁止的?我可能对“结束标记”有错误的想法,但我一直认为/>
(如<br />
和<img />
)是某种结束标记。
<col span="2" />
只有在HTML5将其识别为标记无内容元素的流行方式时才是有效语法,这要归功于XHTML,并且禁止它会不必要地破坏与许多XHTML文档的验证兼容性。HTML5本身定义/>
是毫无意义的(除了一个特定的例外,这里并不重要),因此实际上,在HTML5中<col span="2" />
仅表示一个只有开始标记而没有结束标记的col
,因此与<col span="2">
相同,但友好于XML。