<table> <thead> <tr> <th scope="col" aria-sort="none"><a href="...">Name <span title="Sort">▲</span></a></th> <th scope="col" aria-sort="ascending"><a href="...">score <span title="Ascending">▲</span></a></th> </tr> </thead> <tbody> <tr> <td>C</td> <td>1</td> </tr> <tr> <td>A</td> <td>5</td> </tr> <tr> <td>B</td> <td>9</td> </tr> </tbody> </table>
使用咏叹调排序是否合适(当UA支持它时)?
http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort
我相信这可能很有用,但是W3C验证器目前在< th scope =“col”>上需要一个role =“columnheader”,这有点多余,因为它已经暗示了一个[scope =“col” ]:
http://www.w3.org/TR/wai-aria/roles#columnheader
一旦你开始指定它,你还需要设置一个角色,直到< table role =“grid”> …如果你没有使用适当的标签就可以了.
解决方法
正如@CraigFrancis所述,此问题已在验证程序的邮件列表中引发,其中一条消息引用了错误报告.根据规范,验证者的行为是正确的,该错误已经是closed.这意味着如果使用aria-sort
,则需要将role显式设置为columnheader或rowheader,即使您具有scope属性.
正如问题所述,这意味着在文档树中需要更高的其他角色属性,以便您最低限度地获得以下内容:
<!doctype html> <title>aria-sort issue</title> <table role="grid"> <thead> <tr role="row"> <th scope="col" role="columnheader" aria-sort="none"><a href="...">Name <span title="Sort">▲</span></a></th> <th scope="col" role="columnheader" aria-sort="ascending"><a href="...">score <span title="Ascending">▲</span></a></th> </tr> </thead> <tbody> <tr> <td>C</td> <td>1</td> </tr> <tr> <td>A</td> <td>5</td> </tr> <tr> <td>B</td> <td>9</td> </tr> </tbody> </table>
这看起来相当多余,特别是因为role=columnheader
的定义说它是“结构等同于具有列范围的HTML th元素”.但是,HTML5 LC definitions related to WAI-ARIA没有为th(或tr或table)指定任何隐含的ARIA语义.这可能反映了用于布局的表的使用,这已经很普遍,因此通常假设表元素表示结构(或“语义”)意义上的网格(数组,矩阵)是不现实的.因此,当表元素的“表格”与ARIA相关时,必须在不同的嵌套级别用角色属性明确表达.
请注意,aria-sort属性纯粹是提供信息的,声明性的.它描述了表(网格)的项目是按升序或降序(或其他)顺序.它不会要求浏览器对它们进行排序或创建用于排序的UI工具.在实践中,它意味着在作者负责对表进行排序时,在页面生成服务器端或使用JavaScript客户端时使用.用户代理可以以各种方式利用这些信息,例如通过向用户宣布订单.
ARIA规范补充说:“对于每个表格或网格,作者应该一次只对一个标题应用aria-sort”.代码示例违反了此建议. (但是,验证器没有发出错误消息;这应该是SHOULD,而不是SHALL.)在这种情况下,应该删除aria-sort =“none”.当在列标题上设置时,aria-sort属性指定表的行根据该列进行排序,因此出于显而易见的原因,它应仅在一列上设置.