XHTML 是用 XML 规则约束 HTML 的变体,非升级版;要求标签小写、属性值加引号、空元素自闭合、且必须声明 application/xhtml+xml MIME 类型,否则解析失败或退化为 HTML。

XHTML 不是 HTML 的升级版,而是用 XML 规则重新约束 HTML 的一种变体;现代项目几乎不需要主动选择 XHTML,除非对接特定旧系统或强 XML 流程。
为什么浏览器对 <img> 不报错,但 XHTML 验证器会拒绝 <img src="a.jpg">
XHTML 要求所有元素必须显式闭合,空元素(如 <img>、<br>、<hr>)也得写成自闭合形式。HTML5 中 <img src="a.jpg"> 合法,但 XHTML 必须写成 <img src="a.jpg" />(注意斜杠前的空格可选,但 /> 不可省略)。漏掉 / 会导致解析失败,浏览器可能直接停止渲染或显示 XML 解析错误。
- 常见错误:复制粘贴 HTML 片段到 XHTML 环境,忘记补
/ - 注意点:
<input type="text">同样要写成<input type="text" /> - 验证工具(如 W3C Markup Validation Service)会明确提示 “element is not closed”
class="nav" 在 HTML 里能省引号,XHTML 里为什么必须写 class="nav"
XHTML 继承 XML 规则,所有属性值必须用双引号(")或单引号(')包裹,不能裸写。HTML5 允许 class=nav 或 class='nav',但 XHTML 中只有 class="nav" 或 class='nav' 有效。不加引号会被解析为 malformed markup,XML 解析器直接报错。
- 典型翻车场景:从 jQuery 动态拼接 HTML 字符串迁移到 XHTML 环境,
'<div class='+cls+'>'这种写法在 XHTML 下必然崩 - 连带影响:
id、src、href等所有属性都受此约束 - 特殊字符如空格、等号、尖括号出现在属性值中时,不加引号会直接导致解析中断
为什么把 <SCRIPT> 改成 <script> 还是被 XHTML 拒绝
XHTML 区分大小写,所有标签名和属性名必须小写。哪怕只有一处大写(比如 <DIV>、<Img>、<ONCLICK>),整个文档就不是 well-formed XML。HTML 对大小写完全不敏感,<SCRIPT> 和 <script> 等价;XHTML 中前者是非法标签名,解析器会当作未知元素处理,甚至中断 DOM 构建。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
- 容易忽略的点:内联事件处理器如
onClick必须写成onclick - 自定义属性(如
data-MyAttr)也要全小写:data-myattr - 编辑器自动补全有时保留大写习惯,需手动检查
application/xhtml+xml MIME 类型一设,页面就白屏
这是最隐蔽的坑:XHTML 文档必须通过 HTTP 响应头声明 Content-Type: application/xhtml+xml,仅靠 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...> 不够。如果服务器返回的是 text/html(绝大多数默认配置),浏览器就当普通 HTML 解析,前述所有 XHTML 语法规则都会被忽略——等于白写了。而一旦真设成 application/xhtml+xml,任何语法错误(哪怕多一个空格、少一个引号)都会让浏览器直接报 XML 解析错误,页面空白。
- 后果严重:前端调试时看不出问题,部署后因 MIME 类型未配对,XHTML 语义完全失效
- 兼容性现实:IE8 及更早版本根本不支持
application/xhtml+xml - 现代替代方案:用 HTML5 +
<!DOCTYPE html>,配合 ESLint / HTMLHint 等工具做语法检查,比硬套 XHTML 更可控
真正需要 XHTML 的场景极少,多数所谓“标准要求”其实只要 HTML5 语义化 + 严格校验就够了;强行套 XHTML 容易在大小写、闭合、引号、MIME 类型四个点上反复踩坑,且收益极低。


















