
本文解释了为何html中允许使用未闭合或交叉嵌套的格式化标签(如 `` 和 ``),并说明其背后的历史成因、标准化演进及现代浏览器的解析逻辑。
HTML 并非“允许”交叉嵌套——从规范角度看,text 这类写法是非法的(违反嵌套规则)。但现代浏览器仍能渲染它,根本原因在于 HTML 解析器遵循的是 HTML Living Standard 中定义的容错(error-tolerant)解析算法,而非简单的 XML 式严格匹配。
例如,你提供的代码:
My text with some mixed formatting
在 Chrome、Firefox 或 Safari 中会被自动“修复”为语义合理的 DOM 结构。浏览器不会按字面顺序闭合标签,而是依据 “格式化元素栈(stack of open elements)” 和 “插入模式(insertion modes)” 等规则进行智能重排。实际生成的 DOM 近似如下(经简化):
My text with some mixed formatting
即: 会先关闭 及其内部未闭合的 和 ;随后 再关闭外层残留的 ;而 因被提前中断,可能被部分截断或移至合理位置。
立即学习“前端免费学习笔记(深入)”;
这一行为不是浏览器“随意发挥”,而是有明确规范依据:
✅ 官方文档来源:WHATWG HTML Living Standard – §12.2.5.5 The rules for parsing tokens in foreign content 及更核心的 §12.2.5 The tree construction stage;
✅ 它取代了过时的 RFC 1866 或 HTML 4.01 DTD 验证逻辑,采用状态机驱动的健壮解析器(称为 “HTML5 parser”),专为处理现实世界中大量不规范 HTML 而设计。
⚠️ 注意事项:
- 此容错机制仅适用于 HTML 文档(text/html MIME 类型);若以 application/xhtml+xml 发送,浏览器将严格执行 XML 规则,遇到未闭合标签直接报错停止渲染;
- 尽管能渲染,交叉嵌套仍会导致语义模糊、可访问性(a11y)下降、CSS 选择器失效、JS DOM 操作异常等隐患;
- W3C 验证器(validator.w3.org)或 Lighthouse 工具仍会将其标记为错误,开发中应始终遵循正确嵌套原则:
My text wit
h some mixed formatting My text with some mixed formatting
总结来说,这不是“浏览器 bug”,而是 HTML 标准主动拥抱现实的工程妥协——它让 Web 在野蛮生长年代得以存活,并延续至今。但作为开发者,我们应尊重规范,用正确的嵌套传递明确语义,把容错留给解析器,而不是写代码的习惯。











