先记住这个答案
ARIA 主要补充语义,不会替元素实现浏览器原生交互。<div role="button"> 在读屏中可能被宣布为按钮,但普通 <div> 不会自动进入 Tab 顺序,也不会天然支持回车和空格触发。真实的操作按钮应优先写 <button type="button">,它已有语义、焦点和键盘行为。只有原生元素确实无法表达复杂交互时,才考虑自定义角色并补全全部行为。
- 原生元素优先表达原生用途
- ARIA 角色不自动添加交互
<div>按钮还需焦点与键盘处理- 角色不能替代可见标签
一行原生按钮省掉哪些工作
保存设置是一个动作,不是跳转。用按钮元素可直接响应鼠标、触摸和键盘,焦点也按正常顺序出现。若为了样式方便改用 <div>,开发者需要重新实现浏览器已经提供的东西。
<button type="button" id="save-settings">保存设置</button>
<!-- 不推荐只写:<div role="button">保存设置</div> -->原生按钮可以直接用 CSS 改外观,不需要为样式牺牲语义。type="button" 还避免按钮放在表单内时意外触发提交。
如果被迫使用 <div>,至少要提供焦点、点击与键盘激活,并处理禁用状态等细节;只写 role 会给读屏用户一个“这是按钮”的承诺,却没有对应操作能力。
角色不能抹平元素的用途
导航到另一页用 <a href>,执行当前页面动作用 <button>。给一个链接写 role="button",用户可能期待空格也能激活,但原生链接的键盘习惯主要是回车;角色声明不能自动改写行为。
ARIA 的价值在于原生 HTML 缺少某些复杂组件语义时补充状态与关系。先找合适的原生元素,再判断是否需要 aria-expanded、aria-describedby 等额外信息,比先给所有容器加角色更稳。
例如 <button> 天生能获得焦点,按 Enter 或空格会触发,辅助技术也知道它是按钮。把一个 <div role="button"> 写成“按钮”只补了语义标签,键盘焦点和空格激活都要开发者自己实现。反过来,把 <button role="presentation"> 试图抹掉按钮语义也不等于它不再可点击。先选正确的原生元素,再在缺少原生表达能力的地方使用 ARIA,能少写很多容易出错的行为代码。
容易答错的地方
- 以为
role="button"自动支持空格键 - 角色只提供语义,交互需实现;原生
<button>已具备。 - 为了视觉样式改用无语义元素
- 按钮可以完全重新设计 CSS 外观,不必用
<div>换取样式自由。
面试官还会怎么问?
链接和按钮怎样选择?
点击后导航到新位置用 <a href>;在当前页面执行操作用 <button>。
什么时候需要 ARIA?
原生语义不足以表达状态或复杂组件时可补充,例如展开按钮的 aria-expanded。
tabindex="0" 能让 <div> 等同按钮吗?
只能让它进入焦点序列,还缺回车、空格和状态行为。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。