tabindex取值决定Tab键顺序:-1不可Tab聚焦但可JS聚焦,0按DOM位置自然加入,正数强制排序但易引发冲突;优先用0或focus()控制,避免正数硬编码。
直接改 tabindex 属性就能重排 Tab 键顺序,但必须注意:负值会让元素脱离顺序、0 值让它按 DOM 位置自然插入、正数才强制排序——用错值反而让可访问性变差。
很多人以为只要设个数字就“能排”,其实 tabindex 的行为完全由数值符号和大小决定:
tabindex="-1":元素不可通过 Tab 进入,但可通过 .focus() 主动聚焦(适合模态框关闭按钮、临时提示等)tabindex="0":元素进入默认 Tab 流,顺序由它在 DOM 中的位置决定(最安全的“加入序列”方式)tabindex="N"(N > 0):强制排到第 N 位,但所有正数会优先于 0 和无 tabindex 元素;多个正数之间按数值升序排列,而非声明顺序写 tabindex="1"、tabindex="2" 看似合理,实际容易引发隐性冲突:
tabindex="1" 元素全塞进第一个位置,再统一按 DOM 顺序聚焦(不是“只认第一个”)<a href>、<button>),它们默认有隐式 tabindex=0,但一旦你加了 tabindex="3",它就会插在所有 0 和 -1 元素之后、所有其他正数之前tabindex 写死为正数,DOM 插入顺序变化后极易导致焦点跳转错乱除非明确需要跳过某段 DOM 区域,否则优先避免使用正数 tabindex:
立即学习“前端免费学习笔记(深入)”;
<div role="button">),统一设 tabindex="0",靠结构顺序自然组织tabindex="-1" + 显式 element.focus() 控制,别依赖负值“自动消失”——它仍能被 JS 聚焦,只是不进 Tab 流element.focus() 手动触发,比硬编码 tabindex="99" 可靠得多真正难的不是怎么写 tabindex,而是判断哪些元素该进 Tab 流、哪些该主动控制、哪些该彻底隔离——可访问性不是加属性,是做决策。