突出焦点

CSS 播客 - 018:专注

在网页上 您点击某个链接后,用户会跳转到网站的主要内容。 这些链接通常称为跳转链接或锚链接。 当您通过键盘打开该链接时,可以按 Tab 键和 Enter 键, 主内容容器周围有一个聚焦环。这是为什么?

这是因为 <main> 具有 tabindex="-1" 属性值, 这意味着可以通过编程方式聚焦。 由于浏览器网址栏中的 #main-contentid 匹配,因此当定位到 <main> 时,它会获得程序化焦点。在这些情况下,很容易移除焦点样式, 但适当并细心地处理焦点有助于创造 提供良好的用户体验 也可以用来增加互动的兴趣。

为什么专注至关重要?

作为 Web 开发者,您的工作就是让网站对所有人开放且易于访问。使用 CSS 创建无障碍焦点状态就是其中的一项责任。

焦点样式可为使用键盘或 开关控制 来浏览网站并与之互动 如果某个元素获得焦点,但没有视觉提示,用户可能会失去对焦点的跟踪。在以下情况下,这可能会造成导航问题并导致不必要的行为: 比如说,跟踪的链接不正确。

元素如何获得焦点

某些元素可自动获得焦点;这些元素接受互动和输入,例如 <a><button><input><select>。简而言之,就是所有表单元素、按钮和链接。 您通常可以使用 tab 键在页面上前进,使用 shift + tab 键后退,您可以浏览网站的可聚焦元素。

此外,还有一个名为 tabindex 的 HTML 属性,可用于更改标签页导航索引,即 元素聚焦的顺序(每当用户按下 Tab 键时), 或焦点随着网址中的哈希值变化或 JavaScript 事件而转移。 如果将 HTML 元素的 tabindex 设为 0, 它可以通过 Tab 键获得焦点,并且遵循全局 Tab 索引, 由文档来源顺序定义

如果您将 tabindex 设置为 -1,则它只能通过程序化方式接收焦点,也就是说,只有在发生 JavaScript 事件或发生哈希更改(与网址中元素的 id 匹配)时,它才能接收焦点。如果您将 tabindex 设置为高于 0 的任何值,系统会将其从全局标签页索引(由文档来源顺序定义)中移除。现在, Tab 键顺序将由 tabindex 的值定义, 因此,举例来说,具有 tabindex="1" 的元素将在具有 tabindex="2" 的元素之前获得焦点。

设置焦点样式

某个元素获得焦点时的默认浏览器行为是呈现焦点环。 此对焦环因浏览器和操作系统而异。

可以通过 CSS 更改这种行为 使用 :focus:focus-within:focus-visible 伪类, 伪类课程。 请务必设置与元素的默认样式形成对比的焦点样式。例如,常见的方法是使用 outline 属性。

a:focus {
  outline: 2px solid slateblue;
}

outline 属性可能会显示得过于靠近链接文本,但 outline-offset 属性可以帮助解决此问题,因为它会添加额外的视觉 padding,而不会影响元素填充的几何尺寸。outline-offset 的正数值会将轮廓向外推,负数值会将轮廓向内拉。

目前,在某些浏览器中,如果您为元素设置了 border-radius 并使用 outline,则它们将不匹配 - 轮廓将有尖角。因此,很容易就想使用具有较小模糊半径的 box-shadow,因为 box-shadow 会剪裁到形状,遵循 border-radius,但此样式不会在 Windows 高对比度模式下显示。这是因为 Windows 高对比度模式不会应用阴影,并且通常会忽略背景图片,以便采用用户的首选设置。

总结

创建与元素的默认状态形成对比的焦点状态非常重要。默认的浏览器样式已为您执行此操作,但如果您想更改此行为,请注意以下事项:

  • 避免对可接收键盘焦点的元素使用 outline: none
  • 请避免将 outline 样式替换为 box-shadow。 因为它们不会在 Windows 高对比度模式下显示
  • 仅在绝对必要时,才应为 HTML 元素上的 tabindex 设置正值。
  • 确保焦点状态与默认状态相比非常清晰。

检查您的理解情况

测试您对专注力的掌握情况

以下哪些是自动可聚焦的元素?

<a>
🎉
<p>
再试一次!
<button>
🎉
<input>
🎉
<output>
再试一次!
<select>
🎉

以下哪种输入设备可以设置焦点?

游戏手柄
游戏手柄通常会在用户按下按钮时发送键盘事件。
键盘
在用于浏览网页时,肯定会获得焦点。
老鼠
鼠标需要视觉,并且在使用时不会再将焦点放在元素上。以前,所有浏览器都会在用户点击按钮等内容时将焦点移至这些内容,但现在情况已发生变化。
辅助技术(屏幕阅读器、开关等)
在用于浏览网页时,肯定会获得焦点。
一颗土豆
抱歉,尽管土豆可以用作触摸屏上的指针,但它在与屏幕输入交互后不会引起焦点。