搜索
首页web前端css教程使用CSS自定义属性标准化焦点样式

Standardizing Focus Styles With CSS Custom Properties

快速测试一下你的项目:打开浏览器,仅使用Tab键,尝试在按钮、链接和表单元素等交互元素间导航。

如果你是视力正常的用户,你应该能够看到焦点在DOM元素间跳转时的视觉变化。但如果没有视觉变化,或者变化微乎其微,那么你就能找到一个能为你的访客带来巨大改变的方法。

本文将介绍一种使用CSS自定义属性来更有效地管理项目焦点样式的技术,并学习现代CSS焦点选择器。首先,让我们了解为什么可见焦点样式如此重要。

满足WCAG焦点样式标准

可见焦点状态符合《Web内容无障碍指南》(WCAG) 成功标准2.4.7 – 焦点可见。2.4.7的《理解》文档中说明了该标准的意图:

此成功标准的目的是帮助用户了解哪个元素具有键盘焦点。必须能够让用户知道多个元素中哪个元素具有键盘焦点。

在即将发布的WCAG 2.2中,将添加一个新的标准来阐明“焦点指示器应有多明显”。虽然目前仍在草案阶段,但熟悉并应用2.4.11 – 焦点外观(最低限度)中的指南无疑是您今天可以采取的改进焦点样式的积极步骤。

使用CSS自定义属性管理焦点样式

今年我开始使用的一种技术是在我的级联样式表中,在主要的交互式基本元素上尽早包含以下设置:

<code>:is(a, button, input, textarea, summary) {
  --outline-size: max(2px, 0.08em);
  --outline-style: solid;
  --outline-color: currentColor;
}

:is(a, button, input, textarea, summary):focus {
  outline: var(--outline-size) var(--outline-style) var(--outline-color);
  outline-offset: var(--outline-offset, var(--outline-size));
}</code>

这附加了自定义属性,允许您根据需要灵活地自定义轮廓样式的某些部分,以确保在元素上下文发生变化时焦点仍然可见。

对于--outline-size,我们使用max()来确保至少为2px的值,同时允许根据组件(例如,标题内的大按钮或链接)基于0.08em进行缩放。

这里你可能不熟悉的属性是outline-offset,它定义了元素和轮廓之间的空间。你甚至可以提供一个负数来内嵌轮廓,这对于确保焦点样式的对比度非常有用。在我们的规则集中,我们设置该属性以接受可选的自定义属性--outline-offset,以便在需要时可以自定义它,否则它将回退以匹配--outline-size

轮廓外观改进

在我的职业生涯中,我曾被要求移除轮廓,也曾自己移除过轮廓,因为它们被认为是“难看的”。

现在有两个原因说明绝对不应该移除轮廓(除了无障碍影响):

  1. 在Chromium和Firefox中,outline现在遵循border-radius!? 这意味着您可以考虑删除您可能使用过的任何hack,例如使用box-shadow来模拟它(这对无障碍也有积极影响,因为它可以确保不会为Windows高对比度主题用户删除焦点样式)。
  2. 使用:focus-visible,我们可以要求浏览器使用启发式方法,仅在检测到需要可见焦点的输入模式时才显示焦点样式。简而言之,这意味着鼠标用户在点击时不会看到它们,而键盘用户在Tab键操作时仍然会看到它们。

需要注意的是,表单元素始终显示焦点样式——它们不受:focus-visible行为的限制。

因此,让我们增强我们的规则集,添加以下内容以包含:focus-visible。我们将保留我们已经为旧浏览器定义的初始:focus样式,以防万一不会丢失。

<code>:is(a, button, input, textarea, summary):focus-visible {
  outline: var(--outline-size) var(--outline-style) var(--outline-color);
  outline-offset: var(--outline-offset, var(--outline-size));
}</code>

由于浏览器处理它们不理解的选择器的方式,我们需要将这些规则分开,即使它们定义相同的轮廓属性,也不能将它们组合在一起。

最后,我们还需要这种看起来很奇怪的:focus:not(:focus-visible)规则,它会为支持:focus-visible的浏览器移除常规焦点样式:

<code>:is(a, button, input, textarea, summary):focus:not(:focus-visible) {
  outline: none;
}</code>

值得注意的是,最新版本的Chromium和Firefox已切换到使用:focus-visible作为在交互式元素上应用焦点样式的默认方式,并且最近在webkit中已启用为默认方式,因此它应该很快就会出现在Safari稳定版中!我们的规则仍然有效,因为我们正在自定义轮廓外观。

有关可见焦点样式的更多指导,我推荐Sara Soueidan关于焦点指示器的精彩而全面的指南,因为它考虑了即将推出的2.4.11标准。

焦点样式演示

此示例演示了这些交互式元素中的每一个以及如何使用自定义属性应用自定义设置,包括一些针对深色模式的更改。根据您的浏览器支持情况,除非您使用Tab键,否则您可能不会看到焦点样式,因为使用了:focus-visible

最后一点:就焦点样式而言,button是一个独特的交互式元素,因为它在其状态之间有额外的考虑因素,特别是如果您只依赖颜色。如需帮助,请尝试使用我的项目ButtonBuddy.dev中的调色板生成器。

以上是使用CSS自定义属性标准化焦点样式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
什么是CSS网格?什么是CSS网格?Apr 30, 2025 pm 03:21 PM

CSS网格是创建复杂,响应式Web布局的强大工具。它简化了设计,提高可访问性并提供了比旧方法更多的控制权。

什么是CSS Flexbox?什么是CSS Flexbox?Apr 30, 2025 pm 03:20 PM

文章讨论了CSS FlexBox,这是一种布局方法,用于有效地对齐和分布响应设计中的空间。它说明了FlexBox用法,将其与CSS网格进行了比较,并详细浏览了浏览器支持。

我们如何使用CSS使网站迅速响应?我们如何使用CSS使网站迅速响应?Apr 30, 2025 pm 03:19 PM

本文讨论了使用CSS创建响应网站的技术,包括视口元标签,灵活的网格,流体媒体,媒体查询和相对单元。它还涵盖了使用CSS网格和Flexbox一起使用,并推荐CSS框架

CSS盒装属性有什么作用?CSS盒装属性有什么作用?Apr 30, 2025 pm 03:18 PM

本文讨论了CSS盒装属性,该属性控制了元素维度的计算方式。它解释了诸如Content-Box,Border-Box和Padding-Box之类的值,以及它们对布局设计和形式对齐的影响。

我们如何使用CSS动画?我们如何使用CSS动画?Apr 30, 2025 pm 03:17 PM

文章讨论使用CSS,关键属性并与JavaScript结合创建动画。主要问题是浏览器兼容性。

我们可以使用CSS向我们的项目添加3D转换吗?我们可以使用CSS向我们的项目添加3D转换吗?Apr 30, 2025 pm 03:16 PM

文章讨论了Web项目的3D转换,关键属性,浏览器兼容性和性能注意事项的讨论。(角色计数:159)

我们如何在CSS中添加梯度?我们如何在CSS中添加梯度?Apr 30, 2025 pm 03:15 PM

文章讨论了使用CSS梯度(线性,径向,重复)来增强网站视觉效果,添加深度,焦点和现代美学。

CSS中的伪元素是什么?CSS中的伪元素是什么?Apr 30, 2025 pm 03:14 PM

文章讨论了CSS中的伪元素,它们在增强HTML样式方面的使用以及与伪级的差异。提供实用的例子。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器