用 tabindex 控制焦点流转的核心是明确元素是否应被键盘用户触及,而非排序;应默认依赖 DOM 顺序,仅必要时用 tabindex="0" 或 "-1",禁用正整数。

用 tabindex 控制焦点流转,核心不是“排号”,而是明确每个元素是否该被键盘用户触及、何时被触及。科学做法是:默认靠 DOM 顺序,只在必要时用 tabindex="0" 或 tabindex="-1" 做最小干预,彻底避开正整数。
优先信任 DOM 顺序,不主动打乱
浏览器天然按 HTML 源码顺序进行 Tab 导航。只要结构语义清晰(比如导航在 ,主内容在 ),焦点流就自然符合用户预期。强行给某个视觉上“突出”的按钮设 tabindex="1",反而会让屏幕阅读器用户跳过前面的导航链接,造成认知断层。
- 把页头导航写在 HTML 最前面,它就会第一个被 Tab 到
- 主文章区域紧随其后,不用加任何 tabindex 就能顺延获得焦点
- 侧边栏或页脚放在源码靠后位置,也应保持其自然靠后的 Tab 位置
让非原生元素安全进入 Tab 流:用 tabindex="0" + 语义 + 交互
模态框、折叠面板、下拉菜单这类内容出现/消失时,不能靠 tabindex 改顺序,而要用 JS 主动聚焦目标元素: 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featur 仅用 这类元素默认不可聚焦。加 tabindex="0" 是起点,但三件事必须同步做,否则就是半残废:
role="button" 或 role="checkbox",让辅助技术知道这是什么keydown,对 Enter 和 Space 键都做响应(注意空格要 event.preventDefault() 防止页面滚动):focus-visible 或 :focus 样式,让键盘用户清楚看到当前焦点在哪动态组件中精准接管焦点:用 tabindex="-1" + .focus()
.focus();该按钮需有 tabindex="-1"(若它本身不是原生可聚焦元素)document.activeElement 记录或传参保存禁用与隐藏元素:别只靠 CSS,要真正移出焦点流
opacity: 0 或 position: absolute; left: -9999px 隐藏的元素,仍可能被 Tab 到。必须配合逻辑处理:
hidden 属性,它同时影响可见性与可访问性tabindex="-1" 或现代 inert 属性(支持良好)来排除焦点 自动脱离 Tab 流,无需额外设置 tabindexaria-hidden="true" 不影响 tabindex 行为,若同时存在,需显式设 tabindex="-1"
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










