ARIA:切换角色
ARIA switch
角色在功能上与 复选框 角色相同,但它不代表“选中”和“未选中”状态(这两个状态的含义相当笼统),而是代表“开启”和“关闭”状态。
此示例创建了一个小部件,并将 ARIA switch
角色分配给它。
<button
type="button"
role="switch"
aria-checked="true"
id="speakerPower"
class="switch">
<span aria-hidden="true">off</span>
<span aria-hidden="true">on</span>
</button>
<label for="speakerPower" class="switch">Speaker power</label>
描述
ARIA switch
角色与 复选框 角色相同,只是它不是“选中”或“未选中”,而是“开启”或“关闭”。与 复选框 角色一样,aria-checked
属性是必需的。两个可能的值是 true
和 false
。与 <input type="checkbox">
或 role="checkbox"
不同,它没有“未确定”或“混合”状态。switch
角色不支持 aria-checked
属性的 mixed
值;如果将 mixed
值分配给 switch
,则会将其值设置为 false
。
辅助技术可能会选择使用专门的表示形式来表示 switch
小部件,以反映开/关开关的概念。
由于开关是一种交互式控件,因此它必须可聚焦且可通过键盘访问。如果该角色应用于不可聚焦的元素,请使用 tabindex
属性进行更改。切换开关值的预期键盘快捷键是 空格键。开发人员需要在切换开关时动态更改 aria-checked
属性的值。
所有后代都是演示性的
某些类型的用户界面组件在平台无障碍 API 中表示时,只能包含文本。无障碍 API 无法表示 switch
中包含的语义元素。为了解决此限制,浏览器会自动将角色 presentation
应用于任何 switch
元素的所有后代元素,因为这是一个不支持语义子级的角色。
例如,考虑以下 switch
元素,它包含一个标题。
<div role="switch"><h3>Title of my switch</h3></div>
由于 switch
的后代是演示性的,因此以下代码是等效的
<div role="switch"><h3 role="presentation">Title of my switch</h3></div>
从辅助技术用户的角度来看,标题不存在,因为之前的代码段在 无障碍树 中等效于以下代码
<div role="switch">Title of my switch</div>
关联的 ARIA 角色、状态和属性
aria-checked
属性-
使用
switch
角色时,aria-checked
属性是必需的,因为它表示应用了switch
角色的小部件的当前状态。true
值表示“开启”状态;false
值表示“关闭”状态;switch
角色不支持mixed
值,因此将其视为false
。 aria-readonly
属性-
aria-readonly
属性受switch
角色支持。它指示用户是否可以编辑小部件的状态。false
值表示用户可以更改小部件的状态;true
值表示用户无法更改小部件的状态。默认值为false
。
必需的 JavaScript 功能
对用户代理和辅助技术的可能影响
当 switch
角色添加到元素中时,用户代理 会以以下方式处理它
- 该元素在系统的无障碍基础结构中公开,具有
switch
角色。 - 当
aria-checked
属性的值发生变化时,如果可用,并且支持switch
角色,系统会使用系统的无障碍 API 触发一个可访问的事件。 - 所有作为具有应用了
switch
角色的元素的后代的元素,都会自动分配presentation
角色。这可以防止用于构建开关的元素被辅助技术单独交互。这些元素中的文本对于用户代理仍然可见,并且可能会被读取或以其他方式传递给用户,除非它使用display: none
或aria-hidden="true"
明确隐藏。
如果辅助技术支持 switch
角色,它会通过执行以下操作来响应
- 屏幕阅读器应将元素宣布为开关,可以选择提供有关如何激活开关的说明。
注意:关于辅助技术如何处理此角色存在不同的观点;以上是一种建议的做法,可能与其他来源不同。
示例
以下示例将帮助您了解如何应用和使用 switch
角色。
在 ARIA 中添加开关角色
这个简单的示例只是创建一个部件并为其分配 ARIA switch
角色。按钮的样式类似于开/关电源开关。
HTML
这里的 HTML 非常简单。开关实现为一个 <button>
元素,该元素最初被选中,因为其 aria-checked
属性被设置为 "true"
。开关有两个子元素,包含“关闭”和“打开”标签,并且后面跟着一个 <label>
来标识开关。
<button role="switch" aria-checked="true" id="speakerPower" class="switch">
<span>off</span>
<span>on</span>
</button>
<label for="speakerPower" class="switch">Speaker power</label>
JavaScript
这段 JavaScript 代码定义并应用一个函数来处理开关部件上的点击事件。该函数将 aria-checked
属性从 true
更改为 false
,反之亦然。
document.querySelectorAll(".switch").forEach((theSwitch) => {
theSwitch.addEventListener("click", handleClickEvent, false);
});
function handleClickEvent(evt) {
const el = evt.target;
if (el.getAttribute("aria-checked") === "true") {
el.setAttribute("aria-checked", "false");
} else {
el.setAttribute("aria-checked", "true");
}
}
CSS
CSS 的目的是为开关建立一种外观,让人想起电源开关的范式。
button.switch {
margin: 0;
padding: 0;
width: 70px;
height: 26px;
border: 2px solid black;
display: inline-block;
margin-right: 0.25em;
line-height: 20px;
vertical-align: middle;
text-align: center;
font:
12px "Open Sans",
"Arial",
serif;
}
button.switch span {
padding: 0 4px;
pointer-events: none;
}
[role="switch"][aria-checked="false"] :first-child,
[role="switch"][aria-checked="true"] :last-child {
background: #262;
color: #eef;
}
[role="switch"][aria-checked="false"] :last-child,
[role="switch"][aria-checked="true"] :first-child {
color: #bbd;
}
label.switch {
font:
16px "Open Sans",
"Arial",
sans-serif;
line-height: 20px;
vertical-align: middle;
user-select: none;
}
最有趣的部分可能是属性选择器和 :first-child
和 :last-child
伪类的使用,它们负责根据开关是打开还是关闭来更改开关的外观。
结果
结果如下所示
规范
规范 |
---|
可访问的富互联网应用程序 (WAI-ARIA) # switch |
ARIA in HTML # index-aria-switch |