scope属性是屏幕阅读器理解表格结构的唯一依据,不设则导致归属关系错误;scope="col"管正下方所有td,scope="row"管同行右侧所有td,左上角空th不加,带rowspan/colspan的th必须显式声明,复杂结构须改用headers+id绑定。

scope 属性不是可选项,是屏幕阅读器理解表格的唯一依据
不设 scope,屏幕阅读器就只能靠 DOM 位置硬猜表头管谁——它不报错,但用户听到的是错的归属关系。比如读到“92”,却报不出“这是数学成绩”,而是报成“张三|92”,因为没声明 scope="col",它把第一列的 <th>张三 当成了整行的标题。这种错误在无障碍检测工具(如 axe、Lighthouse)里不会亮红灯,但对视障用户就是功能级失效。
<h3>scope="col" 和 scope="row" 怎么选?只看“它管谁”,不看“它在哪”</h3>
<p>判断逻辑非常机械,和文字内容、视觉样式完全无关:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/ai/2949" title="Text To Image"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/177985764629915.png" alt="Text To Image" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/ai/2949" title="Text To Image" class="overflowclass">Text To Image</a>
<p class="overflowclass">一款AI图像与设计工具,主要用于将文本渲染为图片并返回临时本地文件路径,支持可选的 data URI。适用于 Clawhub 或 Codex,用于将纯文本或带样式的文本进行转换,适合需要提升相关任务效率的用户。</p>
</div>
<a rel="nofollow" href="/ai/2949" title="Text To Image" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul><li>
<code>scope="col":该 <th> 正下方所有 <code><td> 都归它管 —— 基本出现在 <code><thead> 里,比如“姓名”“销售额”“部门”
<li>
<code>scope="row":该 <th> 右侧所有同 <code><tr> 内的 <code><td> 都归它管 —— 基本出现在 <code><tbody> 每行第一个单元格,比如“张三”“李四”
<li>左上角空 <code><th>(<code><th></th>)不要加 scope,它既不属列也不属行,加了反而误导
if (i === 0) scope="row" 就完事——得判断当前是行循环还是列循环;否则首行所有 <th> 全被当成行标题
<h3>带 rowspan/colspan 的 th 必须显式设 scope</h3>
<p>浏览器对合并单元格的语义推断极不可靠。哪怕只是 <code>rowspan="2" 的列标题,不加 scope="col",屏幕阅读器可能把第二行数据全算作第一行表头的下属,漏掉真正的列关系。
-
rowspan超过 1 的<th>,只要它是列标题,一律用 <code>scope="col" -
colspan超过 1 的<th>,如果它统领一组列(如“2024年”覆盖 Q1–Q4),优先考虑 <code>scope="colgroup"+<colgroup></colgroup>结构,而不是硬塞scope="col" - 没配
<colgroup></colgroup>却写scope="colgroup",旧版 JAWS 会直接忽略;没包<tbody> 却写 <code>scope="rowgroup",等于没写复杂表格里 scope 失效时,必须切到 headers + id
scope只支持单向线性关联,不支持“一对多”或“跳格”。当出现跨行表头、多层<thead>、<code><th> 同时承担行列角色,或表头不在标准行列位置(比如右对齐列标题)时,<code>scope就不再可靠。- 正确做法:
<th id="sales">销售额</th>和<th id="dept">部门</th>,然后<td headers="sales dept">120万|技术部</td> -
headers是兜底方案,不是备选方案——只要表格结构稍复杂,就得提前规划id和headers绑定 - 千万别在
<td> 上写 <code>scope:W3C 明确禁止,浏览器静默忽略,axe 直接报错ARIA attribute is not allowed: scope真正容易被跳过的点是:哪怕只是个两列表格,只要用了rowspan="2",就必须补scope;而最常被误加的地方,是把scope写在<td> 上——它只对 <code><th> 生效,写在 <code><td> 上完全无效。</td>
- 正确做法:










