不会。绝大多数主流屏幕阅读器忽略 aria-roledescription="slide",因其依赖的角色无内置名称且“slide”非aria认可值;应改用 role="group" + aria-label 或 aria-labelledby,并配合 aria-live="polite" 动态播报当前项。

aria-roledescription="slide" 会被屏幕阅读器正确朗读吗?
不会。绝大多数主流屏幕阅读器(NVDA、JAWS、VoiceOver)**忽略 aria-roledescription 值为 "slide" 的设置**,既不朗读“slide”,也不将其作为语义补充。这是由 ARIA 规范和实际实现共同决定的:该属性仅在角色本身有明确、被广泛支持的默认名称时才可能生效,而 role="region"(轮播图常用角色)没有内置名称,且 "slide" 不是 ARIA 官方认可的描述词。
轮播图该用什么 role + name 组合才能被准确朗读?
优先使用 role="group" 或 role="region",并配合 aria-label 或 aria-labelledby 显式提供上下文名称。例如:
<div role="group" aria-label="产品展示轮播图"> <div class="slide">...</div> <div class="slide">...</div> </div>
这样 VoiceOver 会朗读“产品展示轮播图,共 3 项,当前第 1 项”,NVDA/JAWS 也能识别组边界和数量信息。避免依赖 aria-roledescription 去“翻译”角色名。
-
role="group"比role="region"更推荐——它隐含容器语义,且与aria-roledescription的兼容性略高(尽管仍不保证朗读) - 若轮播图有可见标题,用
aria-labelledby="id-of-heading"比aria-label更利于维护 - 不要给每个
slide单独加role="article"或role="section"——这会干扰整体导航流,让屏幕阅读器用户误以为进入新内容区块
如何让“当前第 X 项”动态更新且被朗读?
靠 aria-live="polite" + aria-atomic="true" 配合一个隐藏的实时状态区域。不能只改文本内容,必须触发可感知的 live 区域更新:
<div aria-live="polite" aria-atomic="true" class="sr-only"> 当前第 2 项,共 5 项 </div>
每次切换时,用 JavaScript 替换该 div 的 textContent(不是 innerHTML),屏幕阅读器就会立即朗读新文本。注意:
-
class="sr-only"必须是纯视觉隐藏(position: absolute; width: 1px; height: 1px;等),不能用display: none或visibility: hidden - 避免高频更新(如自动轮播间隔 ≤ 3s),否则朗读会打断用户操作
- 如果用了
aria-current="true"标记当前 slide,它**不会被朗读**——仅作 CSS/JS 状态标记,不可替代 live 区域
为什么不用 aria-roledescription="carousel"?
同样无效。"carousel" 不是合法的 aria-roledescription 值,ARIA 规范未定义该字符串,且所有测试中均无朗读反馈。更关键的是:轮播图本身没有原生 role="carousel"(该 role 尚未被 WAI-ARIA 1.2 正式采纳),强行使用反而可能触发未知兼容性问题。真实项目中,坚持用 role="group" + 显式 aria-label + aria-live 状态区,是目前最稳定、可测试、无障碍认证通过率最高的组合。
真正容易被忽略的,是 live 区域的 DOM 更新方式和隐藏样式细节——改了文字但没触发朗读,八成卡在这两处。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











