<tr tabindex="0"> 不生效,因 <tr> 非标准可聚焦元素,浏览器均忽略;正确方案是用 <div role="row" tabindex="0"> 替代,并配 role="table"/role="cell"、键盘事件监听及语义角色。

tabindex="0" 不能直接让 <tr> 可聚焦——浏览器不支持对 <tr> 设置可聚焦状态,即使加了也会被忽略。必须用语义正确的替代方案。
为什么 <tr tabindex="0"> 不生效
HTML 规范中,<tr> 不是可聚焦元素,也不在可访问树的焦点路径中。Chrome、Firefox、Safari 均会无视 tr 上的 tabindex,DevTools 的 Accessibility 面板里会显示 Focusable: false。这不是 bug,是标准行为。
正确做法:用 <div role="row"> 替代 <tr>
若需键盘聚焦整行并支持方向键导航(如数据表格),应放弃原生表格结构,改用 ARIA 表格或语义化 div 布局:
- 用
<div role="table">包裹,内部用<div role="row">模拟行 - 每行内用
<div role="cell">或<div role="gridcell">模拟单元格 - 给
role="row"元素加tabindex="0",它才真正可聚焦 - 必须同步监听
keydown,处理ArrowUp/ArrowDown切换行,Enter触发操作 - 必须加
role="button"或其他匹配语义的角色(如role="checkbox"),否则屏幕阅读器只读“行”,不读“可操作行”
如果必须用原生 <table>,聚焦目标只能是单元格
原生表格中唯一能可靠加 tabindex="0" 的是 <td> 或 <th>,但聚焦单个单元格不符合“聚焦整行”的需求:
立即学习“前端免费学习笔记(深入)”;
- 给每个
<td>加tabindex="0"会导致 Tab 流碎片化(一行要按 5 次才能过) - 无法用一次 Tab 聚焦“整行”,更难实现方向键跨行导航
- 若强行给
<tr>加tabindex="0",仅 Safari 可能偶现聚焦(非标准,不可依赖) - 真实项目中,这类需求几乎都转向
role="grid"实现,而非硬撑原生表格
容易被忽略的关键点
即使用了 role="row" + tabindex="0",以下任一缺失都会导致键盘用户卡住:
- 没监听
keydown并preventDefault()方向键,默认滚动页面 - 没提供
:focus-visible样式,焦点框被 CSS 清空后用户看不见当前在哪 - 没在行上设
role="button"或role="option",屏幕阅读器无法告知这是可交互项 - 用
display: none或visibility: hidden隐藏某行后未同步移除其tabindex="0",仍可能被 Tab 到(焦点流未更新)



















