role="region"比role="landmark"更适合自定义路标,因其兼容性更好且配合aria-label可稳定暴露为可跳转区域;必须添加aria-label,禁用aria-labelledby和嵌套region;aria-live需清空前文、禁用assertive;路标不可tab聚焦但需支持区域跳转,描述须基于真实空间关系生成。

盲人无法依赖视觉路标,HTML 中的 role 本身不能“导航”,它只是向辅助技术(如屏幕阅读器)声明元素的语义意图;真正起作用的是结构语义 + 键盘可聚焦性 + ARIA 属性协同。
为什么 role="region" 比 role="landmark" 更适合自定义路标
role="landmark" 是 WAI-ARIA 1.1 引入的,但主流屏幕阅读器(NVDA、VoiceOver)对它的支持仍不稳定——部分版本会跳过未命名或未设 aria-label 的 landmark,且不保证按地理顺序朗读。而 role="region" 兼容性更好,配合 aria-label 可稳定暴露为可跳转区域。
- 必须为每个路标添加
aria-label,例如<div role="region" aria-label="前方十字路口"> <li>避免使用 <code>aria-labelledby引用页面内其他文本,盲人用户可能已滚动离开该位置,导致标签失效 - 不要嵌套多个
role="region",屏幕阅读器会将其合并为一个区域,丢失空间层次 - 每次触发前先清空上一个
aria-live区域内容,再注入新文本,避免残留 - 绝对不用
aria-live="assertive",它会中断当前语音,对行走中的盲人构成安全风险 - 建议在播报文本末尾加简短方位提示,例如 “前方十字路口,左转进入中山路”,而非仅 “十字路口”
- 设置
tabindex="-1"仅用于程序化聚焦(如自动滚动对齐),不可设tabindex="0" - 必须配合
aria-describedby指向说明性文本(如 “此路标提示前方3米有台阶”),且该文本需在 DOM 中紧邻或逻辑相邻 - 避免给路标容器加
onclick或onkeydown,盲人用户无点击动机,反而增加误触风险
aria-live 用于动态播报路标,但必须严格控制更新频率
当用户靠近某一路标时,前端通过 GPS 或蓝牙信标触发播报,此时用 aria-live="polite" 是安全选择;但若连续触发多个路标(如密集街区),屏幕阅读器会排队朗读,造成信息堆叠、语义错乱。
键盘焦点与 tabindex 的实际约束
路标不是交互控件,不应被键盘 Tab 遍历——否则会打断表单填写或阅读流程。但需确保其能被屏幕阅读器的“区域跳转”命令(如 NVDA+Q)定位到。
最易被忽略的一点:所有路标描述必须基于真实空间关系生成,不能依赖 UI 布局顺序或 DOM 位置——屏幕阅读器不感知 CSS transform 或 position: absolute,只读取 DOM 流顺序和 ARIA 声明。地理坐标映射到语义描述的转换逻辑,必须在服务端或高精度定位模块中完成,前端只负责可靠呈现。











