搜索
首页web前端css教程聚焦管理和惰性

Focus management and inert

许多辅助技术都使用键盘导航来理解和操作屏幕内容。一种导航方式是通过Tab键。如果您使用它在表单上快速跳转到各个输入项而无需使用鼠标或触控板,那么您可能已经熟悉这种导航方式了。

Tab键会按照它们在DOM中出现的顺序跳转到交互式元素。这就是为什么源代码的顺序必须与设计的视觉层次结构相匹配如此重要的原因之一。

可进行Tab键操作的交互式元素列表:

  • 锚点(当存在href属性时),
  • <button></button>
  • <input><textarea></textarea>(带有相应的标签),
  • <select></select>
  • <details></details>
  • <audio></audio><video></video>(当存在控件时),
  • <object></object>(取决于其使用方法),
  • Firefox中任何具有滚动溢出的元素,
  • 任何应用了contenteditable属性的元素,以及
  • 任何应用了tabindex属性的元素(稍后将详细介绍此属性)。

交互式元素获得焦点的情况:

  • 通过Tab键导航到它,
  • 点击它,
  • 或者通过JavaScript中的element.focus()以编程方式设置焦点。

焦点类似于将鼠标光标悬停在元素上,因为它标识了您想要激活的内容。这也是为什么视觉上明显的焦点样式如此重要的原因。

焦点管理

焦点管理是协调哪些元素可以接收和不能接收焦点事件的做法。这是前端开发中比较棘手的事情之一,但对于使网站和Web应用程序更易访问至关重要。

良好的焦点管理实践

99%的情况下,您都想保留焦点顺序。 我再怎么强调这一点也不为过。

如果您使用<button></button>元素作为按钮,使用<a></a>元素作为链接,使用<input>元素作为用户输入等等,那么焦点将无需任何额外努力就能正常工作。

在极少数情况下,您可能希望将焦点应用于焦点顺序之外的内容,或者使通常无法接收焦点事件的内容可聚焦。以下是一些关于如何在易于访问且直观的导航方式中进行操作的指导原则:

操作:了解tabindex属性

tabindex允许元素获得焦点。它接受一个整数作为值。它的行为取决于使用的整数。

不要:将tabindex="0"应用于不需要它的内容

可以接收键盘焦点的交互式元素(例如<button></button>元素)不需要应用tabindex属性。

此外,您不需要在非交互式元素上声明tabindex来确保辅助技术可以读取它们(事实上,如果不存在角色和可访问名称,则这是一个WCAG失败)。这样做实际上会为使用辅助技术的人创建一个意外且难以导航的体验——他们有其他预期的方式来阅读此内容。

✅ 操作:使用tabindex="-1"进行JavaScript聚焦

tabindex="-1"用于使用JavaScript创建可访问的交互式窗口小部件。

声明tabindex="-1"将使元素可以通过JavaScript或点击/点击获得焦点。但是,它不会允许通过Tab键导航到它。

❌ 不要:使用正整数作为tabindex值

这是一个严重的反模式。使用正整数将覆盖预期的Tab键顺序,并为尝试导航内容的人创建一个混乱和令人迷失方向的体验。

一个这样的实例已经够糟糕了。多个声明简直就是一场噩梦。说真的:不要这样做。

❌ 不要:创建手动焦点顺序

交互式元素仅仅因为被使用就可以被Tab键操作。您不需要在每个交互式元素上设置一系列具有递增值的tabindex属性,以按照您认为用户应该使用的顺序进行设置。您将让DOM中元素的顺序为您完成此操作。

焦点捕获

有时您可能需要阻止某些内容获得焦点。一个很好的例子是焦点捕获,它是有条件地将焦点事件限制到元素及其子元素的行为。

焦点捕获不要与键盘陷阱(有时称为焦点陷阱)混淆。键盘陷阱是指通过键盘导航的人由于编写不良的逻辑而无法从窗口小部件或组件中逃脱的情况。

您将使用焦点捕获的实际示例是模态框:

为什么这很重要?

将焦点保持在模态框内传达了它的边界,并有助于告知什么是模态内容,什么不是模态内容——这类似于视力正常的人如何看到模态框“浮动”在其他网站或Web应用程序内容之上。如果以下情况,则此信息非常重要:

  • 您视力低下或没有视力,并依赖屏幕阅读器公告来帮助传达交互模式的转变。
  • 您视力低下并且使用了放大显示器,在模态框边界之外聚焦可能会令人困惑和迷失方向。
  • 您仅通过键盘导航,否则可能会从模态框中跳出,并在尝试返回模态框时迷失在底层页面或视图中。

如何操作?

可靠地管理焦点是一件复杂的事情。您需要使用JavaScript来:

  1. 确定当前页面或视图上所有可聚焦元素的容器元素。
  2. 识别被捕获内容的边界,包括第一个和最后一个可聚焦项目。
  3. 删除被识别为可聚焦但不在该被捕获内容集内的任何内容的交互性和可发现性。
  4. 将焦点移动到被捕获的内容中。
  5. 侦听表示关闭被捕获内容的事件(保存、取消、关闭/按下Esc键等)。
  6. 当相关事件触发时,关闭被捕获的内容区域。
  7. 恢复先前删除的交互性。
  8. 将焦点移回触发被捕获内容的交互式元素。

为什么我们要这样做?

