在团队内部建立HTML代码质量红黄牌警示制度
先说说核心判断:这套红黄牌制度,更像协作信号灯,而不是代码扫描器。红牌只标记三类可自动化校验的高危可访问性问题——缺失alt、aria-label或label;黄牌则提示语义模糊但影响长期维护的写法。关键在于,所有状态必须绑定到具体DOM节点,并可追溯。
红黄牌制度不是代码扫描器,而是协作信号灯
HTML本身没有运行时错误,但aria-label缺失、alt空值、嵌套错乱的section/article,会直接导致可访问性失败、SEO折损、测试断言飘红。红黄牌不标记“语法错误”,而是标记“协作风险”。比方说,有人提交了未加lang属性的多语言页面,下游翻译组件就会静默失效——这种问题不会报错,但会在QA环节或上线后爆发。
红牌触发条件必须可自动化校验
人工判罚不可持续。红牌只用于以下三类能被工具稳定捕获的问题:
- img标签缺失alt属性,或alt=""且非装饰图(需配合role="presentation"或CSS background-image判定)
- button、a等交互元素无文本内容,且未提供aria-label或aria-labelledby
- 表单控件(input、select、textarea)缺少关联的label元素,且未用aria-label补充
所有规则必须能在CI流程中由axe-core或html-validate输出明确错误ID(如aria-input-field-name),不能依赖主观判断。
黄牌用于语义模糊但影响长期维护的写法
黄牌不阻断合并,但强制PR描述中注明处理方案。典型场景包括:
- 用div + onclick模拟按钮,而非原生button——axe不报错,但键盘焦点、禁用状态、语义树都缺失
- h1到h6跳级(如h2后直接h4),影响屏幕阅读器导航逻辑
- 在React/Vue组件中用内联style写关键布局(如display: flex),违反样式管控规范
黄牌规则需在团队Wiki明确列出判定边界。例如,“仅当内联样式影响响应式断点或可访问性对比度时才触发”,避免变成无休止的风格争论。
红黄牌状态必须绑定到具体DOM节点并可追溯
不能只说“这个页面有2个红牌”,而要定位到:

(第42行)、
(第89行)。CI报告需生成带行号的HTML片段快照,并存档至内部质量看板。开发修复后,必须手动在PR中引用对应节点的修复commit hash,否则黄牌不自动解除。
最容易被忽略的是动态渲染场景:服务端渲染(SSR)和客户端hydrate后的DOM可能不一致。红牌检查必须在hydration完成后执行,否则会漏掉React用dangerouslySetInnerHTML注入的无效HTML。