React中如何为可点击的非交互元素添加无障碍标签?
我正在给移动端图标按钮加无障碍支持,纯图标没有文字标签。试过用aria-label属性,但屏幕阅读器完全读不到内容,怎么回事?
比如这个React组件:
const IconButton = ({ icon, label }) => (
<span
role="button"
aria-label={label}
onClick={handleClick}
tabIndex="0"
>
{icon}
</span>
);
这样设置后,点击时触觉反馈正常,但TalkBack/SV不读出label内容。
我检查过元素确实获取了焦点,也试过把aria-label改成aria-labelledby关联隐藏文本,但问题依旧。是不是需要额外设置角色属性?或者移动端有特殊要求?
role="button"和aria-label都是对的,但问题可能出在几个细节上。第一点是
span元素本身并不是一个语义化的交互元素,虽然你加了role="button"和tabIndex="0",但在某些屏幕阅读器上可能会被忽略。建议直接换成标签,这样语义更明确,也能减少很多不必要的麻烦。第二点是移动端的屏幕阅读器对
aria-label的支持有时候确实不太稳定。你可以试试用aria-labelledby来关联一个隐藏的文本节点,而不是直接用aria-label。比如这样:这里我把
span换成了button,并且通过aria-labelledby关联了一个隐藏的span,这个方法在大多数情况下都能让屏幕阅读器正常读出来。第三点是如果你的目标用户群体中有大量使用 TalkBack 或 VoiceOver 的用户,记得测试一下
aria-hidden属性有没有被误用。有些时候图标本身会被错误地标记为隐藏,导致屏幕阅读器直接跳过。最后提醒一下,无障碍这块的服务端渲染也可能有影响。如果页面是通过服务端渲染的,确保 HTML 在首次加载时就已经包含了所有必要的无障碍属性,而不是依赖客户端 JavaScript 动态添加。否则屏幕阅读器可能在页面还没完全加载完的时候就开始读了,结果就读不到关键信息。
总之换
button标签,用aria-labelledby关联隐藏文本,再检查一下服务端渲染的输出,基本就能解决你的问题了。如果还有问题可以再细聊。