我不会撒谎:所有这些都很棘手且耗时。但是,焦点管理和合理、可用的焦点顺序是Web内容无障碍指南。它非常重要,以至于它被认为是关于可用性的国际、具有法律约束力的标准的一部分。

可Tab键操作和可发现性

删除可发现性和交互性都有一些技巧。

屏幕阅读器有一种交互模式,允许它们通过虚拟光标浏览页面或视图。虚拟光标还允许使用屏幕阅读器的人发现页面的非交互式部分(标题、列表等)。与使用Tab键和焦点样式不同,虚拟光标仅适用于使用屏幕阅读器的人。

当您管理焦点时,您可能希望限制虚拟光标发现内容的能力。对于我们的模态框示例,这意味着防止用户在阅读模态框时意外“跳出”模态框的边界。

可发现性可以通过明智地应用aria-hidden="true"来抑制。但是,交互性则更为细致。

使用 inert 属性

inert属性是一个全局HTML属性,它将使删除然后恢复交互式元素的可发现性和可聚焦能力变得容易得多。以下是如何使用它的示例:

 <div aria-labelledby="modal-title" role="dialog" tabindex="-1">
  <div role="document">
   <h2 id="Save-changes">Save changes?</h2>
   <p>The changes you have made will be lost if you do not save them.</p>
<p>
    Save
    Discard
   </p>
</div>
 </div>
 <main inert="">

 </main>

由于其许多辅助技术支持问题,我故意避免在模态框中使用<dialog></dialog>元素。

在保存确认模态框后,在<main></main>元素上声明了inert。这意味着<main></main>内包含的所有内容都不能接收焦点或被点击。

焦点仅限于模态框内。当模态框被关闭时,可以从<main></main>元素中删除inert。这种处理焦点捕获的方式比现有技术要容易得多。

记住: 关闭事件可能是由我们模态框示例中的两个按钮引起的,也可能是通过按下键盘上的Esc键引起的。有些模态框还允许您点击模态框区域之外来关闭。

inert 的支持

最新版本的Edge、Chrome和Opera在启用实验性Web平台功能时都支持inert。Firefox的支持也很快就会到来!唯一例外的是台式机和移动版的Safari。

我很想看到Apple实现对inert的原生支持。虽然可以使用polyfill,但它对所有主要的屏幕阅读器都有非微不足道的支持问题。不太好!

此外,我想提请注意inert polyfill项目自述文件中的以下说明:

与原生的inert实现相比,polyfill在性能方面将非常昂贵,因为它需要大量的树遍历。

树遍历意味着polyfill中的JavaScript可能需要大量的计算能力才能工作,因此会减慢最终用户的体验。对于低功耗设备(例如预算型Android智能手机、旧款笔记本电脑)和执行计算密集型任务(例如运行多个Electron应用程序)的更强大的设备,这可能意味着会发生冻结或崩溃。原生浏览器支持意味着这种行为对设备的负担要小得多,因为它可以访问JavaScript无法访问的浏览器部分。

Safari

就我个人而言,我对Apple缺乏对inert的支持感到失望。虽然我理解向浏览器添加新功能是一项极其复杂和困难的工作,但inert似乎是一个Apple应该更早支持的功能。

macOS和iOS历来对辅助功能有很好的支持,并且辅助技术友好的功能是其营销活动中的常见部分。支持inert似乎是Apple使命的自然延伸,因为该功能本身将极大地简化可访问的Web体验的开发。

令人沮丧的是,Apple对正在开发的内容以及我们何时可以普遍预期看到它也守口如瓶。因此,inert的未来是一个悬而未决的问题。

不再包含 Igalia 部分

总结

管理焦点需要一些技巧和谨慎,但这非常值得去做。inert属性可以在很大程度上简化这一过程。

inert这样的技术也代表了Web平台最强大的优势之一:能够铺设紧急行为的牛车道并将其编纂成简单有效的东西。

进一步阅读

  • 使用tabindex控制焦点(A11ycasts,第04集)
  • 使用tabindex属性(Paciello集团)
  • 使用JavaScript在元素中捕获焦点(Hidde de Vries)

感谢Adrian Roselli和Sarah Higley的反馈。

以上是聚焦管理和惰性的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
丢失的CSS技巧cohost.org丢失的CSS技巧cohost.orgApr 25, 2025 am 09:51 AM

在这篇文章中,布莱克·莫里(Blackle Mori)向您展示了一些骇客,同时试图推动同位HTML支持的极限。如果您敢于使用这些,以免您也被标记为CSS罪犯。

光标的下一个CSS样式光标的下一个CSS样式Apr 23, 2025 am 11:04 AM

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

世界碰撞:使用样式查询的钥匙帧碰撞检测世界碰撞:使用样式查询的钥匙帧碰撞检测Apr 23, 2025 am 10:42 AM

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

使用CSS背景过滤器进行UI效果使用CSS背景过滤器进行UI效果Apr 23, 2025 am 10:20 AM

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

微笑吗?微笑吗?Apr 23, 2025 am 09:57 AM

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

'漂亮”在情人眼中'漂亮”在情人眼中Apr 23, 2025 am 09:40 AM

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

CSS-tricks编年史XLIIICSS-tricks编年史XLIIIApr 23, 2025 am 09:35 AM

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

tailwind的@Apply功能比听起来更好tailwind的@Apply功能比听起来更好Apr 23, 2025 am 09:23 AM

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显

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

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

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。