ARIA 是 Accessible Rich Internet Applications 的缩写。它是 W3C 的 Web 无障碍推进组织 Web Accessibility Initiative / WAI 在2014年3月20日发布的可访问富互联网应用实现指南。2017年11月2日,发布了 WAI-ARIA 1.1 的提案推荐标准,在1.0版本的基础上,添加了一些新机制,使 HTML + ARIA 无障碍模型更加完整,并支持图形及数字出版的无障碍需求。
- 几种场景
- 一个由 js 生成的页面
- 一个不支持鼠标的页面
- 一个不支持键盘的页面
- 一部没有字幕的电影
- 两组数据
- 全球目前有超过10亿残疾人 占全球人口约15%
- 全球网民数量突破30亿约占总人口42%
以上这种场景的对于一个视觉或者听觉有障碍的人来说还能正常访问吗?这就是要 WAI-ARIA 的目的。WAI-ARIA 适用于跨越某些领域的障碍,这些领域存在的无障碍问题无法通过原生 HTML 进行管理。它通过允许您指定某些属性来发挥作用,这些属性可以修改元素转换成无障碍树的方式。
ARIA 是怎么做的
ARIA属性可以被 NVDA 等读屏软件调用系统API识别, 转化成语音。
例如我们使用列表项作为一种自定义复选框
1 | <li class="checkbox" checked> |
正常的人是能正确识别的,但是屏幕阅读器却不会给予任何指示来说明该元素旨在作为复选框使用,因此弱视用户可能会完全错过该元素。
如果使用 ARIA 属性,我们就可以为元素提供缺少的信息,以便屏幕阅读器能正确解读它。 我们在以上代码中添加了 role 和 aria-checked 属性,将该元素显式标识为一个复选框,并指定它在默认情况下处于选中状态。该列表项现在将添加到无障碍树中,屏幕阅读器将把它正确地报告为一个复选框。
1 | <li class="checkbox" role="checkbox" checked aria-checked="true"> |
ARIA 通过更改和补充标准 DOM 无障碍树来发挥作用。并且尽可能正确地使用 html 标签,原生标签对 ARIA 支持得更好。在实再自定义控件的时候,添加 ARIA 相关属性可以例控件能正确被读屏软件识别。 html5 语义化标签与 ARIA 有重叠的地方,用新的语义化标签但还是推荐添加 ARIA 属性。
例如上面的自定义复选框,标准 HTML 元素都不需要额外的 role=”checkbox” ARIA 属性就能正确声明。
ARIA on HTML
ARIA on HTML 中使用有其自己的规范,在 这个 网站可以检测 ARIA 使用的是否标准。
ARIA 属性包括三个方面:角色属性值(roles), 状态属性值(states), 和属性表(properties) 参考网站: W3C
浏览器支持情况参见 caniuse
HTML5 元素有的不应该重新定义一个添加ARIA
如果你使用的元素(HTML5)具有语义化,应该使用这些元素,而不应该重新定义一个添加ARIA的角色、状态或属性的元素。
下面以 role=heading 一个上button元素。这是不允许的,因为该 button 元素具有默认特征与标题角色冲突。
1
<button role="heading">search</button>
哪些情况下可以使用?
- 在HTML(HTML5)元素特性不管支持或不支持,只要不具语义化,就可以使用ARIA
- 排除视觉设计约束使用一个特定的元素,但不能是样式上所需的元素
- 目前尚不支持的HTML特性
规所有的ARIA制作控件都必须具有键盘 (keyboard) 事件。
ARIA role的必需属性不可省略
正确
1
<span role="checkbox" aria-checked="false" aria-labelledby="foo" tabindex="0"></span>
错误
1
<span role="checkbox" aria-labelledby="foo" tabindex="0"></span>
具有ARIA role的元素必须在正确的范围内
正确
1
2
3
4
5<div role="list">
<span role="listitem">Rainbow Trout</span>
<span role="listitem">Brook Trout</span>
<span role="listitem">Lake Trout</span>
</div>错误
1
2
3
4
5<div>
<span role="listitem">Rainbow Trout</span>
<span role="listitem">Brook Trout</span>
<span role="listitem">Lake Trout</span>
</div>
ARIA 在 HTML 中由组成
ARIA 在 HTML 中由两部分组成,一个 role ,表示元素的作用;一个是 aria- 表示元素的属性或状态。
- role
| role值 | 含义 | role值 | 含义 | role值 | 含义 |
|---|---|---|---|---|---|
| alert | 警告 | alertdialog | 警告框 | application | 应用 |
| button | 按钮 | checkbox | 复选框 | grid | 网格 |
| gridcell | 网格单元 | group | 组合 | heading | 应用程序标题 |
| listbox | 列表框log 日志 | menu | 菜单 | treeitem | 树结构选项 |
| menubar | 菜单栏 | menuitem | 菜单项 | menuitemcheckbox | 可复选的菜单项 |
| menuitemradio | 只能单选的菜单项 | option | 选项 | presentation | 陈述 |
| progressbar | 进度条 | radio | 单选 | radiogroup | 单选按钮组 |
| region | 区域row 行 | separator | 分割 | tree | 树形 |
| slider | 滑动条 | spinbutton | 微调 | tab | tab标签 |
| tablist | 标签列表 | tabpanel | 标签面板 | timer | 计数 |
| toolbar | 工具栏 | tooltip | 提示文本 |
aria 属性或状态
aria-label
- 视觉上能理解,读屏软件不能理解的可以用 aria-label,和 img alt 属性效果相同。
- placeholder 不能被读屏软件识别,如果不带 label 的 form 表单,需要用 aria-label标注。个人测试 iOS10 上 VoiceOver 是可以读 placeholder ,如果两个属性同时存在会先读 aria-label 后读 placeholder ,chrome 插件的 Accessibility Developer Tools 不识别 placeholder。
aria-hidden
隐藏元素的一些对比
| 方法 | 行为 | 读屏软件行为 | 兼容性 |
|---|---|---|---|
| CSS:visibility:hidden; | 从视觉中隐藏元素,但其原始空间仍然被占用(很像opacity:0) | 不可读 | 兼容性好 |
| CSS: display:none; | 从视觉中隐藏元素,它的原始空间丢失,下一个元素将取代它的位置 | 不可读 | 兼容性好 |
| HTML5: hidden属性 | 类似display:none | 不可读 | IE11+ |
| aria-hidden = “true” | 内容显示在浏览器,但读屏软件不可读 | 不可读 | IE11+ |
| CSS: .visuallyHidden类 | 视觉不显示,工作流不存在 | 可读 | 兼容性好 |
- aria-pressed
表示按下的状态,可选值有:true, false, mixed, undfined.默认为undfined, 表示按下状态未知;true表示元素往下(按钮按下);false表示元素抬起;mixed表示元素同时有按下和没有按下的状态
1
<div role="button" tabindex="0" aria-pressed="false" aria-disabled="false"></div>
- aria-selected
表示选择状态,可选值有:true, false, undefined。 默认为undefined,表示元素选择状态未知;true表示元素已选择;false表示未被选中。
1
2
3
4
<ul class="tablist" role="tablist">
<li role="tab" aria-selected="true" tabindex="0">中国</li>
<li role="tab" aria-selected="false" tabindex="-1">美国</li>
</ul>