前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库HTML tabindex 表单键盘焦点顺序
HTML表单与输入

表单里的 tabindex 怎么改变 Tab 键顺序?

tabindex="0" 让元素按自然顺序进入 Tab 序列;-1 可被脚本聚焦但通常不进入顺序 Tab;正数会抢在 0 前面,容易打乱表单流程。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#表单与输入#表单
先看核心答案读代码示例
理解线索

焦点顺序应可预测

  1. 自然顺序由可聚焦元素在 DOM 中的位置形成
  2. tabindex="0"按自然顺序加入焦点序列
  3. tabindex="-1"允许脚本聚焦但跳过顺序 Tab

视觉上用 Grid 或 Flex 重排控件,不会自动把 Tab 顺序一起重排。

核心回答

先记住这个答案

表单控件大多天然可聚焦,通常不需要额外写 tabindex。0 让元素进入顺序 Tab,位置由 DOM 顺序决定;-1 可让脚本将焦点移到该元素,但用户按 Tab 通常不会走到它。正数会按从小到大排在 0 和自然可聚焦元素之前,常造成焦点突然跳跃,因此应优先调整 HTML 顺序。

  • 0 按文档顺序参与 Tab
  • -1 通常不参与顺序 Tab
  • 正数优先于 0
  • 优先用 DOM 顺序表达操作流程

错误提示要能被脚本聚焦

提交表单后若顶部出现错误摘要,可给摘要设置 tabindex="-1",在脚本里把焦点移过去,让键盘用户立刻听到错误,再从摘要中的链接跳到具体字段。摘要无需占据日常 Tab 路径。

错误摘要不进入常规 TabHTML
<div id="errors" tabindex="-1" role="alert">
  请检查必填字段
</div>
<label>邮箱 <input type="email" name="email" required></label>
<button type="submit">保存</button>
<script>
  // 校验失败后由脚本执行
  document.querySelector('#errors').focus()
</script>

焦点移动发生在校验失败时;平时按 Tab 会沿邮箱、按钮等可交互元素前进,而不是先停在这段提示上。 如果把摘要设为 tabindex="1",它会在页面其他自然焦点元素前面出现,表单稍有增删就容易打乱阅读顺序。

视觉顺序不等于焦点顺序

设计稿可能用 Grid 把按钮视觉上移到最前面,DOM 里它仍排在输入框后。Tab 路径不会因为 CSS 位置改变就自动跟着走,键盘用户看到的前后关系可能与操作顺序不一致。

先让 DOM 顺序符合任务流程,再做视觉布局。若焦点需要被程序控制,例如打开对话框时聚焦标题或首个输入,使用合适的焦点管理;不要靠大量正数 tabindex 修补结构。

默认可聚焦的 <button>、链接和输入框已经按 DOM 顺序参与 Tab 导航,通常不需要给它们重复写 tabindex="0"。真正危险的是用正数强行“修正”视觉顺序:用户按 Tab 会先跳完所有正数,再回到普通控件,和页面阅读顺序分离。错误提示若需要被脚本聚焦,可以给容器 tabindex="-1" 后调用 focus();它不会因此进入日常 Tab 链。焦点移动后还应让错误内容可被感知,而不是只改变边框颜色。

回答前,多想一步

容易答错的地方

给每个字段编号 1、2、3
正数会抢在自然顺序之前,插入或删除字段时维护成本高;更好的办法是按正确顺序写 DOM。
把 tabindex="-1" 当作彻底无法聚焦
它通常只退出顺序 Tab,脚本调用 focus() 仍可将焦点移入。
试着用自己的话回答

面试官还会怎么问?

普通 <button> 需要写 tabindex="0" 吗?

通常不需要。按钮本来就是可聚焦控件,按 DOM 顺序进入 Tab。

禁用按钮还能靠 tabindex 聚焦吗?

原生 disabled 控件不能通过普通焦点交互恢复;tabindex 不应被用来绕开禁用语义。

CSS order 改变 Tab 顺序吗?

不会。视觉排序与 DOM 焦点顺序分离,交互流程应在结构层解决。

从一道题,走向一组知识

把知识连起来

表单与输入

搜索框用 type=search,比普通 text 多了什么?

type="search" 也应有合乎页面流程的键盘焦点位置。

表单与输入

time 输入的 step=60 和 step=900 分别限制什么?

时间输入的内部操作与表单整体 Tab 顺序是两层问题。

参考资料

  • MDN 参考文档

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

本题目录
  1. 先记住这个答案
  2. 错误提示要能被脚本聚焦
  3. 视觉顺序不等于焦点顺序
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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