ARIA: checkbox 角色
checkbox 角色用于可交互的选中控件。包含 role="checkbox" 的元素还必须包含 aria-checked 属性,以向辅助技术公开复选框的状态。
<span
role="checkbox"
aria-checked="false"
tabindex="0"
aria-labelledby="chk1-label"></span>
<label id="chk1-label">Remember my preferences</label>
注意: ARIA 的第一条规则是:如果原生 HTML 元素或属性具有您所需的语义和行为,请使用它,而不是重新用途化元素并添加 ARIA。请改用原生的 HTML 复选框 <input type="checkbox">(带有相关的 <label>),它本身就提供了所有必需的功能。
<input type="checkbox" id="chk1-label" name="RememberPreferences" />
<label for="chk1-label">Remember my preferences</label>
描述
原生的 HTML 复选框(<input type="checkbox">)表单控件有两种状态(“选中”或“未选中”),并且可以通过 JavaScript 设置 indeterminate 状态。类似地,具有 role="checkbox" 的元素可以通过 aria-checked 属性公开三种状态:true、false 或 mixed。
由于复选框是交互式控件,因此它必须是可聚焦且键盘可访问的。如果将该角色应用于不可聚焦的元素,请使用 tabindex 属性进行更改。激活复选框的预期键盘快捷键是 空格键。
开发者在激活复选框时,必须动态更改 aria-checked 属性的值。
所有后代都是展示性的
某些类型的用户界面组件,当它们在平台辅助功能 API 中表示时,只能包含文本。辅助功能 API 无法表示 checkbox 中包含的语义元素。为了解决此限制,浏览器会自动将 presentation 角色应用于任何 checkbox 元素的全部后代元素,因为它是一个不支持语义子元素的角色。
例如,考虑以下包含标题的 checkbox 元素:
<div role="checkbox"><h6>Name of my checkbox</h6></div>
由于 checkbox 的后代元素是表现性的,因此以下代码等效:
<div role="checkbox"><h6 role="presentation">Name of my checkbox</h6></div>
从辅助技术用户的角度来看,标题不存在,因为前面的代码片段在辅助功能树中等同于以下内容:
<div role="checkbox">Name of my checkbox</div>
关联的 WAI-ARIA 角色、状态和属性
aria-checked-
aria-checked的值定义了复选框的状态。此属性有三个可能的值之一: tabindex="0"-
用于使其可聚焦,以便辅助技术用户可以制表到它并立即开始阅读。
键盘交互
| 键 | Function |
|---|---|
| 空格 | 激活复选框 |
必需的 JavaScript
所需的事件处理程序
示例
以下示例使用 CSS 和 JavaScript 创建了一个原本无语义的复选框元素,以处理元素的选中或未选中状态。
HTML
<span
role="checkbox"
id="chkPref"
aria-checked="false"
tabindex="0"
aria-labelledby="chk1-label"></span>
<label id="chk1-label">Remember my preferences</label>
CSS
[role="checkbox"] {
padding: 5px;
}
[role="checkbox"]:focus {
border: 2px solid #0198e1;
}
[aria-checked="true"]::before {
content: "[x]";
}
[aria-checked="false"]::before {
content: "[ ]";
}
JavaScript
const item = document.getElementById("chkPref");
const label = document.getElementById("chk1-label");
function changeCheckbox(code) {
const checked = item.getAttribute("aria-checked");
if (code && code !== "Space") {
return;
}
if (checked === "true") {
item.setAttribute("aria-checked", "false");
} else {
item.setAttribute("aria-checked", "true");
}
}
item.addEventListener("keydown", (event) => {
changeCheckbox(event.code);
});
label.addEventListener("keydown", (event) => {
changeCheckbox(event.code);
});
item.addEventListener("click", changeCheckbox);
label.addEventListener("click", changeCheckbox);
可访问性考虑
当 checkbox 角色添加到元素时,用户代理应执行以下操作:
- 在操作系统辅助功能 API 中将该元素公开为具有
checkbox角色。 - 当
aria-checked值更改时,发送辅助功能状态更改事件。
辅助技术产品应执行以下操作:
- 屏幕阅读器应将该元素宣布为复选框,并可选择提供有关如何激活它的说明。
实现复选框的人员应执行以下操作:
- 确保可以使用键盘控件和鼠标单击来访问和交互复选框。
- 在用户交互后,使
aria-checked属性保持最新。 - 提供指示复选框何时获得焦点的样式。
注意: 关于辅助技术应如何处理此技术的意见可能有所不同。以上提供的信息是其中一种观点,可能会发生变化。
最佳实践
ARIA 的第一条规则是:如果原生 HTML 元素或属性具有您所需的语义和行为,请使用它,而不是重新用途化元素并添加 ARIA 角色、状态或属性来使其可访问。因此,建议使用原生的 HTML 复选框 表单控件,而不是使用 JavaScript 和 ARIA 来重新创建复选框的功能。