scope="col"只管正下方同列所有td,从紧邻下一行起到底部或新列头;scope="row"只管同行右侧所有td;二者均不跨行列、不跳格,且scope="colgroup"/"rowgroup"须严格匹配colgroup/tbody结构,复杂场景必须改用headers+id。

scope="col" 怎么定位列范围
它只管自己正下方的所有 <td>,从紧邻的下一行开始,一直到底部或遇到新的同列 <code><th scope="col">。不看文字内容、不跨列、不跳行,纯靠 DOM 垂直位置。
<ul><li>必须用在 <code><thead> 或 <code><tbody> 顶部的 <code><th> 上,比如“产品名称”“单价”“数量”
<li>如果该 <code><th> 有 <code>rowspan="2",仍需显式写 scope="col",否则屏幕阅读器可能只关联第一行数据
<th></th>)加 scope="col",它不属于任何列,加了反而破坏语义scope="row" 怎么定位行范围
它只管自己所在 <tr> 内、右侧所有 <code><td>,从下一个单元格开始,直到该行结束。不往上看、不跨行、不回溯。
<ul><li>典型位置是每行第一个单元格,比如 <code><th scope="row">iPhone 15,后面跟着三列 <code><td> 就全归它管
<li>如果该行还有其他 <code><th scope="row">,则后续 <code><td> 归最近的一个——不是按顺序,而是按 DOM 位置就近匹配
<li>不能出现在 <code><thead> 里(除非你真在定义行标题组),<code><thead> 中的 <code><th> 几乎都该用 <code>scope="col"
scope="colgroup" 和 scope="rowgroup" 为什么经常失效
这两个值不是“增强版 col/row”,而是强依赖结构契约:没对应容器,就等于没写。
-
scope="colgroup"必须配合真实存在的<colgroup></colgroup>,且<th> 要落在该 <code><colgroup></colgroup>覆盖的列范围内;只写colspan="4"不顶用 -
scope="rowgroup"只在<tbody> 内部有效,且该 <code><th> 得是整组行的统称(如 <code><th scope="rowgroup" colspan="5">华东区),不能放在 <code><thead> 或单独 <code><tr> 里 <li>旧版 JAWS 和部分 NVDA 配置会直接忽略未配结构的 <code>scope="colgroup",连警告都不报,查无障碍树也看不到 columnheader 角色 - 遇到
rowspan超过 1 的表头、多级列头(年→季→月)、跨行列合并单元格,scope已超出能力边界 - 此时唯一合规解法是切到
headers+id:给每个表头设唯一id,每个<td> 用空格分隔的 <code>headers="id1 id2"显式声明归属 - 动态渲染时别省事——哪怕视觉上是一个单元格,只要语义上覆盖多维,就得拆成多个带
id的<th>,再由 <code><td> 引用 真正容易被忽略的点是:scope 属性本身不报错,也不影响渲染,但它一旦设错或漏设,屏幕阅读器给出的播报就是错的,而这种错误在 Lighthouse 或 axe 里几乎不亮红灯。可访问性问题藏得深,修复却必须从每个 <code><th> 的属性值开始。</th>
当行列交汇或结构复杂时,scope 还能用吗
不能。左上角单元格既要管行又要管列?scope 不支持多值,scope="row col" 是非法语法,浏览器直接丢弃整个属性。
立即学习“前端免费学习笔记(深入)”;



















