滑块控件必须同时设置 aria-valuemin、aria-valuemax 和 aria-valuenow,缺一不可;三者需为合法数字且 aria-valuenow 必须在[min,max]范围内,动态修改时需同步更新并触发事件。

滑块控件必须同时设置 aria-valuemin、aria-valuemax 和 aria-valuenow
仅设 aria-valuemin 和 aria-valuemax 不足以让屏幕阅读器正确播报滑块状态——它会默认当前值为 0,或直接跳过数值信息。必须显式提供 aria-valuenow,哪怕初始值是静态的。
常见错误现象:
– 屏幕阅读器读作“音量滑块,未定义”或“滑块,0%”
– 滑块拖动后数值不更新,或始终报同一数值
-
aria-valuemin和aria-valuemax应为数字(不带单位),且aria-valuenow必须落在该区间内(含边界) - 若滑块有步进(
step),建议同步设置aria-valuetext来提供语义化描述(如“中等亮度”),否则屏幕阅读器只读数字 - 原生
<input type="range">已自带这些属性的隐式支持,但若用div+ JS 自定义实现,则全部三个 ARIA 属性都需手动维护
<input type="range"> 中 aria-valuemin 等属性是否需要手动写?
不需要——浏览器自动从 min、max、value 属性推导对应 ARIA 值。但前提是这些 HTML 属性存在且合法。
使用场景:你用的是标准表单控件,没做封装或重写渲染逻辑。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 确保
min和max是有效数字(如min="0" max="100"),不要用字符串或空值 -
value必须在[min, max]范围内,否则部分屏幕阅读器(如 NVDA + Firefox)可能忽略整个数值播报 - 如果动态修改了
min/max(比如切换模式后范围变成 0–255),记得同步更新value并触发input或change事件,否则 ARIA 值缓存可能不同步
自定义滑块(div 实现)中如何正确同步 ARIA 属性
手动管理三个属性时,最容易出错的是时机和一致性:拖拽过程中未实时更新 aria-valuenow,或计算值越界未 clamp 导致 ARIA 值非法。
示例关键逻辑:
<div role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50" aria-valuetext="50%"> </div>
- 每次拖动结束(
mouseup/touchend)或键盘操作(ArrowLeft等)后,先将计算出的数值 clamp 到[min, max]再赋给aria-valuenow - 避免直接用像素偏移除以容器宽度来算值——浮点误差可能导致
aria-valuenow超出范围;应四舍五入并强制截断 - 若支持键盘调节,务必监听
keydown并根据step更新,不能只依赖鼠标事件
测试时容易被忽略的兼容性细节
某些组合(如 Safari + VoiceOver)对 aria-valuetext 的优先级高于 aria-valuenow,而 ChromeVox 则相反。不设 aria-valuetext 时,纯数字播报体验差异很大。
- 当取值有明确语义(如“低/中/高”、“冷/暖”),优先用
aria-valuetext提供字符串,而非依赖数字换算 -
aria-valuemin和aria-valuemax必须是静态属性(不能用 JS 动态删掉再加),否则 VoiceOver 可能缓存旧范围 - 不要给非
role="slider"元素加这些属性——它们只对slider、progressbar、scrollbar等特定 role 有效
最常漏掉的是 aria-valuenow 的实时性:它不是只在初始化时设一次的事,而是随用户交互持续校验和更新的状态值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










