VoiceOver光标与键盘焦点不同步:开启同步仍存元素跳转异常求因
结合你描述的现象(同步焦点选项已开启但光标不跟随、Tab导航/单向浏览时元素被跳过,且元素本身无障碍属性正常),常见原因如下:
DOM顺序与视觉布局不匹配:如果问题元素通过CSS(如
position: absolute/fixed、flex order)调整了视觉位置,但DOM结构中的顺序和视觉顺序不一致,VoiceOver从上到下浏览会严格遵循DOM顺序,反向浏览则按倒序DOM执行,就会出现单向可聚焦的情况。同时,Tab导航虽按tabindex排序,但VoiceOver光标同步逻辑会受DOM顺序干扰,导致聚焦时光标停留在上一元素。隐性无障碍状态冲突:即使元素在无障碍树中可见,也可能存在隐性冲突:比如父元素设置了
aria-hidden="true"但未动态移除,子元素虽强行设置tabindex和可见性,仍会继承父元素的隐藏标记,导致VoiceOver处理时延迟或跳过;另外,页面中频繁更新的aria-live区域可能抢占焦点资源,干扰光标对当前聚焦元素的跟踪。浏览器无障碍缓存或渲染异常:若问题元素是JS动态生成的,浏览器的无障碍缓存可能未及时更新,导致VoiceOver未重新扫描到元素;或者元素通过
visibility: hidden、opacity: 0设置为视觉不可见但仍可聚焦,VoiceOver会基于视觉判定跳过元素,但反向浏览时DOM顺序优先级更高,因此能被聚焦。tabindex取值或顺序冲突:即使元素设置了
tabindex,若存在多个元素使用相同的正整数tabindex(如tabindex="1"),会打乱默认Tab导航顺序,VoiceOver光标同步时出现逻辑混乱;另外,若元素的tabindex动态变化后未触发无障碍树更新,也会导致光标跟踪异常。浏览器与VoiceOver兼容性bug:不同版本的Safari(或Mac上的Chrome)与VoiceOver之间存在特定兼容性问题,比如自定义元素搭配标准ARIA角色(如
role="button")时,VoiceOver对焦点的跟踪逻辑出现延迟,导致光标不及时跟随键盘焦点。
内容的提问来源于stack exchange,提问作者MrLoon

