玩转自定义焦点样式

Avatar of Lari Maza
Lari Maza

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 价值 200 美元的免费积分!

每个前端开发人员都会遇到这种情况:你的老板、客户或设计师认为浏览器在聚焦元素上应用的轮廓与 UI 不匹配,并要求你将其删除。或者你甚至可能想自己删除它。

所以你做了一些研究,发现 强烈建议不要这样做,因为焦点轮廓的存在是有原因的:它为键盘导航(使用 Tab 键)提供视觉反馈,让无法使用鼠标或有视力障碍的用户知道他们在屏幕上的位置。

此按钮显示了 Chrome 默认轮廓样式的焦点状态。

但这并不意味着你只能忍受这个轮廓。与其删除它,不如用其他东西替换它。这样,你就可以保持界面的可访问性,并且可以更灵活地控制它的外观,以便更好地匹配你的 UI。

你可以先通过选择元素的聚焦状态并应用 outline: none 来删除默认的浏览器轮廓。然后,你可以从以下选项中选择其中一个来替换它

更改背景颜色

这最适合可以填充的元素,例如按钮。选择元素的聚焦状态并为其应用对比色背景。对比度越高越好,因为细微的改变可能不足以成为强烈的视觉提示,尤其是在色盲和低视力情况下。

在下面的示例中,背景和边框颜色都会改变;你可以选择其中一个或两个。

单击或使用 Tab 键聚焦以查看此状态的外观。

查看 CodePen 上的
使用背景颜色替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

更改文本颜色

如果元素包含任何文本,你可以选择聚焦状态并更改其颜色。这对于使用 mask-image 应用的图标也有效;你可以选择作为聚焦元素后代的图标并更改其背景颜色,就像下面的示例按钮。

查看 CodePen 上的
使用文本和图标颜色替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

同样,对比度是关键。你也可以考虑在文本链接上使用下划线,并将其作为更改状态的一部分,因为,正如 网页内容无障碍指南 指出

颜色不用作传达信息、指示操作、提示响应或区分视觉元素的唯一视觉手段。(A 级)
了解成功标准 1.4.1

应用阴影

box-shadow 属性可以完全像轮廓一样工作,只是它更强大——你现在可以控制它的颜色、不透明度、偏移量、模糊半径和扩散半径。如果指定了 border-radius,则阴影会遵循相同的圆角。

查看 CodePen 上的
使用阴影替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

你可以用这种技术变得非常有创意(不过认真地说,不要这样做)

查看 CodePen 上的
使用疯狂的阴影替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

这适用于几乎所有类型的可聚焦元素,例如切换、复选框、单选按钮和滑块。

查看 CodePen 上的
使用阴影替换原生轮廓焦点的切换和单选按钮
,作者 Lari (@larimaza)
CodePen 上。

增大元素的大小

作为颜色改变的替代方案,你也可以使用微妙的大小修改作为焦点反馈。在此示例中,我们使用 transform: scale

查看 CodePen 上的
使用 transform scale 替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

这里的关键是微妙。极端的尺寸变化可能会导致内容重排,更不用说对 那些希望减少运动的人 来说体验很差。

复制现有的悬停样式

如果元素已经具有对比色悬停样式,你可以简单地将该样式也应用于聚焦状态。这是一个相当优雅的解决方案,因为你不需要在界面中添加任何新的颜色或轮廓。

以下是一个示例,其中焦点和悬停状态都采用了与元素默认样式的背景形成高度对比的颜色

查看 CodePen 上的
使用悬停样式替换原生轮廓焦点的元素
,作者 Lari (@larimaza)
CodePen 上。

奖励:自定义默认轮廓

到目前为止,我们所讨论的所有内容都假设我们要完全删除焦点轮廓。我们不必这样做!事实上,它是一个我们可以自定义的边框。

button:focus {
  outline: 3px dashed orange;
}

那是简写,如果我们想微调样式,可以这样写

button:focus {
  outline-width: 3px;
  outline-style: dashed;
  outline-color: orange;
}

我们拥有的另一个超能力是 outline-offset 属性,它与 outline 简写属性分开,但可以与它一起使用以更改焦点环的位置

button:focus {
  outline: 3px dashed orange;
  outline-offset: 10px;
}

结论

你可以将所有这些选项混合搭配,以获得适合界面中每个组件类型的自定义样式。

并且值得重复:在采用自定义焦点状态时,不要忘记使用鲜明的颜色对比度和其他视觉提示来代替颜色。当然,我们都希望获得与我们的设计相一致的体验,但我们可以在此过程中坚持良好的可访问性实践。W3C 建议使用此工具 来测试颜色值相对于 WCAG 指南的对比度。