按钮需加 aria-label 或可见文本以明确功能;表单控件须用 for/id 或嵌套 label 关联;导航区优先用 标签;动态内容更新需 aria-live;语义与 dom 变更须同步维护。

怎么给按钮加无障碍支持
没加 role 或 aria-label 的按钮,屏幕阅读器大概率读成“按钮”,用户根本不知道点它干啥。关键不是“能点”,而是“知道为什么点”。
- 纯图标按钮(比如
<button><svg>...</svg></button>)必须加aria-label,例如aria-label="删除这条消息" - 用
input type="button"时,value属性会被朗读,但中文空格或省略号(如value="...")会导致信息丢失,优先改用button元素 + 显式文本或aria-label - 禁用状态的按钮(
disabled)屏幕阅读器会自动跳过,不用额外处理;但用pointer-events: none或 CSS 模拟禁用,反而会让它“可读不可用”,这是常见坑
表单控件为什么读不出标签
label 元素和表单控件没正确关联,是无障碍最常被忽略的一环。浏览器不会自动猜哪个 label 对应哪个 input。
- 推荐用显式
for+id关联:<label for="email">邮箱</label><input id="email" type="email"> - 嵌套写法也行:
<label>邮箱<input type="email"></label>,但注意内部不能有其他块级元素(比如div),否则部分读屏软件会中断朗读 - 用
aria-labelledby可跨区域关联,但仅限复杂场景(如一个标题描述多个字段),日常别滥用——多一层引用就多一重失效风险
为什么用了 role="navigation" 还是跳不过去
加了 role 不等于能被识别为导航区,焦点管理、键盘顺序、语义结构缺一不可。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
role="navigation"必须包裹在可聚焦容器里(比如加tabindex="0"),否则某些读屏模式下无法被“区域跳转”命令捕获 - 内部链接需保持自然 DOM 顺序,避免用
float或flex-direction: row-reverse颠倒视觉与逻辑顺序 - 移动端 Safari + VoiceOver 对
role="navigation"支持较弱,更稳妥的是直接用<nav></nav>语义标签——它自带隐式role="navigation"且兼容性更好
动态内容更新后屏幕阅读器不朗读
AJAX 加载、表单提交成功提示这类内容,如果只是 innerHTML 替换或 display: none 切换,读屏软件基本无感。
- 用
aria-live="polite"包裹动态区域(如操作结果提示),内容变化时会自动朗读;紧急提示可用aria-live="assertive",但会打断当前朗读,慎用 - 不要把
aria-live加在正在动画的元素上(比如带opacity过渡的弹窗),过渡期间 DOM 变化可能被忽略 - 如果用
innerHTML = "..."替换整个区域,确保新内容里仍有aria-live属性,否则替换后属性丢失,后续更新不再触发朗读
真正难的不是加几个属性,而是每次改 DOM、调样式、换交互方式时,都得同步检查语义链有没有断。比如一个 div 被改成 button,tabindex 和 role 得立刻清理;又比如用 JS 控制显隐,aria-hidden 得跟着切,漏一次,对依赖读屏的用户就是一整块盲区。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










