表单控件必须有屏幕阅读器可识别的名称,label 与 input 需通过 for/id 显式绑定;fieldset/legend 是唯一语义分组方式;datalist 需配合 aria-label 或 visible label;验证错误须用 aria-invalid 和 aria-describedby 关联。

所有表单控件必须有可被屏幕阅读器识别的名称,否则用户根本不知道该填什么。
label 与 input 的显式绑定必须用 for/id
仅靠视觉位置对齐(比如 label 在 input 上方)无法被辅助技术识别。浏览器和屏幕阅读器依赖的是 for 属性与 id 的精确匹配。
-
for值必须与对应input的id完全一致,大小写敏感、不能有空格或特殊字符 - 避免只用
aria-label替代label元素——它能提供名称,但无法传递focus时自动聚焦到控件的行为 - 如果一个
label包裹了input(隐式关联),虽可行,但不利于样式控制和复杂布局,且部分旧版 NVDA 版本支持不稳定
fieldset/legend 是分组的唯一语义正确方式
用 div + CSS 边框模拟分组,对屏幕阅读器来说只是“一堆没关系的输入框”。只有 fieldset 和其必选子元素 legend 才能建立真正的逻辑分组语义。
-
legend必须是fieldset的第一个子节点,不可省略;不能用h3或span替代 - 禁用整个分组只需给
fieldset加disabled,内部所有控件自动失效,无需遍历设置 -
fieldset.elements可直接获取全部子控件集合,比querySelectorAll('input, select, textarea')更精准、更语义化
list/datalist 自动补全需配合 aria-label 或 visible label
datalist 本身不提供语义名称,仅靠 list 属性无法让屏幕阅读器知道这个输入框是干什么的。
- 必须为
input显式提供aria-label,或包裹在可见的label中 -
option里的label属性(如<option value="chrome" label="Chrome 浏览器"></option>)仅影响下拉显示文本,不参与无障碍名称计算 - 某些旧版 Safari 不播报
datalist建议项,所以不能把关键选项仅放在datalist里,主流程仍需支持手动输入
最常被忽略的点是:表单验证错误消息必须通过 aria-invalid="true" 和 aria-describedby 关联到具体控件,否则屏幕阅读器不会主动告知用户哪里错了、为什么错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











