前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库ARIA role 第一个规则 原生 HTML
HTML语义与文档

有原生 button 时,为什么别给 div 直接加 role=button?

role="button" 只声明语义,不会让 <div> 自动可聚焦,也不会替你实现回车、空格激活。能用 <button> 时直接用它,浏览器已经提供了完整的键盘和表单行为。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#语义与文档#Web 可访问性
先看核心答案读代码示例
理解线索

语义声明不等于交互实现

  1. <button>自带按钮语义、焦点和键盘行为
  2. role="button"向辅助技术声明按钮角色
  3. tabindex让非原生元素进入焦点序列

给链接强加按钮角色也会改变用户预期:链接与按钮的键盘激活习惯并不相同。

核心回答

先记住这个答案

ARIA 主要补充语义,不会替元素实现浏览器原生交互。<div role="button"> 在读屏中可能被宣布为按钮,但普通 <div> 不会自动进入 Tab 顺序,也不会天然支持回车和空格触发。真实的操作按钮应优先写 <button type="button">,它已有语义、焦点和键盘行为。只有原生元素确实无法表达复杂交互时,才考虑自定义角色并补全全部行为。

  • 原生元素优先表达原生用途
  • ARIA 角色不自动添加交互
  • <div> 按钮还需焦点与键盘处理
  • 角色不能替代可见标签

一行原生按钮省掉哪些工作

保存设置是一个动作,不是跳转。用按钮元素可直接响应鼠标、触摸和键盘,焦点也按正常顺序出现。若为了样式方便改用 <div>,开发者需要重新实现浏览器已经提供的东西。

保存动作使用原生按钮HTML
<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> 等同按钮吗?

只能让它进入焦点序列,还缺回车、空格和状态行为。

从一道题,走向一组知识

把知识连起来

语义与文档

audio 里面的文字什么时候会显示,能当音频加载失败提示吗?

原生 <audio controls> 比给普通容器加播放器角色更容易得到可操作控件。

语义与文档

audio 和 video 里的 source 怎样选择可播放文件?

媒体来源选择与 ARIA 语义是不同层面的职责。

参考资料

  • HTML:语义与文档参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 一行原生按钮省掉哪些工作
  3. 角色不能抹平元素的用途
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