You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
6.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# HTML·ARIA可访问性是只给盲人用的特性么
你好我是winter。
我们都知道HTML已经是一个完整的语义系统。在前面的课程中我们围绕着HTML本身做了讲解但是在实际应用中我们还会用到一些它的扩展。今天我们要讲的ARIA就是其中重要的一部分。
ARIA全称为Accessible Rich Internet Applications它表现为一组属性是用于可访问性的一份标准。关于可访问性它被提到最多的就是它可以为视觉障碍用户服务但是这是一个误解。
实际上,可访问性其实是一个相当大的课题,它的定义包含了各种设备访问、各种环境、各种人群访问的友好性。不单单是永久性的残障人士需要用到可访问性,健康的人也可能在特定时刻处于需要可访问性的环境。
我们今天讲的ARIA是以交互形式来标注各种元素的一类属性所以在ARIA属性中你可以看到很多熟悉的面孔交互形式往往跟我们直觉中的“控件”非常相似。
所以我们的课程特意把ARIA加入还有一个原因ARIA的角色对于我们UI系统的设计有重要的参考意义。
## 综述
我们先整体来看看ARIA给HTML元素添加的一个核心属性就是role我们来看一个例子
```HTML
<span role="checkbox" aria-checked="false" tabindex="0" aria-labelledby="chk1-label">
</span> <label id="chk1-label">Remember my preferences</label>
```
这里我们给一个span添加了checkbox角色这样表示我们这个span被用于checkbox这意味着我们可能已经用JS代码绑定了这个span的click事件并且以checkbox的交互方式来处理用户操作。
同时ARIA系统还提供了一系列ARIA属性给checkbox这个role这意味着**我们可以通过HTML属性变化来理解这个JavaScript组件的状态**读屏软件等三方客户端就可以理解我们的UI变化这正是ARIA标准的意义。
role的定义是一个树形的继承关系我们先来理解一下它的整体结构
![](https://static001.geekbang.org/resource/image/ae/69/aeccf64871b309735054912fbbb18a69.jpg)
其中widget表示一些可交互的组件structure表示文档中的结构window则代表窗体。
接下来让我们分类了解一下重要的ARIA角色。
## Widget角色
我们刚刚已经讲过一个widget role就是checkbox。
这一类角色跟我们桌面开发中的控件类似,它表示一个可交互的组件,它们有:
![](https://static001.geekbang.org/resource/image/10/dd/10ea9eb62d60fb4bfb18c27da50836dd.jpg)
我们这里按照继承关系给出一份列表和简要说明:
![](https://static001.geekbang.org/resource/image/03/f1/038e1152c9bddc7ed864d271691d17f1.jpeg)
ARIA role允许多继承这里有些角色我没有重复写。
注意这些role可以出现在任何一个HTML元素之上同时要注意这些ARIA属性不会真实地改变任何一个元素的行为比如我们刚才讲的checkbox即使我们给一个span添加了Checkbox角色我们也需要用JavaScript编写相应的逻辑。
这些widget同时还会带来对应的ARIA属性比如我们的Checkbox角色会带来两个属性
* aria-checked 表示复选框是否已经被选中;
* aria-labelledby 表示复选框对应的文字。
而Button角色则会带来另外两个属性
* aria-pressed 按钮是否已经被按下;
* aria-expanded 按钮控制的目标是否已经被展开。
除了它们本身的属性之外可交互组件还有继承来的属性比如switch角色继承了checkbox因此它也可以使用aria-checked属性。
在WAI-ARIA标准中你可以找到所有的角色和对应的属性我们这里就不一一列举了。
* [https://www.w3.org/TR/wai-aria/](https://www.w3.org/TR/wai-aria/)
很多这些ARIA属性都是需要在JavaScript中维护的。
如果我们要实现一份组件库这些widget role和它们对应的aria属性是非常好的参考。
如果你是组件的实现者也希望你在实现组件时把对应的ARIA属性自动维护好。
除了简单的widget还有一些比较复杂的角色需要多个角色一起配合。我们来逐个了解一下。
Combobox 是一个带选项的输入框,我们常见的搜索引擎,一般都会提供这样的输入框,当输入时,它会提供若干提示选项。
Grid 是一个表格,它会分成行、列,行列又有行头和列头表示行、列的意义。
Tablist 是一个可切换的结构一般被称为选项卡它包含了tab头和tabpanel在tab容器中可能包含各种组件。
Listbox 是一个可选中的列表它内部具有角色为Option的选项。
Menu 是指菜单菜单中可以加入嵌套的菜单项Menuitem角色除了普通菜单项还可以有Menuitemcheckbox 带复选框的菜单栏和Menuitemradio 带单选框的菜单栏。
Radiogroup 是一组互斥的单选框的容器它的内部可以由若干个角色为radio的单选框。
Tree 是树形控件,它的内部含有 Treeitem 树形控件项它还有一种升级形式是Treegrid。
## structure角色
结构角色其实跟HTML5中不少新标签作用重合了这里建议优先使用HTML5标签。
这部分角色的作用类似于语义化标签,但是内容稍微有些不同,我们这里就不详细讲解了,仅仅给出一张图供你参考:
![](https://static001.geekbang.org/resource/image/b2/7a/b21a82fd68a885f751123f48a7e26b7a.jpg)
separator在允许焦点时属于组件在不允许焦点时属于文档结构。
这里我们需要特别提出Landmark角色这个概念Landmark角色直接翻译是地标它是ARIA标准中总结的Web网页中最常见的8个结构Landmark角色实际上是section的子类这些角色在生成页面摘要时有很大可能性需要被保留它们是
![](https://static001.geekbang.org/resource/image/9a/75/9aee7029d4bf684a8679a6776d6e9075.jpg)
## window角色
在我们的网页中有些元素表示“新窗口”这时候会用到window角色。window系角色非常少只有三个角色
* window
* dialog
* alertdialog
dialog可能会产生“焦点陷阱”也就是说当这样的角色被激活时焦点无法离开这个区域。
## 总结
今天我介绍了ARIA相关的知识我们分几个部分学习了如何使用ARIA属性来提高页面的可访问性。
我们以ARIA角色为中心讲解了ARIA定义的语义体系。我们可以把ARIA分为三类。
* Widget角色主要是各种可交互的控件。
* 结构角色:文档的结构。
* 窗体角色:弹出的窗体。
今天的课后小问题是请找一个支持图结构可视化的JS库把所有ARIA的继承关系用可视化的方式展现出来。