优先重构入口页、含表单页、全局模板片段三类html文件,因改一处可覆盖全站80%以上可访问性漏洞;必须首批处理index.html、home.html、login.html、contact.html、header.inc、footer.inc。

别一上来就全量扫WCAG 2.2所有条款——90%的可访问性问题集中在5类HTML结构上,优先处理它们,能在3周内把无障碍诉讼风险降低70%。
哪些HTML文件必须第一批重构
入口页、含表单页、全局模板片段这三类文件,改一处就能覆盖全站80%以上的可访问性漏洞。不是按“谁最旧”来排,而是看影响面:
-
index.html、home.html:爬虫首访页面,缺失lang或doctype会直接触发怪异模式,连带影响所有JS执行逻辑 -
login.html、contact.html:input没label、required属性缺失、alt为空,W3C验证器会批量报错,且屏幕阅读器用户根本无法完成流程 -
header.inc、footer.inc:看似只是复用片段,但一旦里面混用div模拟nav或漏掉role="navigation",所有引用它的页面都会在键盘导航时卡死
HTMLHint基线规则怎么配才不翻车
启用全部40+规则只会让团队每天收到100+警告,最终全员禁用插件。真正能落地的只有5条硬性规则,写进项目根目录的.htmlhintrc里即可:
-
doctype-first和doctype-html5:防止浏览器进入怪异模式,避免盒模型错乱导致JS计算偏移 -
html-lang-require:没有lang,VoiceOver/TalkBack无法切换语音引擎,中文页面读成英文是常态 -
id-unique:重复id会让document.getElementById()返回随机一个节点,ARIA关联(如aria-labelledby)彻底失效 -
alt-require:缺alt不是“体验差”,是功能缺失——无图环境、弱网、辅助技术下,信息直接消失
VS Code保存即校验,比Code Review早两周暴露问题。
语义化重构为什么不能直接替换标签
把<div class="nav">改成<code><nav></nav>看起来很干净,但若原div里混着搜索框、登录按钮、语言切换,强行套nav反而破坏语义——nav只应包裹导航链接。真正的做法是按内容意图分层:
- 一组表单控件 → 用
fieldset+legend,而非section或div - 步骤向导 → 用
ol包裹li,当前步加aria-current="step",别用一堆div配role="tablist" - 工具提示 → 独立
div配role="tooltip"+aria-describedby,别再依赖title属性
语义不是标签名,是DOM节点与内容之间的契约关系。
移动端可访问性最容易被忽略的三个点
桌面端修复完,往手机上一跑,90%的键盘焦点会消失、触摸目标小得无法点击、屏幕阅读器手势完全失灵。关键检查项:
- 所有可交互元素(按钮、链接、
input)的CSS像素尺寸必须≥48×48,padding和margin都要算进去,别只看图标大小 -
meta name="viewport"必须存在且user-scalable=no禁用——否则VoiceOver双指缩放会放大整个页面,焦点框瞬间错位 - 动态加载内容(如分页列表)必须用
aria-live="polite"包裹,否则TalkBack用户根本不知道新内容已加载
重构不是一次性的“打补丁”,而是每次提交都比上次更靠近可访问性基线——重点不在改了多少,而在改的地方是否阻断了最常发生的失败路径。











