aria-sort 应写在 或 元素上,仅对当前单元格所代表的列(或行)生效,必须配合 role="columnheader" 或 role="rowheader" 语义角色,且需通过 javascript 动态同步更新。

aria-sort 应该写在哪个 HTML 元素上
aria-sort 必须写在 <th> 或 <code><td> 上,且仅对当前单元格所代表的列(或行)生效。它不会自动影响表格其他部分,也不会触发排序行为——只是告诉辅助技术“这一列当前按什么顺序排”。常见错误是把它加在 <code><table> 或 <code><thead> 上,那样完全无效。
<ul>
<li>只支持值:<code>ascending、descending、none(默认未排序)、other(极少用,如自定义多级排序)
none,而非省略该属性——省略等于“未声明”,屏幕阅读器可能误判为不可排序<th> 设 <code>ascending;同一表格中最多一个列有 ascending 或 descending
JavaScript 动态更新 aria-sort 的正确写法
手动切换排序时,别只改 class 或文字,必须同步更新 aria-sort 值。否则 NVDA、VoiceOver 会读错状态。典型错误是点击后只调用 sortData(),忘了 el.setAttribute('aria-sort', 'ascending')。
- 先清除旧状态:遍历所有
<th>,把它们的 <code>aria-sort都设为none - 再设置新状态:对当前点击的
<th> 调用 <code>setAttribute('aria-sort', direction),其中direction是'ascending'或'descending' - 注意 DOM 更新时机:确保
aria-sort在数据重渲染前已写入,否则辅助技术可能读到旧值 - 验证方法:用浏览器开发者工具检查元素,确认 computed roles 包含
columnheader - 不要混用:
<th role="columnheader"> 是冗余的,但合法;<code><td role="columnheader"> 则需配 <code>aria-sort才有效 - 若用
role="rowheader"(横向排序),aria-sort同样适用,但值含义变为“本行内各单元格的排序方向” - 表格缺少
role="table"或嵌套结构不规范(比如<tr> 直接放在 <code><div> 里) <li> <code>aria-sort值拼写错误,比如写成asc或up—— 只认ascending/descending/none - 样式隐藏了表头文字(如
text-indent: -9999px),导致辅助技术无法关联排序状态与列内容
实际项目里最常漏掉的是动态更新后的
aria-sort 和 role=columnheader 的关系
aria-sort 只在元素具有语义化表头角色时才被正确识别。单纯一个 <th> 默认就有 <code>role=columnheader,但如果你用了 <div role="table"> 这类 ARIA 表格,就必须显式写 <code>role="columnheader",否则 aria-sort 会被忽略。
测试 aria-sort 是否生效的快捷方式
别只靠代码检查,得真听一遍。用 VoiceOver(macOS)或 NVDA(Windows)打开表格,聚焦到表头单元格,它会读出“姓名,列,已升序排序”之类提示。常见失效原因不是值写错,而是:
aria-sort 同步和 role 语义完整性,这两处一错,整个排序提示就形同虚设。











