html代码质量基线要求doctype和lang首行强制声明、语义化标签不可用div模拟、属性顺序与闭合规则严格统一,否则导致无障碍失效、ci报错及维护性断崖下跌。

统一设计系统里,HTML代码质量基线不是“写得像样就行”,而是必须能被自动化工具校验、被屏幕阅读器正确解析、被CSS/JS稳定接管的最小可行结构。达不到这条线,组件库一升级、无障碍测试一跑、CI一卡,问题就暴露。
DOCTYPE 和 lang 必须首行强制声明
这两个不是“建议”,是解析引擎和辅助技术的启动开关。漏掉或位置错,整个页面可能降级到怪异模式,flex布局错位、100vh失效、ARIA属性被忽略都是常见后果。
必须在文件第一行,不能有空格、BOM 或注释前置-
必须紧随其后,lang值不可简写为zh或cn,否则 NVDA、VoiceOver 无法切换中文语音库 - 如果页面支持多语言,
lang应动态注入,而不是硬编码;但基线检查只认静态值是否合规
语义化标签不能靠 class 模拟
设计系统封装的按钮、卡片、导航栏,如果底层用 <div role="button"> 替代 <code><button></button>,或用一堆 <div> 堆出 <code><nav></nav>,那它就不是“可访问的组件”,只是视觉复刻。
-
<button></button>、<a></a>、<input>等原生交互元素,禁止用role+tabindex手动模拟——键盘焦点、空格回车响应、禁用状态样式都得自己补,极易遗漏 -
<main></main>在整个文档中只能出现一次,且必须包裹主体内容;<header></header>和<footer></footer>可以多处,但不能嵌套在<main></main>外又套<section></section>再包一层 - 图标类
<img>若无实际信息(如装饰性 icon),alt必须为空字符串alt="";若承载含义(如“删除”按钮旁的垃圾桶图标),alt必须描述行为,不能写 “icon-delete”
属性顺序与闭合规则影响工具链稳定性
HTML Linter(如 htmlhint)、Prettier 格式化、甚至部分 SSR 框架的 diff 算法,都依赖属性书写顺序和标签闭合一致性。随意混用单双引号、省略结束标签、自闭合加斜杠,会导致格式化冲突或 CI 报错。
- 属性必须按固定顺序:
class→id→data-*→src/for/type/href→title/alt→role/aria-* - 所有非自闭合标签(
<p></p>、<div>、<code><section></section>)必须显式写闭合标签,哪怕内容为空;<img>、<input>等允许自闭合,但不加/(即写<img src="x" alt="">,而非<img src="x" alt="">) -
charset必须用<meta charset="UTF-8">,且必须在<title></title>之前;放在<title></title>后面,某些低版本 Android WebView 会乱码
基线不是“写完能跑”,而是“改一行就触发 lint 报错、无障碍扫描失败、样式继承异常”的敏感阈值。最容易被忽略的是 lang 的地区码精度、<main></main> 的唯一性约束,以及属性顺序对自动化工具的影响——它们不报红,但会让设计系统的可维护性在三个月后断崖下跌。











