aria-setsize 必须与 aria-posinset 成对使用,且满足 1 ≤ aria-posinset ≤ aria-setsize,屏幕阅读器才正确播报“第 X 项,共 Y 项”;其值应为当前可见/可用项数(非原始数据量),同级兄弟节点数(树结构中),并从 1 开始计数。

aria-setsize 必须和 aria-posinset 成对出现
单独写 aria-setsize 没有意义,屏幕阅读器只在两者同时存在且满足 1 ≤ aria-posinset ≤ aria-setsize 时才正确播报“第 X 项,共 Y 项”。漏掉 aria-posinset 或数值越界(比如 aria-posinset="5" 但 aria-setsize="4"),读屏会静默或报错。
列表总数不是原始数据量,而是当前可见/可用项数
动态场景下容易硬编码成总数据条数,这是最常见错误。实际应取当前渲染上下文中的集合大小:
- 搜索过滤后只剩 3 个
role="option"?aria-setsize就是"3",不是原始 100 - 虚拟滚动中,若
itemData数组已过滤或分页截取,就用该数组长度;传原始长数组会导致aria-setsize虚高 - 树形结构里,
aria-setsize指的是**同级兄弟节点数**,不是整棵树的节点总数 - 子节点异步加载时,初始可设
aria-setsize="0",加载完成再 patch 为真实数量
计数必须从 1 开始,不是 0
JS 数组索引习惯从 0 开始,但 ARIA 位置语义严格要求自然数序号:
-
aria-posinset值为1表示第一项,绝不能是0 - 计算时记得 +1:比如过滤后数组索引是
i,对应aria-posinset是i + 1 - 分页场景下,第 2 页首项若整体排第 26 位,
aria-posinset应为"26",不是"1"
原生 <ol> 不需要手动设
只有自定义列表才需干预。以下情况必须手动设置:
立即学习“前端免费学习笔记(深入)”;
- 使用
role="listitem"但父容器不是语义化<ol>或<ul> - 组件库如 React Window、ng-select、手写虚拟滚动、树形控件
- 父容器用了
role="listbox"、role="tree"或role="grid"
真正麻烦的是树节点展开/折叠或搜索实时过滤时的同步更新——这里稍有延迟,用户听到的序号就会错乱。



















