自90年代以来,我一直在编写HTML,但我刚刚发现了colgroup
和col
元素。 According to MDN,col
是 void元素,结束标记是禁止。
标记省略:开始标记是必需的,但是,因为它是一个void元素, 禁止使用结束标记。
我之前从未听说过虚空元素。 MDN没有关于void元素的页面,但empty element page说:
注意:在极少数情况下,空元素称为void 元素。这是一个不正确的名称,应该避免。
但是,W3 spec仅指向void元素,并且从不提及空元素:
void元素是其内容模型永远不允许的元素 在任何情况下都有内容。虚空元素可以有 属性。
所以我想知道:
<col span="2" />
是有效的语法还是<col span="2">
(没有斜杠),因为结束标记是禁止的?我可能错误地认为&#34;结束标记&#34;但我一直认为/>
(如<br />
和<img />
)是各种结束标记。答案 0 :(得分:13)
术语&#34;空元素&#34;来自SGML,HTML5之前的HTML标准基于SGML,其中EMPTY关键字用于表示具有空内容模型的元素。这是HTML 4 spec所说的内容:
元素的允许内容称为内容模型。设计为没有内容的元素类型称为空元素。使用关键字&#34; EMPTY&#34;。
声明此类元素类型的内容模型
使用img
元素的示例声明:
此示例说明了空元素类型的声明:
<!ELEMENT IMG - O EMPTY>
- 声明的元素类型为 IMG 。
- 连字符和以下&#34; O&#34;表示可以省略结束标记,但是与内容模型&#34; EMPTY&#34;一起,这被加强到结束标记必须被省略的规则。
- &#34; EMPTY&#34; keyword表示此类型的实例不得包含内容。
XML定义了一个&#34;空元素&#34;完全不同:
[定义:没有内容的元素据说为空。]
这里的不同之处在于XML并没有说出一个&#34;空元素&#34;是&#34;内容模型为空的元素&#34;。相反,它只是说一个&#34;空元素&#34;是一个没有内容的人。这与文档类型或XML模式是否定义该特定元素是否必须没有内容无关; XML本身就没有这样的限制。
附加术语&#34;空元素标记&#34;用于描述通常用于指示空元素的快捷语法/>
(同样,无论它们是否为空,按定义)。这通常也被称为&#34;自我关闭&#34;语法。
术语&#34; void element&#34;是HTML5的新手。它与&#34;空元素&#34;的HTML5前定义具有相同的定义:即,仅的元素具有开始标记,没有结束标记,并且不能包含任何内容。虽然W3C HTML5规范没有引用术语&#34;空元素&#34;,但术语&#34;空元素标签&#34;如XML中所述,用于related document:
在HTML语法中,void元素是始终为空且永远不会有结束标记的元素。列为void in the HTML specification或扩展规范中的所有元素,必须在多语言标记中具有XML empty-element tag(
<foo/>
)的语法形式。其他元素绝不能使用XML空元素标记语法。
现代HTML标准现在似乎更喜欢XML定义并避开以前的定义。这似乎很合适,因为现代HTML不再是SGML应用程序,而是自己的标记语言 。 (它也不是XML,而是多语言标记发挥作用的地方。)
所以,总结一下:
此外,根据定义,可以说所有void元素都是空元素,但空元素不一定代表void元素。
回答你的问题:
如果这些是同一个东西,它们应该被称为空元素而不是空元素吗?在这种情况下,W3规格是否过时且不值得信任?或者W3规范是否优先,即使它已经过时了?
{+ 1}},area
,br
和col
等元素更准确地称为void元素,如HTML5中所示。它们也被认为是空的,但仅仅是因为它们不能是非空的#34;
我不知道为什么MDN有一篇文章说&#34; [&#39; Void elements&#39;]是一个不正确的名字,应该避免。&#34;当它在大多数HTML引用中使用该名称时。我认为没有理由不相信官方规格。
如果它们不是同一个东西,
img
是有效的语法还是<col span="2" />
(没有斜杠),因为结束标记是禁止的?我可能错误地认为&#34;结束标记&#34;但我一直认为<col span="2">
(如/>
和<br />
)是各种结束标记。
<img />
只是有效的语法,因为HTML5认为它是一种通过XHTML标记void元素的流行方式,并且禁止它会不必要地破坏与许多XHTML文档的验证兼容性,否则这些文档将验证为HTML5。 HTML5本身定义<col span="2" />
没有意义(one specific exception在这里并不真正相关),因此实际上HTML5中的/>
只代表一个<col span="2" />
只有一个开始标记,没有结束标记,因此与col
相同,尽管对XML友好。
答案 1 :(得分:2)
您所引用的“W3规范”是非权威参考。 W3C推荐HTML 4.01将empty elements称为具有EMPTY
声明内容的元素,即不能包含任何内容的元素。它根本不使用短语“void element”。
HTML5草稿将HTML 4.01中的emppty元素元素指定为具有“空”内容模型,但实际上并未定义此类模型。相反,它提到void elements并说他们“不能有任何内容”。
因此混淆在于HTML5草案。独立于此,重要的是要区分不能(通过规范和实际应用的解析规则)的空/空元素,以及碰巧有<的任何内容和元素< / em>空内容,例如空<p>
元素(不良做法)和空<td>
元素(通常是不好的做法,但有效且有时足够)。