doctype声明必须唯一且正确,html标签需带lang属性,meta charset必须utf-8且置于head最前,所有可见内容须在body内。

DOCTYPE 声明必须写,且只能写一次
浏览器靠 判断是否启用 HTML5 渲染模式。不写或写错(比如漏空格、大小写混用、多写一个 <code>)会导致触发怪异模式(Quirks Mode),表单控件样式错乱、盒模型计算异常、<code>getBoundingClientRect() 返回值不准等问题都可能由此而来。
常见错误现象:
全小写 —— 大多数浏览器容忍,但部分旧版 IE 会降级—— 过时写法,强制进入严格模式但非 HTML5- 在
后面再补一个—— 浏览器直接忽略第二个
标签必须有 lang 属性
不只是可读性优化。屏幕阅读器依赖它切换语音引擎,搜索引擎用它判断页面语言归属,Chrome 的翻译提示框也据此决定是否弹出。漏掉 lang 属性会让无障碍访问支持打折扣,且部分合规审计工具(如 axe-core)直接报错。
使用建议:
- 中文站点统一用
zh-CN,繁体站可用zh-TW或zh-HK - 不要写成
lang="cn"或lang="zh"—— 语义不完整,WCAG 不达标 - 动态生成页面时,确保服务端或 JS 模板中
lang值与实际语言一致,避免中英混排时语音朗读错乱
里 charset 必须是 UTF-8 且放在最前
<meta charset="UTF-8"> 要紧贴 开始标签之后,越早出现越好。如果它被 <title></title>、<script></script> 或其他标签挡在后面,浏览器可能已按默认编码(如 ISO-8859-1)解析了前面的内容,导致中文标题显示为乱码,甚至影响后续 CSS/JS 加载路径解析。
容易踩的坑:
- 把
<meta charset="UTF-8">放在<title></title>后面 —— 危险,标题文字可能已损坏 - 用
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">替代 —— 功能等价但冗余,HTML5 推荐前者 - 在构建流程中被自动插入其他 meta(如 SEO 插件加的 description),却没检查顺序 —— 需人工确认位置
是唯一承载可见内容的容器
所有用户能看见的东西——文字、图片、按钮、Canvas、SVG——都必须在 内部。写在 里的 <p></p>、<div> 或内联脚本输出的 DOM,浏览器会自动移到 <code> 开头,但这个“修复”不可靠:某些 SSR 框架或静态生成器会直接报错,Web Components 初始化也可能失败。
关键点:
-
不需要lang属性 —— 继承自,重复写无意义 - 不要在
外写任何内容(包括注释、空格、换行)—— 可能被解析为文本节点,干扰布局 - 现代项目常把根 Vue/React 组件挂载到
<div id="app"></div>,这个div就是下第一个有意义的子节点,别把它漏掉











