【问题标题】:Are void elements and empty elements the same?空元素和空元素是一样的吗?
【发布时间】:2014-10-08 10:08:00
【问题描述】:

我从 90 年代就开始编写 HTML,但我刚刚发现了 colgroupcol 元素。 According to MDNcol 是一个 void 元素,结束标记是 forbidden

标签省略:开始标签是强制性的,但是,因为它是一个空元素, 禁止使用结束标签。

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

注意:在极少数情况下,空元素被称为 void 元素。这是一个不恰当的名称,应避免使用。

但是,W3 spec 仅指 void 元素,从未提及空元素:

一个 void 元素是一个其内容模型不允许它 在任何情况下都有内容。空元素可以有 属性。

所以我想知道:

  1. 如果它们是同一个东西,它们应该被称为空元素而不是空元素吗?在这种情况下,W3 规范是否已过时且不可信?还是应该优先考虑 W3 规范,即使它已经过时?
  2. 如果它们不是同一个东西,<col span="2" /> 是有效语法还是应该是 <col span="2">(不带斜线),因为结束标记是被禁止的?我可能对“结束标签”有错误的想法,但我一直认为/>(如<br /><img />)是某种结束标签。

【问题讨论】:

  • 我认为没有任何理由相信第三方来源而不是第一方来源,尤其是当第三方来源本身与它所说的相矛盾时,无论如何在自己的文本中交替使用两个术语。
  • 你为什么不尝试其中一个,看看它是否有效
  • Void 元素有一种特殊的表示方式,称为self-closing tags。空元素将有单独的结束标签但没有内容。

标签: html w3c


【解决方案1】:

您引用的“W3 规范”是非权威参考。 W3C Recommendation HTML 4.01 将empty elements 称为具有EMPTY 声明内容的元素,即不能有任何内容的元素。它根本不使用短语“void element”。

HTML5 草案将 HTML 4.01 中的空元素指定为具有“空”内容模型,但实际上并未定义这样的模型。相反,它提到了void elements,并说他们“不能有任何内容”。

所以混淆就在 HTML5 草案中。与此无关,重要的是区分 不能(根据规范和实际应用的解析规则)曾经有任何内容和元素的空/无效元素 恰好有 空内容,例如空的 <p> 元素(不好的做法)和空的 <td> 元素(通常是不好的做法,但有效且有时足够)。

【讨论】:

  • 我没有意识到有这么多文件,所以我以为我在看“规范”。感谢您指出这一点。
【解决方案2】:

术语“空元素”来自 SGML,HTML5 之前的 HTML 标准基于该标准,其中 EMPTY 关键字用于表示具有空内容模型的元素。这是HTML 4 spec 所说的:

一个元素允许的内容被称为它的内容模型。设计为没有内容的元素类型称为空元素。此类元素类型的内容模型使用关键字“EMPTY”声明。

带有img 元素的示例声明:

这个例子说明了一个空元素类型的声明:

<!ELEMENT IMG - O EMPTY>
  • 声明的元素类型是IMG
  • 连字符和后面的“O”表示可以省略结束标记,但与内容模型“EMPTY”一起,加强到结束标记必须省略的规则.
  • “EMPTY”关键字表示这种类型的实例不能有内容。

XML 对“空元素”的定义完全不同:

[定义:没有内容的元素称为empty。]

这里的区别在于 XML 没有说“空元素”是“内容模型为空的元素”。相反,它只是说“空元素”是没有内容的元素。这与文档类型或 XML 模式是否将特定元素定义为必须没有内容无关; XML 本身没有这样的限制。

另一个术语“空元素标记”用于描述快捷语法/&gt;,通常用于指示空元素(同样,无论它们是否根据定义为空)。这通常也称为“自关闭”语法。

术语“空元素”是HTML5 的新词。它与HTML5之前对“空元素”的定义相同:即只有有开始标签,没有结束标签,并且不能有任何内容的元素。尽管 W3C HTML5 规范没有引用术语“空元素”,但 XML 中描述的术语“空元素标记”在related document 中使用:

在 HTML 语法中,void 元素是始终为空且从不具有结束标记的元素。所有列为 void in the HTML specification 或在扩展规范中的元素,在多语言标记中必须具有 XML empty-element tag (&lt;foo/&gt;) 的语法形式。其他元素不得使用 XML 空元素标记语法。

似乎现代 HTML 标准现在更喜欢 XML 定义并避开以前的定义。这似乎很合适,因为现代 HTML 不再是一种 SGML 应用程序,而是一种标记语言本身。 (它也不是 XML,但这就是多语言标记发挥作用的地方。)

所以,总结一下:

  • 一个空元素是一个没有内容的元素,不管它是否被允许有内容。
  • void 元素是一种不能有任何内容的元素。

另外,可以说所有的void元素在定义上都是空元素,但是一个空元素并不一定代表一个void元素。

回答您的问题:

  1. 如果它们是同一个东西,它们应该被称为空元素而不是空元素吗?在这种情况下,W3 规范是否已过时且不可信?还是应该优先考虑 W3 规范,即使它已经过时?

    像在 HTML5 中一样,areabrcolimg 等元素更准确地称为 void 元素。它们也被认为是空的,但这仅仅是因为它们不能是“非空”的。

    我不知道为什么 MDN 有一篇文章说“['Void elements'] 是一个不恰当的名称,应该避免使用。”无论如何,当它在大多数 HTML 引用中使用该名称时。我认为没有理由不相信官方规范。

  2. 如果它们不是同一个东西,&lt;col span="2" /&gt; 是有效语法还是应该是 &lt;col span="2"&gt;(不带斜杠),因为结束标记是被禁止的?我可能对“结束标签”有错误的想法,但我一直认为/&gt;(如&lt;br /&gt;&lt;img /&gt;)是某种结束标签。

    &lt;col span="2" /&gt; 是唯一有效的语法,因为 HTML5 将其视为标记 void 元素的流行方式,这要归功于 XHTML,并且禁止它会不必要地破坏与许多 XHTML 文档的验证兼容性,否则这些文档将被验证为 HTML5。 HTML5 本身将 /&gt; 定义为无意义(one specific exception 在这里并不真正相关),因此实际上 HTML5 中的 &lt;col span="2" /&gt; 仅表示只有一个开始标记而没有结束标记的 col,因此与&lt;col span="2"&gt;,尽管是 XML 友好的。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多