HTML4的无需DOCTYPE和xmlns,XHTML1.0则必须声明xmlns;HTML5仅需,推荐加lang属性以保障语义与无障碍。
必须带 DOCTYPE 和 xmlns 属性?不是必须,但 XHTML 1.0 严格要求。HTML4 本身是 SGML 衍生, 根元素可以不写 xmlns,但若声明为 XHTML(比如用 ..>),就必须加 xmlns="http://www.w3.org/1999/xhtml",否则解析会出错或降级渲染。
常见误操作:
——混搭了 HTML4 DOCTYPE 和 XHTML 的命名空间,浏览器可能进入怪异模式(Quirks Mode)或报解析警告。
xmlns,写了反而多余xmlns,且 MIME 类型应为 application/xhtml+xml(实际中极少这么用) 根元素精简到什么程度?HTML5 彻底放弃 SGML/DTD 约束,根元素回归极简: 就够了。不需要 xmlns,不校验属性顺序,大小写不敏感(但推荐小写),连 lang 都是可选的(不过强烈建议加)。
标准写法就是:
... ...
DOCTYPE 只能是 ,多一个空格、字母或注释都会触发 Quirks Mode
lang 不是语法必需,但影响屏幕阅读器、搜索引擎语义识别和部分 CSS 伪类(如 :lang()) 没写 lang 会导致某些 CSS 或 JS 行为异常?不是语法错误,但会影响实际运行效果。比如 q::before 和 q::after 的引号样式、:lang(en) { quotes: "“" "”" "‘" "’"; } 的匹配,都依赖 或更近的 lang 属性。JS 中 document.documentElement.lang 读不到值,国际化库(如 i18next)初始化也可能 fallback 到默认语言。
lang 时,document.documentElement.lang 返回空字符串,不是 "und" 或 null
lang 的页面仍按系统 locale 渲染数字/日期,但语义化能力归零 最容易漏改的点开发者常只改了 DOCTYPE,却保留旧习惯:加 xmlns、写全大写标签、嵌套 。这些在 HTML5 中要么无效,要么冗余。
xmlns 属性——HTML5 不使用命名空间 换成 (更短,且必须放在 前 1024 字节内)——HTML5 不支持 xml:lang,只认 lang
开始标签后直接跟 
,中间不能有文本或注释(否则部分旧版 IE 解析异常)根元素看着简单,但它是整个文档解析模式的开关。漏掉 lang 或多写 xmlns 不会报错,却会让语义、可访问性、国际化悄悄失效。