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

Dav*_*edy 16 html w3c

我从90年代开始就一直在写HTML,但我刚刚发现了这些colgroupcol元素.根据MDN,col是一个空元素,禁止结束标记.

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

我之前从未听说过虚空元素.MDN没有关于void元素的页面,但空元素页面显示:

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

但是,W3规范仅涉及void元素,并且从不提及空元素:

void元素是一个元素,其内容模型在任何情况下都不允许它拥有内容.Void元素可以具有属性.

所以我想知道:

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

Bol*_*ock 13

术语"空元素"来自SGML,HTML5之前的HTML标准基于SGML,其中EMPTY关键字用于表示具有空内容模型的元素.以下是HTML 4规范所说的内容:

元素的允许内容称为其内容模型.设计为没有内容的元素类型称为空元素.使用关键字"EMPTY"声明此类元素类型的内容模型.

使用img元素的示例声明:

此示例说明了空元素类型的声明:

<!ELEMENT IMG - O EMPTY>
Run Code Online (Sandbox Code Playgroud)
  • 声明的元素类型是IMG.
  • 连字符和后面的"O"表示可以省略结束标记,但是与内容模型"EMPTY"一起,这被加强到必须省略结束标记的规则.
  • "EMPTY"关键字表示此类型的实例不得包含内容.

XML以不同的方式定义"空元素":

[定义:没有内容的元素被认为是空的.]

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

附加术语"空元素标记"用于描述/>通常用于指示空元素的快捷语法(同样,无论它们是否为空,根据定义).这通常也称为"自闭合"语法.

术语"void element"是HTML5的新增内容.它具有与"空元素"的HTML5前定义相同的定义:即,具有开始标记,没有结束标记且不能具有任何内容的元素.虽然W3C HTML5规范没有引用术语"空元素",但XML中描述的术语"空元素标记"用于相关文档:

在HTML语法中,void元素是始终为空且永远不具有结束标记的元素.在HTML规范或扩展规范中列为void的所有元素,必须在多语言标记中具有XML 空元素标记(<foo/>)的语法形式.其他元素绝不能使用XML空元素标记语法.

似乎现代HTML标准现在更喜欢XML定义并避开以前的定义.这似乎是恰当的,因为现代的HTML不再是SGML应用程序,而是一个标记语言在自己的权利.(它也不是XML,但这就是多语言标记发挥作用的地方.)

所以,总结一下:

  • 一个空元素是一个没有内容,不管它是否被允许在首位的内容.
  • 一个空元素是一个不能有任何的内容.

另外,可以说根据定义,所有void元素都是空元素,但是空元素不一定表示void元素.

在回答你的问题时:

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

    元件,例如area,br,colimg更精确地称为空隙元件,如在HTML5.它们也被认为是空的,但仅仅因为它们不能"非空".

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

  2. 如果它们不是同一个东西,是<col span="2" />有效的语法还是应该是<col span="2">(没有斜杠)因为结束标记是被禁止的?我可能错误地认为"结束标记",但我一直认为/>(在<br />和中<img />)是一种结束标记.

    <col span="2" />这只是有效的语法,因为HTML5认为它是一种通过XHTML标记void元素的流行方式,并且不允许它会不必要地破坏与许多XHTML文档的验证兼容性,否则这些文档将验证为HTML5.HTML5本身定义/>为没有意义(有一个特定的例外,这里没有真正相关),所以实际上<col span="2" />HTML5只代表一个col只有一个开始标记而没有结束标记,因此<col span="2">尽管是XML友好的.