为何HTML普通元素不能使用<sometag/>自闭合语法?
为什么HTML5不允许普通元素使用自闭合标签?
我最近在研读HTML5规范,刚好和我在页面中使用字体图标的场景相关。字体图标一般会用<i>或<span>标签,但根据HTML规范,这类标签必须写显式的闭合标签。
比如下面这种写法虽然在网络传输时更简短,但属于错误的HTML语法:
<span class="fa-user"/>
而正确的写法是:
<span class="fa-user"></span>
规范制定者肯定也关注传输效率,那为什么要在HTML5标准里规定普通元素不能在开始标签中自闭合?如果允许空的普通元素用自闭合标签,明明能为全球互联网节省不少字节,到底会有什么负面影响?
(注:我不是纠结语法合法性,这点查规范就能确认,我真正想搞懂的是背后的原因)
背后的核心原因主要有这几点:
- 历史兼容问题:HTML脱胎于SGML,早期浏览器对普通元素的解析逻辑已经固化。如果突然允许普通元素自闭合,大量现有页面可能会因为解析规则变化出现布局错乱或功能异常,这对整个互联网生态的影响太大。
- 解析一致性与复杂度:HTML解析器的逻辑和XML不同,XML严格遵循自闭合规则,但HTML有自己的容错解析机制。如果允许普通元素自闭合,解析器需要额外区分void元素(如
<img>、<input>)和普通元素,增加了解析复杂度,还容易出现歧义。 - 避免开发者混淆:如果放开
<span/>这种写法,开发者很可能会类推到<div/>、<p/>等元素,但实际上如果这些自闭合标签后面还有内容,HTML解析器大概率会把内容当成该元素的子节点,导致完全不符合预期的布局,大幅增加调试成本。 - 规范简洁性:保持void元素和普通元素的语法区分,能让规范更清晰,减少例外情况,降低开发者的学习成本和浏览器厂商的实现成本。
内容的提问来源于stack exchange,提问作者peterh
相关产品推荐
相关产品推荐

