为了完全地了解无内容元素,我们有必要了解一下它的历史。
HTML、XML 和 XHTML 都是基于 SGML 的,SGML 的全称是“标准通用标记语言”,起草于1986年。
HTML 和 XML 都派生自 SGML,其中 XML 是 SGML 的约束性子集,而 XHTML 是基于 XML 的。
XHTML 基本上和 HTML 一样,但是是基于 XML 的。
知道这层关系后,接下来进入本文最有意思的部分。
SGML 有一个特性叫做“无尾标签(NET,Null End Tag)”。当标签内只有简单的文字的时候,使用无尾标签就可以无须再闭合这个标签了。比如你可以把 <quote>Quoted text</quote> 写成 <quote/Quoted text/。(你没有看错,这个标签中不含 >。)
那么,不包含任何内容的标签就可以写成 <quote// 了,其中 quote 是标签名,第一个 / 用于启用无尾标签,第二个 / 表示无尾标签结束。
如果按照这个逻辑,<br// 中的前半部分 <br/ 会被解析为 <br>,那么 <br/> 岂不是要被解析为 <br>> 了吗?如果你和我想得一样,你肯定也会觉得这种语法很蠢。
不幸的是 HTML4 规范的制定者们不这么认为,并且把它写进规范里了。不过显然当时的浏览器厂商对这种语法也不以为然,支持的程度不大。(在这一点上,说不定浏览器厂商们做了一件好事。)
XML (也适用于 XHTML)规范的制定者意识到这种语法不怎么好,就直接没有包含无尾标签这种特性,
同时为无内容标签提供了一种比较好理解的语法。这种语法的名字叫做“无元素标签”,它看起来是这样的:<br />。这种语法看起来非常自然,因此当时的大多数开发者都认为这才是正确的写法。
幸运地是 HTML 一直在改进,W3C 的成员一直在从他们过去作出的错误中学习经验教训。因此 HTML5 相比之前的版本才有这么大的进步。