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

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



















