AOM(Accessibility Object Model 无障碍对象模型)草案解读

本文介绍了无障碍对象模型(AOM)的概念,它提供了JavaScript API以修改HTML的可访问性树。AOM使得开发者能直接设置元素的ARIA属性,简化了无障碍功能的实现,并引入了ElementInternals、无障碍事件和虚拟无障碍节点等特性。文章还涵盖了各浏览器对AOM的支持情况。
摘要由CSDN通过智能技术生成

最近在看 AOM(Accessibility Object Model) 相关的草案,草案推出一两年了,发现还没有相关的中文文档或者博客谈到这个,看来国内做的人还是太少了,一般也只有大厂会去跟进这一块。下面我就介绍 AOM 相关的特性,内容主要翻译自草案,也会加上自己的一些理解,同时复现草案中的一些 Demo。

名词释义:下文中的无障碍指 Accessibility,可访问性指 Accessiable。

什么是 AOM

AOM(Accessibility Object Model),直译过来就是无障碍对象模型。AOM 提供了一系列的 JavaScript API,允许开发人员修改 HTML 页面的可访问性树(Accessibility Tree),换句话说:它允许开发者直接访问可访问性树。

这是什么意思呢?举个简单的例子,如果需要为一个 <div> 添加一个 role="button" 的属性,以往的做法是使用 setAttribute 设置相关属性:

el.setAttribute("role", "button")

而有了 AOM,我们可以更加直接地设置它的 role 属性:

el.role = "button"

上面两种写法的渲染出来的 DOM 结构是相同的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQj8QpdR-1596977616340)(https://imgkr2.cn-bj.ufileos.com/8c82e5b9-f0f7-42a7-9553-1583fdafdbb6.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=R1SL4qakZzob3smWGSQvSyzBalM%253D&Expires=1597062901)]

也就是说,除了现有的 DOM 方法(如setAttribute和getAttribute)之外,可访问性的相关属性有了自己的API,这些 API 设置 并计算成可访问性树的属性值。有了对可访问性信息的直接访问,我们可以在不做标记,也就是不设置标签属性的情况下,设置可访问性属性。另外,也可以为DOM中不存在的东西(比如画布元素的内容)创建可访问性树,测试可访问性可能会得到改善。

这张图很好的解释了 AOM 的渲染过程,DOM 树被翻译成页面的主要视觉和可访问性树,而可访问性树又可以通过一个或多个平台特定的可访问性 API 来访问。

浏览器启用 AOM

Chorme

在地址栏输入 chrome://flags,然后启用 enable-experimental-web-platform-features

Safari

Develop > Experimental Features > Accessibility Object Model

Firefox

about:config accessibility.AOM.enabled = true

AOM 特性

AOM 目前是由 Mozilla、Google 和苹果公司的人员共同提出的,下面先总结一下它的特点。

简化属性

当我们为一些普通的控件添加无障碍功能时,可能需要维护大量的属性。即使是一个简单的禁用按钮,就可能需要使用到 rolearia-label 以及 aria-disabled 等属性。如果状态多了,可能还需要添加更多的属性,这些属性通常需要手动添加,如果属性多的话会变得难以维护。

为了解决这个问题,AOM将允许开发者直接在 JavaScript 中设置元素的可访问性属性。例如,如果要对一个元素设置 aria-expanded,你可以直接在该元素上进行设置。

el.ariaExpanded = true;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCaOWpNe-1596977616345)(https://imgkr2.cn-bj.ufileos.com/96a19c44-61a4-4888-996e-ed8c6235f177.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=YB0dirDUj6VGJO1ycDUch6h55L4%253D&Expires=1597062976)]

而在以前,我们需要通过切换标记中的属性值来设置属性。

el.setAttribute("aria-expanded", true)

在 AOM 中,ARIA 属性集将作为 DOM 的属性存在,在 ARIA 1.2 规范中可以找到其 IDL 定义。

当然, 在使用 React 或者 Vue 在内的一些具有虚拟 DOM 的框架时,框架会建议不要直接修改 DOM,让框架来处理 DOM 的变化。在这种应用中,你可以仍在标签中定义相关的无障碍语义属性。针对这种情况,草案也提出了 ElementInternals

ElementInternals

对于自定义组件来说,草案建议开发者通过 ElementInternals 对象提供默认语义。开发者可以使用 ElementInternals 对象来修改自定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值