值得重复:所有交互式元素都应该有焦点样式。这样,键盘用户就可以知道他们何时将焦点移动到该元素上。
但是,如果您单独使用 :focus
,它有一个很多人不喜欢的副作用。这意味着,当您(使用鼠标)点击一个交互式元素时,您会看到焦点样式。可以说,您作为鼠标用户不需要这种反馈,因为您只是将光标移动到那里并点击了。无论您怎么看待它,它都让很多人多年来感到厌烦,以至于他们完全删除了焦点样式,这对网络可访问性来说是一个糟糕的损失。
如果我们只在使用键盘而不是鼠标来聚焦某个东西时应用焦点样式,会怎么样?Lea Verou 几年前指出了这一点
这是对 Chrome 在一个标志后面放弃该功能的回应。聪明聪明。
快进几年,Chrome 正在发布它,无需任何标志。他们同意 Lea 的想法
通过将
:focus-visible
与:focus
结合使用,您可以更进一步,根据用户的输入设备提供不同的焦点样式。如果您希望焦点指示器依赖于输入设备的精度,这将非常有用
/* Focusing the button with a keyboard will show a dashed black line. */
button:focus-visible {
outline: 4px dashed black;
}
/* Focusing the button with a mouse, touch, or stylus will show a subtle drop shadow. */
button:focus:not(:focus-visible) {
outline: none;
box-shadow: 1px 1px 5px rgba(1, 1, 0, .7);
}
我建议您尝试不使用 button
的这些选择器,使其全局应用!
还有更多内容值得挖掘,所以我会在这里链接一些更多信息
- Chromium 博客 文章介绍了选择器的启发式方法。这很棘手。就好像有一个算法来确定
:focus-visible
是否会匹配,而您只需要相信它。它还涵盖了 Firefox 早已拥有:-moz-focusring
的想法,但行为差异很大,因此他们不建议您在追求一致行为时使用它。 - Matthias Ott 在他的博客中对此进行了介绍,并提供了一些有用的信息,例如使用 官方 polyfill 以及如何在 DevTools 中正确查看样式(有一个新的复选框)。
- 我们以前也介绍过这一点。 在那篇文章中,我们注意到 Lea 的 推文,她说她认为当它真正发布时,它的使用量会激增。让我们拭目以待吧(希望如此)!
- 我们的年鉴条目 包含大量详细信息。
仅供参考:不要认为鼠标点击也不应该有明显的焦点样式。我经常在新标签页中打开链接,而在关闭标签页后,焦点指示器非常有助于我看到我在链接列表中停下来的位置。
这将在我接下来的项目中派上用场。感谢分享
我完全同意。当网站设计了一个与其他设计无缝衔接的焦点状态时,它比隐藏焦点状态的网站要令人印象深刻得多。
一个合法的 CSS 技巧
我习惯使用逗号来设置焦点和悬停样式
.el:hover, .el:focus {}
。注意,切换到
.el:hover, .el:focus-visible {}
可能会在不支持 focus-visible 的浏览器中产生相反的结果,因为它们会丢弃整个选择器。这个“:focus-visible” 伪选择器非常棒……不过缺乏 Safari 支持有点令人沮丧……除非情况发生了变化?
对于这种情况,您希望为键盘用户显示焦点环,而为鼠标和触摸用户不显示,我通常使用一些 JS……
“`
yourButtonElement.addEventListener(‘mousedown’, function(e){
e.preventDefault();
});
这会阻止焦点环在桌面上的鼠标按下或手机上的触摸操作时出现……
如果您希望在用户“点击”或“触摸”您的按钮时使用自定义样式,您可以使用 JavaScript 通过事件处理程序添加和删除类……
不可否认,一个纯 CSS 解决方案会更容易……所以我只希望 Safari 支持“:focus-visible”
我认为点击时隐藏焦点环作为一项渐进式增强非常合适,因此即使支持程度很低,这种 CSS 也是一个很好的解决方案。如果
:focus-visible
支持,那很好,但如果不支持,那么按钮上的焦点环也不是世界末日。我以前使用的 JS 解决方案是放置一个覆盖整个屏幕的固定 div,当它接收到 mousemove 事件时,div 会消失,并将一个
no-focusring
类添加到 body 类中然后,在任何键盘输入上,div 会再次显示,并且
no-focusring
类会从 body 中删除。因此,实质上,只有当鼠标移动并且用户启用了 js 时,才会禁用焦点环。
这是一个有用的功能,但它的名字很令人困惑。通过称之为 focus-visible,它意味着普通的焦点样式是不可见的,而事实并非如此。
请注意,这在文本框上的行为完全违反直觉。如果您点击一个按钮,它不会显示 :focus-visible 样式。但是,如果您点击一个文本框,它会显示 :focus-visible 样式,根据规范,这应该是预期的,不幸的是。