scope属性不是装饰而是屏幕阅读器理解表格结构的唯一可靠依据,必须为中列标题设scope="col"、中行首标题设scope="row",复杂结构需用id+headers显式绑定。

scope 属性不是锦上添花的装饰,而是屏幕阅读器理解表格结构的唯一可靠依据。没它,视障用户听到的就是“张三、22、北京”这样割裂的词组,而不是“姓名:张三,年龄:22,城市:北京”。
什么时候必须写 scope="col" 或 scope="row"?
只要出现 <th>,就得立刻判断它管的是列还是行——不能靠位置猜,必须显式声明。
<ul><li><code><thead> 里的每个 <code><th>(如“姓名”“年龄”“城市”)→ 必须设 <code>scope="col"
<tbody> 每行第一个 <code><th>(如“张三”“李四”)→ 必须设 <code>scope="row"
i === 0 就统一加 scope="row";得区分当前是循环列头还是行头rowspan="2" 的表头,也必须补 scope,否则第二行数据可能被错误归到第一行标题下
scope="colgroup" 和 scope="rowgroup" 不是高级选项
这两个值不是“更通用的 col/row”,它们只在有对应 HTML 结构支撑时才有效,硬加反而破坏语义。
-
scope="colgroup"必须配合<colgroup></colgroup>使用,或出现在带colspan的顶层<th> 上(例如“2024年”统领 Q1/Q2/Q3/Q4 四列) <li> <code>scope="rowgroup"必须位于<tbody> 或 <code><thead> 内部,且该 <code><th> 是整个分组的总标题(如“高优先级订单”统管下面 5 行) <li>没有 <code><colgroup></colgroup>却写scope="colgroup",旧版 JAWS 可能直接跳过整组列,导致数据无法归属 - 别为“视觉分组”加这两个值——CSS 用 class,无障碍才用 scope
- axe、Lighthouse 等工具会直接报错:
ARIA attribute is not allowed: scope - 想让某个
<td> 关联多个表头?必须用 <code>headers+ 对应<th id="xxx">,例如:<code><th id="sales">销售额</th>和<td headers="sales dept">120万</td> - 跨行表头、多层嵌套、右对齐列标题等场景,
scope本身就不支持,这时候headers才是真正可控的兜底手段
为什么 <td> 上写 <code>scope 一定错?
scope 是 <th> 的专属属性,W3C 明确禁止在 <code><td> 上使用。写了也没用,还触发报错。
<ul>
<li>所有主流浏览器静默忽略 <code><td scope="col">xxx</td>,DOM 中查不到该属性
最难的不是写对某一行 scope,而是在每次插入 <th> 时都条件反射地问一句:“它管的是列,还是行?”——这个习惯一旦建立,比任何检测工具都管用。复杂表格里,<code>scope 往往只是起点,真正要靠 id 和 headers 把关系钉死。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











