Open anjia opened 5 years ago
ARIA,Accessible Rich Internet Applications,可访问的富 Internet 应用程序。
ARIA 属于可访问性语义的范畴。从功能上来说,ARIA 的 roles、states 和 properties 类似于辅助技术的 CSS。对屏幕阅读器而言,ARIA 控制着它们的非视觉体验的渲染。
举个例子:这段 HTML 代码
<button>保存</button>
屏幕阅读器会读成:
如果按钮是用<span>标签模拟的,即:
<span>
<span>保存</span>
此时,屏幕阅读器就不认识它了。若想告诉屏幕阅读器这个 HTML 元素也是一个“按钮”,则需要指定元素的 ARIA role。如下:
<span tabindex="0" role="button">保存</span>
此时,屏幕阅读器也会读成:
我们注意到,HTML 代码里还有一个属性tabindex="0",它表示该元素是可聚焦的,是可以通过键盘访问到的(更多内容请查阅 tabindex)。
tabindex="0"
与此相比,<button>保存</button>没写tabindex="0"却可以被键盘访问到,也可以被屏幕阅读器识别,这是因为 HTML 内置了这些功能。自带键盘可访问性的标签有<a>、<button>、<label>以及表单元素。键盘可访问包括按 tab 键能让页面中的元素获得焦点、按 Return/Enter 键能激活该元素、表单元素<select>在获得焦点时按方向键可以上下切换选项。
<a>
<button>
<label>
<select>
所以,在使用 ARIA 时,我们要做的就是:
作为《ARIA 实践指南》系列文章的第一篇,本文就先介绍两种最基本的控件:链接和按钮。
role="link" 提供一个超链接,可以是其它页面、网页内锚点、文件、邮箱、电话等。
role="link"
键盘交互:
enter
在日常开发中,一般不用其它 HTML 标签去模拟超链接,而是直接使用原生的<a>,这是因为浏览器一般都会自带一些有价值的功能,比如在新窗口中打开目标、将目标URL复制到系统剪贴板等。
考虑到使用 ARIA 模拟链接的场景少之又少,此处就不展开介绍了。
role="button" 允许用户触发一个事件或者操作,比如提交表单、打开对话框、执行删除操作。如果激活按钮是打开对话框,那按照惯例,按钮的文案后面常跟着“...”,比如“另存为...”,文件的“浏览...”。
role="button"
除了普通按钮之外,ARIA 还支持另外两种类型的按钮:
aria-pressed
menu
true
ARIA 相关:
aria-label="labelText"
aria-labelledby="IDREF"
aria-describedby="IDREF"
aria-disabled="true"
aria-pressed="true|false"
如果按钮是<div>或<span>模拟的,则还需要设置tabindex="0";如果是用没有href属性的<a>模拟的,也需要设置tabindex="0".
<div>
href
space
用<div>模拟一个打印按钮
<div tabindex="0" role="button" id="btnPrint">打印页面</div>
在 HTML 里设置了tabindex="0",指定了 ARIA 的 role="button",确保屏幕阅读器能识别该元素。
键盘交互,需要支持按space键和enter键能触发打印对话框。由于打印对话框是浏览器自带的,所以此时,我们就不用手动管理对话框打开之后键盘焦点的移动行为了。
JS 代码如下:
let btnPrint = document.getElementById('btnPrint') // 鼠标访问:click btnPrint.addEventListener('click', () => { window.print() }) // 键盘访问:keydown btnPrint.addEventListener('keydown', (e) => { switch(e.keyCode){ case 32: // space e.preventDefault() // 默认会滚动页面 break; case 13: // enter e.preventDefault() window.print() // enter 键的激活时机是在 keydown break; } }) // 键盘访问:keyup btnPrint.addEventListener('keyup', (e) => { // space 键, if(e.keyCode === 32){ e.preventDefault() window.print() // space 键的激活时机是在 keyup } })
此时,按space键或者enter键,均可打开打印对话框。且焦点会默认定位在对话框里的某个可聚焦元素上,具体定位到哪个元素是由对话框自己管理的。在打印对话框里,焦点默认定位在了“Save”按钮上(:focus时有蓝色的box-shadow)。
:focus
box-shadow
用<span>模拟一个静音按钮,HTML 和 CSS 代码如下:
<style> #btnMute { display: inline-block; padding: .3em .8em .4em 2em; border: 1px solid; background-repeat: no-repeat; background-position: .8em center; background-size: auto 1em; } #btnMute[aria-pressed="false"] { background-image: url(https://s4.ssl.qhres.com/static/ceaad449f261254b.svg); } #btnMute[aria-pressed="true"] { background-image: url(https://s1.ssl.qhres.com/static/f991a555e87bdbdd.svg); } </style> <span tabindex="0" role="button" aria-pressed="false" id="btnMute">静音</span>
以上代码,在 HTML 里给<span>元素设置了三个属性
aria-pressed="false"
当aria-pressed="false"时,UI 和 屏幕阅读器的阅读文案分别是:
当aria-pressed="true"时,分别是:
aria-pressed="true"
接下来,就是编写 JS,以让按钮支持space键和enter键。代码如下:
let btnMute = document.getElementById('btnMute') // 鼠标访问:click btnMute.addEventListener('click', toggleMutePressed) // 键盘访问:keydown btnMute.addEventListener('keydown', (e) => { switch(e.keyCode){ case 32: e.preventDefault() break; case 13: e.preventDefault() toggleMutePressed() break; } }) // 键盘访问:keyup btnMute.addEventListener('keyup', (e) => { if(e.keyCode === 32){ e.preventDefault() toggleMutePressed() } }) function toggleMutePressed(){ let isPressed = btnMute.getAttribute('aria-pressed') === 'true' btnMute.setAttribute('aria-pressed', isPressed ? 'false' : 'true') }
此时,当按space键或者enter键时,静音按钮会在“开启-关闭”这两种状态间来回切换。
本文介绍了:
aria-label="text"
https://www.w3.org/TR/wai-aria-practices-1.1
ARIA
ARIA,Accessible Rich Internet Applications,可访问的富 Internet 应用程序。
ARIA 属于可访问性语义的范畴。从功能上来说,ARIA 的 roles、states 和 properties 类似于辅助技术的 CSS。对屏幕阅读器而言,ARIA 控制着它们的非视觉体验的渲染。
举个例子:这段 HTML 代码
屏幕阅读器会读成:
如果按钮是用
<span>
标签模拟的,即:此时,屏幕阅读器就不认识它了。若想告诉屏幕阅读器这个 HTML 元素也是一个“按钮”,则需要指定元素的 ARIA role。如下:
此时,屏幕阅读器也会读成:
我们注意到,HTML 代码里还有一个属性
tabindex="0"
,它表示该元素是可聚焦的,是可以通过键盘访问到的(更多内容请查阅 tabindex)。与此相比,
<button>保存</button>
没写tabindex="0"
却可以被键盘访问到,也可以被屏幕阅读器识别,这是因为 HTML 内置了这些功能。自带键盘可访问性的标签有<a>
、<button>
、<label>
以及表单元素。键盘可访问包括按 tab 键能让页面中的元素获得焦点、按 Return/Enter 键能激活该元素、表单元素<select>
在获得焦点时按方向键可以上下切换选项。我们要做的
所以,在使用 ARIA 时,我们要做的就是:
作为《ARIA 实践指南》系列文章的第一篇,本文就先介绍两种最基本的控件:链接和按钮。
链接
role="link"
提供一个超链接,可以是其它页面、网页内锚点、文件、邮箱、电话等。键盘交互:
enter
:链接跳转,并将焦点移到链接目标处在日常开发中,一般不用其它 HTML 标签去模拟超链接,而是直接使用原生的
<a>
,这是因为浏览器一般都会自带一些有价值的功能,比如在新窗口中打开目标、将目标URL复制到系统剪贴板等。考虑到使用 ARIA 模拟链接的场景少之又少,此处就不展开介绍了。
按钮
role="button"
允许用户触发一个事件或者操作,比如提交表单、打开对话框、执行删除操作。如果激活按钮是打开对话框,那按照惯例,按钮的文案后面常跟着“...”,比如“另存为...”,文件的“浏览...”。除了普通按钮之外,ARIA 还支持另外两种类型的按钮:
aria-pressed
了menu
或者true
,那么辅助技术会视此按钮为菜单按钮(会在后续章节里介绍)ARIA 相关:
role="button"
aria-label="labelText"
aria-labelledby="IDREF"
aria-describedby="IDREF"
aria-disabled="true"
表示按钮禁用aria-pressed="true|false"
表示是切换按钮如果按钮是
<div>
或<span>
模拟的,则还需要设置tabindex="0"
;如果是用没有href
属性的<a>
模拟的,也需要设置tabindex="0"
.键盘交互:
space
键或者enter
键激活按钮例子1:普通按钮
用
<div>
模拟一个打印按钮在 HTML 里设置了
tabindex="0"
,指定了 ARIA 的role="button"
,确保屏幕阅读器能识别该元素。键盘交互,需要支持按
space
键和enter
键能触发打印对话框。由于打印对话框是浏览器自带的,所以此时,我们就不用手动管理对话框打开之后键盘焦点的移动行为了。JS 代码如下:
此时,按
space
键或者enter
键,均可打开打印对话框。且焦点会默认定位在对话框里的某个可聚焦元素上,具体定位到哪个元素是由对话框自己管理的。在打印对话框里,焦点默认定位在了“Save”按钮上(:focus
时有蓝色的box-shadow
)。例子2:切换按钮
用
<span>
模拟一个静音按钮,HTML 和 CSS 代码如下:以上代码,在 HTML 里给
<span>
元素设置了三个属性tabindex="0"
元素可聚焦,也让屏幕阅读器能捕获到它role="button"
告诉屏幕阅读器,它是一个按钮aria-pressed="false"
告诉屏幕阅读器,它是一个切换按钮。初始状态,未开启当
aria-pressed="false"
时,UI 和 屏幕阅读器的阅读文案分别是:当
aria-pressed="true"
时,分别是:接下来,就是编写 JS,以让按钮支持
space
键和enter
键。代码如下:此时,当按
space
键或者enter
键时,静音按钮会在“开启-关闭”这两种状态间来回切换。小结
本文介绍了:
enter
键role="button"
aria-pressed="false"
和aria-disabled="true"
aria-label="text"
和aria-labelledby="IDREF"
、aria-describedby="IDREF"
tabindex="0"
、按钮被激活后的焦点设置(取决于具体的操作)enter
键和space
键主要参考
https://www.w3.org/TR/wai-aria-practices-1.1