属性 控件状态
aria-posinset
当 DOM 无法表达项目位置时(通常因列表虚拟化、分页或过滤),标注该项在集合中的位置。必须与 aria-setsize 配合使用,以便屏幕阅读器能报告“第 3 项,共 47 项”。
使用时机
当 DOM 不包含完整集合时使用——例如仅渲染可见项的虚拟化列表、分页网格、经过过滤的 combobox,以及无限滚动信息流。若缺少 aria-posinset 和 aria-setsize,屏幕阅读器只能根据兄弟节点数量猜测,可能报告”第 1 项,共 10 项”,而实际上用户所在位置是第 5,000 项中的第 327 项。
适用于固有集合容器内的项目:listbox 中的 option、menu 中的 menuitem、tree 中的 treeitem、tablist 中的 tab、feed 中的 article,以及 grid 中的 row。
若 DOM 已按源顺序包含全部项目,则无需 aria-posinset,辅助技术会自动计数兄弟节点。
行为说明
其值为正整数——该项在完整集合中基于 1 的索引。需在同一元素上同时设置 aria-setsize;两个属性均应置于项目本身,而非容器上。
过滤项目后,应更新两个属性以反映当前可见且相关的集合,而非原始完整列表,否则用户听到的位置信息将与实际可导航内容不符。
aria-setsize="-1" 适用于总数确实未知的情况(如开放式即时搜索信息流)。部分辅助技术会将其报告为”多项”,其他辅助技术则保持沉默。
常见错误
- 设置
aria-posinset时未同时设置aria-setsize,信息不完整,辅助技术无法报告”共几项”。 - 排序或过滤后忘记更新属性值,用户听到的是过时的位置信息。
- 将属性置于容器上而非项目上。
- 当 DOM 已完整反映全部项目时仍使用
aria-posinset,造成两个信息来源并存且可能产生偏差。 aria-posinset使用零值或负值(负值不被允许;只有aria-setsize接受-1)。- 位置编号与视觉顺序不符——屏幕阅读器用户听到”第 5 项”,而第三个可见项才是高亮状态。
示例
<!-- 虚拟化 listbox:DOM 中仅有第 12 至 16 项,而集合共 5,000 项 -->
<div role="listbox" aria-label="客户">
<div role="option" aria-posinset="12" aria-setsize="5000">客户 12</div>
<div role="option" aria-posinset="13" aria-setsize="5000">客户 13</div>
<div role="option" aria-posinset="14" aria-setsize="5000" aria-selected="true">客户 14</div>
<div role="option" aria-posinset="15" aria-setsize="5000">客户 15</div>
<div role="option" aria-posinset="16" aria-setsize="5000">客户 16</div>
</div>