scope属性是屏幕阅读器识别表头管辖范围的唯一明确信号,必须设在th上且正确取值为col、row、colgroup或rowgroup;td不支持该属性,设了无效;复杂结构需用headers+id兜底。

scope 属性是让屏幕阅读器知道“这个表头管哪一列或哪一行”的唯一明确信号。不设、设错,或者乱加到 td 上,视障用户听到的数据归属关系就是错的。
什么时候必须用 scope?
当表格有标准行列结构,且 th 出现在第一行(列标题)或第一列(行标题)时,scope 就不是可选项,而是必要项:
- 第一行的
th(如“年份”“销售额”“部门”)→ 必须设scope="col" - 第一列的
th(如“张三”“李四”“王五”)→ 必须设scope="row" - 动态生成表格时,不能只看索引
i === 0就统一写scope="row";得判断当前th是在行首还是列首 - 如果没设
scope,多数屏幕阅读器会退化为按 DOM 顺序机械播报,比如读到“120万”,却报不出“这是‘销售额’列的数据”
scope 能不能加在 td 上?
不能。浏览器和辅助技术都不认:
-
td元素根本不支持scope属性,W3C 明确禁止 - 写了
<td scope="col">xxx</td>,所有主流浏览器都会静默忽略,DOM 中查不到该属性 - 无障碍检测工具(如 axe、Lighthouse)会直接报错:
ARIA attribute is not allowed: scope - 想让某个数据单元格关联多个表头?必须用
headers+ 对应th id,例如:<th id="sales">销售额</th>和<td headers="sales dept">120万</td>
colgroup 和 rowgroup 什么情况下才用?
这两个值不是“高级版 col/row”,只在存在明确逻辑分组时才启用:
立即学习“前端免费学习笔记(深入)”;
-
scope="colgroup":配合<colgroup></colgroup>或带colspan的顶层th,比如“2024年”下面并列 Q1/Q2/Q3/Q4,此时“2024年”应设此值 -
scope="rowgroup":对应<tbody> 或 <code><thead> 级别分组标题,比如用 <code><tbody class="high-priority"> 包了一组重点订单,“优先级订单”这个表头才适用 <li>误用后果明显:旧版 JAWS 等工具可能直接跳过整组,导致数据无法归类</li> <li>跨行表头、多层嵌套、非线性布局——<code>scope本身就不支持,这时必须切到headers+id方案
最常被忽略的一点:scope 不是“加了就完事”,它依赖表格结构的线性一致性。一旦出现合并单元格、浮动表头、JS 动态重排,scope 就可能失效——这时候,headers 才是真正可控的兜底手段。



















