tabindex="1"是最危险的写法,会导致焦点顺序混乱、动态渲染后失效、Safari静默忽略等问题;原生表单控件默认可聚焦,无需设置tabindex,仅对非原生交互元素(如div[role="button"])才需显式设tabindex="0"。

tabindex="1" 是最危险的写法
给 <input> 或 <button> 加 tabindex="1" 不会让它变成“第一个可聚焦元素”,只会把它塞进 Tab 流最前面,还可能和别的 tabindex="1" 元素打架。多个相同正数 tabindex 时,浏览器仍按 DOM 顺序走,不是按你想象的“从上到下”排——它可能先跳到页脚按钮,再折返到表单顶部。
更麻烦的是:React/Vue 动态渲染后 DOM 顺序变了,但硬编码的 tabindex="1" 还在原地,焦点就乱了;Safari 在 iframe 或嵌套表单里常静默忽略正数 tabindex,用户完全感知不到异常。
- 原生表单控件(
<input>、<select>、<textarea>、<button>)默认就在 Tab 流中,等价于tabindex="0",无需额外设置 - 禁用字段用
disabled属性即可退出 Tab 流,比手动设tabindex="-1"更干净可靠 - 如果视觉顺序和 DOM 顺序不一致(比如设计稿要求右栏先填),优先用 CSS
order或调整 HTML 结构,而不是给每个<input>加tabindex="1"、tabindex="2"
真正可控的只有 tabindex="0" 和不设
tabindex="0" 的作用不是“排序”,而是“补位”:让一个本不可聚焦的元素(比如 <div role="button">)能进入 Tab 流,且严格遵循 DOM 顺序。它不打乱原有逻辑,只在自然流里插个队。
对原生控件加 tabindex="0" 是冗余操作,还可能干扰 SSR hydration 阶段的焦点恢复;对 <label> 加 tabindex="0" 更是无效——<label> 本身不可聚焦,应通过 for 或嵌套绑定到对应 <input> 上。
立即学习“前端免费学习笔记(深入)”;
- 仅对非原生交互元素(如
<div role="button">)显式设tabindex="0",并同步加role和键盘事件监听(Enter/Space) - CSS 移除了默认
outline,必须补:focus-visible { outline: 2px solid #007bff; },否则键盘用户看不见焦点 - 移动端(尤其 iOS Safari)只允许原生表单控件和
contenteditable元素参与 Tab 导航,tabindex="0"对<div>等无效
回车键切换焦点要绕过隐藏和禁用元素
用 keyup 监听 e.key === 'Enter' 切焦点,比 keydown 安全——避免 <textarea> 多出换行符。但光筛选 type="text" 不够,还得排除 disabled、readonly、hidden,以及被 CSS 隐藏(offsetParent === null)的元素。
- 别用
document.getElementsByTagName('input'),它会拉入所有<input type="hidden">和已禁用项 - 推荐写法:
form1.querySelectorAll('input[type="text"]:not([disabled]):not([hidden])'),再过滤el.offsetParent !== null - 每次 DOM 变动(如
hidden切换、动态增删字段)后,必须重新跑一遍可用元素筛选,不能缓存初始列表 - 循环切换时,“最后一个 → 第一个”的索引计算必须基于过滤后的数组长度,否则跳空
表格里 tabindex 基本没用,DOM 顺序才是唯一依据
<table>、<tr>、<td> 本身不可聚焦,给它们设 tabindex 几乎无效。真正起作用的,只有单元格内表单控件自身的 tabindex 值或 DOM 位置。
即使没设任何 tabindex,浏览器也按 HTML 源码顺序:从上到下遍历 <tr>,再按 <td> 内控件书写先后聚焦。CSS display: flex 或 grid 改变视觉排列,不影响 Tab 顺序。
- 同一
<td>里两个<input>,默认顺序就是书写顺序,无需设tabindex -
tabindex="-1"在表格中常用于临时跳过某字段(如校验失败后 JS 主动focus()),但它不阻止表单提交,也不影响 JS 访问 - 若需方向键导航整张表格(类似 Excel),得用
role="grid"+ ARIA 属性,单靠tabindex实现不了
tabindex="0"。



















