真正可落地的工程化是将可访问性约束前置到模板生成、组件定义、构建检查三环节,通过自定义元素继承原生语义、JSDOM+ESLint静态校验、动态内容触发aria-live或焦点重定向来保障,而非人工补ARIA属性。

为什么不能靠人工补 aria 属性来“修”可访问性
工程化手段不是给每个 div 手动加 role="button" 和 tabindex="0",那只会放大维护成本、引入不一致行为,且漏掉键盘事件监听就等于功能残缺。真正可落地的工程化,是把可访问性约束提前到模板生成、组件定义、构建检查三个环节,让错误无法进入生产环境。
用自定义元素强制继承原生语义与行为
所有交互类自定义标签(如 x-button、x-toggle、x-tab)必须满足:构造函数第一行调用 super();静态属性 formAssociated = true(仅对表单控件);Shadow DOM 内桥接真实 <input type="checkbox"> 或 <button></button>。否则,它在屏幕阅读器里就是个哑巴 div。
常见陷阱:
-
attributeChangedCallback中判断disabled时写成!!newValue—— 实际传入的是字符串"false"或空字符串,应统一用newValue !== null - 未在
connectedCallback中为tabindex="-1"元素显式调用this.focus(),导致模态框打开后焦点丢失 - 用
<toolbar>标签代替<div role="toolbar">—— 浏览器直接忽略,ARIA 失效
模板层强制语义校验(JSDOM + ESLint 插件)
在 CI 流程中,用 JSDOM 解析 HTML 模板文件,结合自定义 ESLint 规则做静态检查:
立即学习“前端免费学习笔记(深入)”;
- 所有
click事件绑定在非<button></button>、<a href></a>、<input>元素上时,报错 - 出现
role="button"但无tabindex、无onkeydown监听 Enter/Space 的,报错 -
<img alt="怎么利用工程化手段让HTML模版中所有交互元素都具备天然的可访问性" >缺失alt或alt=""但未设aria-hidden="true"的,报错 -
<nav></nav>缺失aria-label且页面存在多个<nav></nav>的,报错
这类检查能拦截 80% 以上因“快速实现”导致的可访问性硬伤,比人工 Code Review 更可靠。
动态内容更新必须触发 aria-live 或焦点重定向
任何通过 JS 修改 DOM 并影响用户操作流的内容(如表单校验提示、搜索建议列表、模态框弹出),不能只改 HTML —— 必须同步处理辅助技术感知:
- 纯状态提示(如“保存成功”)用
<div aria-live="polite">容器包裹,内容变更后直接 innerHTML 赋值 - 新面板或模态框插入后,立即调用
element.focus()到首个可聚焦子元素(如标题或第一个<input>) - 关闭模态框时,焦点必须回到触发它的按钮,用
document.activeElement记录并恢复 - 手风琴展开/折叠需同步切换
aria-expanded和aria-hidden,不能只切 CSS class
工程化不是堆工具,而是把「谁负责通知辅助技术」这件事,变成每个组件的 contract —— 比如所有 x-accordion-item 的 open setter 必须触发属性同步和焦点逻辑,而不是由业务代码临时 patch。



















