tabindex="0"使非原生元素按dom顺序进入tab流;tabindex="-1"禁止tab聚焦但支持脚本.focus();tabindex="n"(n>0)强制插队排序,易破坏导航逻辑,不推荐使用。

tabindex 属性的三个取值分别有什么效果
tabindex 不是简单的“越大越先聚焦”,它的行为分三类,搞错就容易让键盘导航失效或反直觉:
-
tabindex="0":元素可被键盘聚焦,且按 DOM 顺序参与默认 Tab 流(最常用,适合按钮、div 等非表单元素) -
tabindex="-1":元素不能通过 Tab 键进入,但可通过.focus()主动聚焦(适合模态框关闭按钮、临时弹层等场景) -
tabindex="n"(n > 0):强制插入 Tab 顺序,n 越小越靠前;但所有正数会优先于tabindex="0"元素,且相同值时仍按 DOM 顺序排列——这常导致意外跳转,不推荐使用
为什么给 div 加 tabindex="0" 后还是无法用空格触发点击
加 tabindex="0" 只解决「能聚焦」,不等于「能交互」。浏览器默认只对 button、a、input 等原生可交互元素响应空格/回车事件:
- 必须手动监听
keydown,判断e.key === 'Enter'或e.key === ' '(注意空格键有key和code差异) - 记得在事件处理中调用
e.preventDefault(),否则空格会滚动页面 - 别忘了同步支持屏幕阅读器:给元素加
role="button",必要时加aria-label
表单里 input 的 tabindex 默认值是多少
所有 input、button、select、textarea 等可聚焦表单控件,默认 tabindex 就是 0,不需要显式设置——除非你想跳过某个字段:
- 想跳过某个
input?设tabindex="-1",但要注意:它仍可通过 JS 聚焦,只是不出现在 Tab 流中 - 禁用状态(
disabled)的表单元素,无论tabindex设多少,都不会出现在 Tab 流里 - 隐藏元素(
display: none或hidden属性)同样被排除,visibility: hidden则仍参与 Tab 流
移动端 Safari 对 tabindex 的兼容性陷阱
iOS Safari 在非表单元素上设 tabindex="0" 后,Tab 键不可用(它没 Tab 键),但「辅助力」或「VoiceOver」导航仍依赖该属性——所以不能只测桌面端:
- 测试时务必开启系统「辅助功能 → 键盘 → 全键盘访问」,再用外接键盘验证顺序
- iOS 上点击软键盘「下一个」按钮的行为,和桌面 Tab 键不完全一致,可能跳过
tabindex="0"的 div - 如果页面大量使用自定义组件(如封装的
MyInput),确保其内部原生input没被意外移除或覆盖tabindex
tabindex 当成“焦点排序工具”,却忘了配套的键盘事件监听和语义角色声明。一个可聚焦但不可操作的元素,对键盘用户来说就是个死胡同。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











