aria-valuemin必须显式设为数字,不可省略或用字符串;使用role="slider"或role="spinbutton"时,aria-valuemin、aria-valuemax、aria-valuenow三者缺一不可,否则读屏器无法识别控件。

aria-valuemin 必须显式设为数字,不能省略或用字符串
aria-valuemin 默认是 0,但「默认」不等于「可省略」。只要用了 role="slider" 或 role="spinbutton",WAI-ARIA 规范就强制要求 aria-valuemin、aria-valuemax、aria-valuenow 全部存在——缺一个,读屏器(如 NVDA、VoiceOver)会静默跳过整个控件,或报“invalid value”。
常见错误:<div role="slider" aria-valuenow="5" aria-valuemax="10"> —— 没写 aria-valuemin,JAWS 直接不识别为滑块。
-
aria-valuemin必须是数字,不能是字符串"0"(虽然部分浏览器能容错,但旧版 VoiceOver 会失败) - 若业务最小值不是 0(比如温度范围 -20°C 到 40°C),必须显式写
aria-valuemin="-20",不能依赖默认 - 不要写成
aria-valuemin="0.0"或aria-valuemin="0px",单位和小数点后零都会导致解析失败
什么时候必须设非零的 aria-valuemin
当控件的真实数值范围起点不是 0 时,aria-valuemin 就不能取默认值。它反映的是业务逻辑原始值,不是百分比或 UI 显示值。
例如:服务器响应时间监控,单位是毫秒,合理区间是 0 到 500,那 aria-valuemin="0" 合理;但如果是「剩余冷却时间(秒)」,从 30 秒开始倒计时到 0,那 aria-valuemin="0" 就错了——真实范围是 0 到 30,起点是 0,终点是 30;反过来,如果显示「已冷却 12 秒 / 总 30 秒」,那 aria-valuemin="0"、aria-valuemax="30"、aria-valuenow="12" 才对。
立即学习“前端免费学习笔记(深入)”;
- 信用分(300–850):必须设
aria-valuemin="300",否则读屏器把 724 解读成 “724/100”,语义完全失真 - 文件上传已传字节数:若总大小是 2MB(2097152 字节),已传 1.2MB(1258291 字节),则
aria-valuemin="0"、aria-valuemax="2097152"、aria-valuenow="1258291" - 别强行归一化为 0–100:ARIA 不关心百分比,只认原始数值区间
JS 动态更新时怎么安全改 aria-valuemin
aria-valuemin 是静态配置项,一般不随用户操作变化——它定义的是整个控件的合法取值下界,不是当前状态。所以绝大多数场景下,你只需在 HTML 初始化时设好,后续只更新 aria-valuenow 即可。
但若业务逻辑真需要动态切换范围(比如切换计量单位:摄氏度 → 华氏度),就必须同步更新全部三个属性,并确保 aria-valuenow 仍落在新范围内:
- 先做边界校验:
const clamped = Math.min(newMax, Math.max(newMin, newValue)) - 再批量设置:
el.setAttribute('aria-valuemin', newMin)、el.setAttribute('aria-valuemax', newMax)、el.setAttribute('aria-valuenow', clamped) - 千万别只改
aria-valuemin而漏掉aria-valuemax或aria-valuenow,否则读屏器可能报“value out of range”
aria-valuemin 和 meter 标签里的 min 属性别混用
<meter> 的 min 属性和 ARIA 的 aria-valuemin 完全不同源:前者是 HTML 原生属性,仅用于视觉比例计算;后者是 ARIA 属性,专为辅助技术提供语义范围。二者互不影响,也不能互相替代。
更关键的是:<meter> 不支持 aria-valuemin——加了也会被浏览器静默丢弃。如果你需要可访问的标量展示且要自定义播报文本,正确做法是用 <div role="progressbar"> 替代 <meter>,并显式设置全部 ARIA 范围属性。
容易忽略的一点:即使你用原生 <input type="range">,它的 min 属性会自动映射为 aria-valuemin,但你仍需确保 JS 更新时没破坏这个映射(比如手动覆盖 aria-valuemin 导致与 min 值不一致)。



















