scope属性专用于<th>,是屏幕阅读器识别表格语义的唯一依据;scope="col"用于<thead>列标题,scope="row"用于<tbody>行首标题,合并单元格须显式声明,写在<td>上无效。

scope 属性不是为了“让表格看起来更规范”,而是屏幕阅读器唯一能靠它把“张三”和“销售额:2026年Q1”正确配对的信号。不设、设错、或设在 <td> 上,等于直接切断语义链。
scope="col" 和 scope="row" 怎么选?看位置,别看文字内容
判断依据只有一条:这个 <th> 是横着管一列(下方所有 <td>),还是竖着管一行(右侧所有 <td>)。
-
scope="col"必须用在<thead>里的<th>,且该单元格正下方是同一列的数据 —— 比如“姓名”“年龄”“部门”这些顶部标题 -
scope="row"必须用在<tbody>中每行第一个<th>,且该单元格右侧是本行数据 —— 比如“张三”“李四”这类左侧行名 - 左上角那个空单元格(
<th></th>)不要加scope,它既不属某列也不属某行,加了反而误导 - 写反的后果不是报错,而是读屏时说“张三|季度:2026年Q1”,而实际该是“张三|销售额:2026年Q1”
带 rowspan/colspan 的表头必须补 scope,否则自动推断大概率失效
浏览器对合并单元格的语义推断极不可靠。哪怕只是 rowspan="2" 的列标题,也必须显式声明 scope="col",否则屏幕阅读器可能把第二行数据全归到第一行表头下,漏掉真正的列关系。
-
rowspan超过 1 的<th>,只要它是列标题,一律用scope="col" -
colspan超过 1 的<th>,如果它统领一组列(比如“2026年”覆盖 Q1–Q4),优先考虑scope="colgroup"+<colgroup>结构,而不是硬塞scope="col" - 动态生成时,别用
if (i === 0)统一设scope="row"—— 要区分是循环行索引还是列索引
scope="colgroup" 和 scope="rowgroup" 不是视觉分组,而是结构绑定信号
这两个值只有在真实存在对应 HTML 分组容器时才有效,否则纯属白写,旧版 JAWS 甚至会直接忽略。
立即学习“前端免费学习笔记(深入)”;
-
scope="colgroup"必须配合<colgroup>使用,且<th>需位于该<colgroup>所覆盖的列范围内 -
scope="rowgroup"只能出现在<thead>、<tbody>或<tfoot>内部的<th>中,且该<th>是整个分组的总标题(例如<tbody class="urgent"><tr><th scope="rowgroup">紧急订单</th></tr>) - 没写
<colgroup>却设scope="colgroup",或没包<tbody>却设scope="rowgroup",等同于没写
真正容易被跳过的点是:哪怕表格只有两列,只要用了 rowspan="2",就必须补 scope;而最常被误加的地方,是把 scope 写在 <td> 上 —— 它只对 <th> 生效,写在 <td> 上完全无效,且 HTML5 明确禁止。



















