scope属性是专为表格表头设计的语义化属性,取值为col、row、colgroup、rowgroup,用于明确表头关联的数据范围,提升屏幕阅读器对复杂表格结构的理解。
scope 属性本身不是 HTML5 新增的,而是从早期 HTML 规范沿用至今的语义化属性,专为表格(<th> 元素)设计,用于明确表头单元格所关联的数据范围——这对屏幕阅读器准确播报“哪一列/行对应什么数据”至关重要。在复杂表格(如多级表头、跨行跨列表头)中,正确使用 scope 能显著提升盲人用户对结构的理解效率。
scope 有四个合法值,必须严格匹配表头的实际作用范围:
<th> 是**一列**的标题(常见于第一行表头);<th> 是**一行**的标题(常见于第一列的行标识,如“北京”“上海”);<th> 概括一组列(需配合 <colgroup> 使用);<th> 概括一组行(需配合 <tbody> 或 <thead> 的分组逻辑)。仅用 colspan 或 rowspan 创建合并单元格,屏幕阅读器无法自动推断其语义归属。必须为每个 <th> 显式设置 scope。
例如,一个带分组的销售统计表:
立即学习“前端免费学习笔记(深入)”;
<table> <thead> <tr> <th scope="col">地区</th> <th colspan="2" scope="colgroup">Q1 销售</th> <th colspan="2" scope="colgroup">Q2 销售</th> </tr> <tr> <th scope="col"></th> <th scope="col">线上</th> <th scope="col">线下</th> <th scope="col">线上</th> <th scope="col">线下</th> </tr> </thead> <tbody> <tr> <th scope="row">华北</th> <td>120</td><td>85</td><td>135</td><td>92</td> </tr> </tbody></table>
其中顶层“Q1 销售”设 scope="colgroup",表明它统领下方两列;子级“线上”“线下”设 scope="col";左侧“华北”设 scope="row"——屏幕阅读器读到“华北”单元格时,会连带播报当前行所有数据对应的列名(如“华北,线上 Q1 销售:120”)。
scope="rowgroup" 要求配合明确的 <tbody> 或 <thead> 分组,且该 <th> 必须位于分组首行首列。实践中容易误用,反而造成混淆。更推荐的做法是:
<tbody> 划分逻辑区块,并为每个区块首行添加 scope="row" 行标题;aria-labelledby 或 aria-describedby 补充上下文(如“2023年度汇总”),比强行用 rowgroup 更可靠;打开 NVDA 或 VoiceOver,进入表格后按 T(NVDA)或 Ctrl+Option+Shift+Down Arrow(VoiceOver)导航,听其如何播报单元格的行列关系。重点关注:
可借助浏览器开发者工具检查元素是否含有 scope 属性,但最终以屏幕阅读器实际播报为准——属性存在不等于被正确理解。