void元素和空元素是一样的吗?

时间:2014-08-14 16:51:01

标签: html w3c

自90年代以来,我一直在编写HTML,但我刚刚发现了colgroupcol元素。 According to MDNcol void元素,结束标记是禁止

  

标记省略:开始标记是必需的,但是,因为它是一个void元素,   禁止使用结束标记。

我之前从未听说过虚空元素。 MDN没有关于void元素的页面,但empty element page说:

  

注意:在极少数情况下,空元素称为void   元素。这是一个不正确的名称,应该避免。

但是,W3 spec仅指向void元素,并且从不提及空元素:

  

void元素是其内容模型永远不允许的元素   在任何情况下都有内容。虚空元素可以有   属性。

所以我想知道:

  1. 如果这些是相同的东西,它们应该被称为空元素而不是空元素吗?在这种情况下,W3规格是否过时且不值得信任?或者W3规范是否优先,即使它已经过时了?
  2. 如果它们不是同一个东西,<col span="2" />是有效的语法还是<col span="2">(没有斜杠),因为结束标记是禁止的?我可能错误地认为&#34;结束标记&#34;但我一直认为/>(如<br /><img />)是各种结束标记。

2 个答案:

答案 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元素。

回答你的问题:

  1.   

    如果这些是同一个东西,它们应该被称为空元素而不是空元素吗?在这种情况下,W3规格是否过时且不值得信任?或者W3规范是否优先,即使它已经过时了?

    {+ 1}},areabrcol等元素更准确地称为void元素,如HTML5中所示。它们也被认为是空的,但仅仅是因为它们不能是非空的#34;

    我不知道为什么MDN有一篇文章说&#34; [&#39; Void elements&#39;]是一个不正确的名字,应该避免。&#34;当它在大多数HTML引用中使用该名称时。我认为没有理由不相信官方规格。

  2.   

    如果它们不是同一个东西,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>元素(通常是不好的做法,但有效且有时足够)。