正如 Eric Bailey 所说,如果它是交互式的,就需要一个焦点样式。 也许最好的选择是不要删除可聚焦元素默认的轮廓。 例如,如果您要使用 button { outline: 0; }
,那么您最好使用 button:focus { /* 其他非常明显的视觉效果 */ }
。 我今天才处理了一张票,其中缺少焦点样式正在损害一个依赖于视觉焦点样式来浏览网络的用户。
但是这些焦点样式在使用 Tab 键或其他键盘导航时最有用,而在通过鼠标单击触发时则不那么有用。 现在我们有了 :focus-visible
! Nelo 写道
TL;DR;
:focus-visible
是:focus
的仅键盘版本。此外,W3C 提案中提到,除了期望键盘输入的元素(例如文本字段、
contenteditable
)之外,应优先使用:focus-visible
而不是:focus
。
(另请参阅他的文章,以了解为什么鼠标单击和焦点样式可能不一致,原因不仅仅是人们不喜欢模糊的蓝色轮廓。)
对 :focus-visible
的浏览器支持相当差
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器从该版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
86 | 4* | 否 | 86 | 15.4 |
移动设备/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 15.4 |
但它确实有 Firefox 支持,正如 Lea Verou 所说 says
…一旦 Chrome 发布其实现,它将在 1-2 个月内大规模爆发。
这通常是现在的趋势。 一旦两个主要浏览器都支持 - 其中一个是 Chrome - 这就足以让 web 的很大一部分开始使用它。 特别是当它可以像这个属性一样安全地完成时。
安全,意思是,有一个 官方 polyfill,这意味着您可以删除默认的焦点样式,只使用 :focus-visible
样式
/* Remove outline for non-keyboard :focus */
*:focus:not(.focus-visible) {
outline: none;
}
/* Optional: Customize .focus-visible */
.focus-visible {
outline: lightgreen solid 2px;
}
但是,正如 Patrick H. Lauke 所记录的那样,您甚至可以在没有 polyfill 的情况下做到这一点,使用谨慎的选择器用法并根据需要撤消样式
button:focus { /* Some exciting button focus styles */ }
button:focus:not(:focus-visible) {
/* Undo all the above focused button styles
if the button has focus but the browser wouldn't normally
show default focus styles */
}
button:focus-visible { /* Some even *more* exciting button focus styles */ }
这似乎是对 web 的一项很好的改进。
很高兴看到更多关于焦点状态和
:focus-visible
的报道。 一些想法什么是仅键盘用户? 在当今时代,快速输入模式切换尤其普遍,主流设备可以在触摸、鼠标、键盘和其他输入(如语音)之间即时切换。 想想您上次通过表单使用 Tab 键导航,但用鼠标点击提交按钮。 开始将用户分类为使用键盘的用户和不使用键盘的用户,对他们的情况和浏览方式做出了很多假设,我对此并不满意。
还要考虑最终用户的技术熟练程度。 不一致的焦点效果可能会让那些不熟悉数字系统导航细微差别的人感到困惑,因为焦点环出现或不出现的原因没有直接传达给他们。 如果用户有视力障碍,这就会加剧这种情况,因为焦点环出现的可预测性会发生变化。
此外,与 CSS 不同,JavaScript 不是容错的。 如果脚本的 Polyfill 部分出现故障,焦点效果就会丢失,导致依赖焦点指示器的用户无法使用该网站。 更不用说对非标准浏览器的支持问题了。
我显然对
:focus-visible
的实际效用持怀疑态度,但我也认为风险很高。我完全同意。 在我完成个人项目后发现网站上良好的无障碍控制功能的强大之处后,我发现自己越来越频繁地同时使用键盘和鼠标导航。
我非常支持新的工具和语法,我认为这看起来很有趣,尽管如此,对它的支持很差,虽然 Polyfill 可能会让你入门,但我认为
:focus
的强大功能不容忽视。 虽然这对一些人来说似乎是一件有趣的新事物,但这实际上是能够使用 web 和无法使用 web 之间的区别。 这是人们(包括我自己)理所当然的事情。不过,写得很好。 我期待看到它在更多浏览器中实施,以及我们如何利用这两个选项。 没什么能说明我们不能将它们结合使用来为有能力的用户和不太有能力的用户创造出色的体验。
这个 交流 有点激烈,但似乎是相关的...
我们在我们的 React 应用程序中使用不同的方法。
即“what-input” Node 包,它在 HTML 元素
<html data-whatinput="keyboard" data-whatintent="keyboard">
中添加了以下属性。然后,我们利用它来为仅键盘提供 :FOCUS 样式
以及为鼠标提供 :HOVER 样式
我通常使用 HTML 版本。 该技术包括在您要为其提供样式的元素内添加一个元素。
然后,您可以为主要元素设置
:focus
的样式。当用户点击它时,
<span>
元素会获得焦点,并且不会显示焦点环。我期待着
:focus-visible
- 这绝对可以节省一些标记!在此期间 - 直到
:focus-visible
获得浏览器支持 - 还有其他方法可以实现仅键盘焦点样式。 这里有一篇包含 CSS 解决方案的文章:https://www.kizu.ru/keyboard-only-focus/#x - Codepen [Here] (https://codepen.io/danield770/details/RgzLrm/) 它比伪元素稍微麻烦一些,但它可以完成工作!