有效 HTML DOCTYPES¶
DOCTYPE 是解析模式触发器,不是 HTML 元素,也不会选择浏览器版本。 新文档只应使用简短的 HTML doctype。
新文档推荐¶
该声明不区分 ASCII 大小写,但统一小写便于维护。它必须位于文档开头、html 元素之前;
前面不要放普通文本或 HTML 注释,以免旧浏览器进入非预期模式。
当前有效写法¶
| 场景 | 声明 | 状态 |
|---|---|---|
| HTML 文档 | <!doctype html> |
推荐;触发标准模式 |
| 旧系统要求 public 标识符 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"> |
允许的过渡兼容形式,勿用于新项目 |
| 旧系统要求 system 标识符 | <!DOCTYPE html SYSTEM "about:legacy-compat"> |
仅供无法输出简短声明的遗留生成器 |
about:legacy-compat 不是可下载 DTD,也不赋予额外 HTML 功能。
历史 HTML 4 声明¶
以下声明常见于旧页面,用于识别和迁移;不要复制到新文档。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
这些 DTD 对应历史 HTML 4 文档类型。Transitional 曾允许部分表现性写法,
Frameset 对应已废弃的框架页面;现代迁移目标都是语义 HTML 加 CSS。
历史 XHTML 1.0 声明¶
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
仅写 XHTML doctype 不会让 text/html 响应变成 XML。真正的 XHTML 使用 XML MIME 类型,
遵守 XML 大小写、良构和错误处理规则,部署前必须明确兼容性要求。
浏览器解析模式¶
| 模式 | 触发情况 | 影响 |
|---|---|---|
| 标准模式 | 正确的现代 doctype | 按现代 CSS 和布局规则渲染 |
| 有限怪异模式 | 少数历史 doctype | 大体标准,但表格单元格等有兼容差异 |
| 怪异模式 | 缺失或特定错误、旧式 doctype | 模拟旧浏览器布局行为 |
可在控制台检查 document.compatMode:标准模式通常为 CSS1Compat,
怪异模式为 BackCompat。验证器和浏览器开发者工具可帮助定位声明问题。
常见误区¶
- DOCTYPE 不负责声明 UTF-8;字符编码使用 HTTP 头和
meta charset。 - DOCTYPE 不会验证页面,也不会自动阻止废弃元素。
- 不需要在现代声明中写 HTML 版本号、DTD URL 或结束标签。
- 不要为了“兼容旧浏览器”删除 doctype,缺失声明反而会触发怪异模式。
- 模板输出的 BOM 通常可被处理,但稳妥做法仍是让 doctype 成为首个标记。
安全与无障碍¶
DOCTYPE 本身不提供安全或无障碍能力,但标准模式能减少跨浏览器布局差异。 迁移旧 doctype 时应同时移除废弃表现标签、检查键盘操作和语义,而不是只替换第一行。