在macOS的 Safari中,按Tab键无法将焦点放在按钮和自定义元素上

前端开发 2026-07-09

我正在开发一个使用Webflow导出主题的WordPress站点。该站点需要通过WCAG 2AA无障碍标准。

在Chrome和 Firefox中一切正常——按Tab键可以遍历所有可交互元素,聚焦环也能看到。

但在macOS上的Safari中,Tab键会跳过大部分元素。

环境:

  • WordPress 6.x
  • Webflow导出的主题(future_of_fashion
  • Safari 17+在 macOS Sonoma上
  • 使用pa11y WCAG2AA进行测试

主题中的非原生交互元素(汉堡菜单、滑块箭头)的标记如下:

<div class="menu-button w-nav-button"
     role="button"
     tabindex="0"
     aria-label="Open navigation menu"
     aria-expanded="false">
  <div class="w-icon-nav-menu" aria-hidden="true"></div>
</div>

所有滑块箭头都遵循相同的模式 — role="button" + tabindex="0"

我已从主题样式表和Webflow CSS中删除所有 outline: none / outline: 0 的覆盖项。

当前的聚焦样式:

a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible,
.w-nav-button:focus-visible,
.w-slider-arrow-left:focus-visible,
.w-slider-arrow-right:focus-visible {
    outline: 3px solid #fff !important;
    outline-offset: 3px !important;
    box-shadow: 0 0 0 5px #333 !important;
}

在Chrome和 Firefox中,聚焦指示器工作正常。

我已经尝试过:

  • 移除所有 outline: noneoutline: 0
  • tabindex="0"role="button" 添加到所有非原生控件
  • 使用pa11y验证 — 未发现WCAG2AA错误
  • 确认在Chrome和 Firefox中键盘导航工作正常

macOS的 Safari似乎会跳过:

  • <button>
  • <div tabindex="0">
  • [role="button"]

除非在系统设置中启用macOS键盘导航。

因为该元素从未获得焦点,:focus-visible 也就永远不会触发。

所以这似乎是Safari/macOS的键盘导航行为,而不是一个CSS问题。

是否有可靠的CSS或 JavaScript解决方案,可以在不要求用户更改OS/浏览器无障碍设置的情况下,让Safari/macOS将所有可交互元素包含在Tab顺序中?

我考虑过:

  1. 将所有 <div role="button"> 元素替换为原生的 <button> 元素
  2. 添加一个JavaScript回退机制,在Tab键事件时手动移动焦点

但我不确定这两种方法在无障碍方面是否被视为正确或可靠。

在这里,推荐的符合WCAG的做法是什么?

解决方案

没有可靠的CSS解决方法,因为根本没有让该元素获得焦点。

macOS上的Safari会遵循用户的键盘导航设置。如果该设置关闭,Tab将不会遍历每个控件,因此 :focus / :focus-visible 无法帮助,因为这些元素根本不会获得焦点。

从页面端来看,最好的做法是改进标记,避免依赖ARIA将非交互元素转化为控件:

<button
  type="button"
  class="menu-button w-nav-button"
  aria-label="Open navigation menu"
  aria-expanded="false">
  <span class="w-icon-nav-menu" aria-hidden="true"></span>
</button>

然后把聚焦样式保持在原生控件上:

button:focus-visible,
a:focus-visible,
[tabindex]:focus-visible {
  outline: 3px solid #fff;
  outline-offset: 3px;
  box-shadow: 0 0 0 5px #333;
}

我不会添加一个手动捕获或重新实现Tab导航的JavaScript回退。这通常会引入新的无障碍问题,尤其是对屏幕阅读器和键盘用户。

因此,推荐的做法是:尽可能使用原生元素,在不可避免时让自定义控件可通过键盘操作,并保留可见的聚焦样式。当用户的操作系统/浏览器设置另有规定时,你无法强制Safari/macOS将所有可聚焦元素都包含在Tab顺序中。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章