我需要在内部应用程序的标题中创建一个 switch 元素,让您可以在两个用户角色之间切换。其余内容是根据所选角色呈现的——例如,角色 A 和角色 B 有不同的导航项和操作。同样重要的是要注意更改角色会使页面重新加载。
到目前为止,我无法仅使用输入(复选框/收音机)或按钮找到可访问的解决方案,因此我将这两种想法结合在一起(请忽略按钮的样式,仅用于演示目的):
var button = document.querySelector('button');
var inputRoleA = document.getElementById("role-A");
var inputRoleB = document.getElementById("role-B");
button.addEventListener('click', function(event) {
if (inputRoleA.checked) {
inputRoleA.checked = false;
inputRoleB.checked = true;
button.innerText = 'Role B';
button.classList.remove('selected-role-A');
button.classList.add('selected-role-B');
// AJAX call to server and page reload
} else {
inputRoleA.checked = true;
inputRoleB.checked = false;
button.innerText = 'Role A';
button.classList.add('selected-role-A');
button.classList.remove('selected-role-B');
// AJAX call to server and page reload
}
});
fieldset {
border: none;
}
.sr-only {
position: absolute;
left: -10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
input:focus ~ button {
outline: 2px solid blue;
}
button {
width: 120px;
padding: 4px 2px;
background: #4a6a9e;
border: 1px solid white;
border-radius: 16px;
color: white;
font-size: 18px;
cursor: pointer;
}
.selected-role-A {
text-align: left;
}
.selected-role-B {
text-align: right;
}
.selected-role-A::before,
.selected-role-B::after {
content: "";
display: inline-block;
width: 22px;
height: 22px;
margin: 0 4px;
background: white;
border-radius: 50%;
}
<fieldset>
<legend class="sr-only">Choose role (reloads the page):</legend>
<input class="sr-only" id="role-A" name="roles" type="radio" value="Role A" checked>
<label class="sr-only" for="role-1">Role A</label>
<input class="sr-only" id="role-B" name="roles" type="radio" value="Role B">
<label class="sr-only" for="role-B">Role B</label>
<button tabindex="-1" aria-hidden="true" class="switch selected-role-A">
Role A
</button>
</fieldset>
所以基本上我显示了一个带有两个选项的字段集作为屏幕阅读器用户的无线电输入和浏览器中的类似开关的按钮。
关于页面重新加载——WCAG 技术 G13要求通知用户如果表单元素的更改导致上下文的更改(如我们的示例中的重新加载)会发生什么。不幸的是,由于设计要求,我无法在按钮周围放置视觉信息,所以我只将它添加到屏幕阅读器的字段集中。但是,据我了解,如果页面是 Intranet 应用程序并且用户将接受培训(如我们的案例),这应该不是问题。
我的解决方案是否还有其他可访问性问题?有谁知道如何在不使用两个单独元素的情况下实现这一目标?提前致谢。
编辑:解决了标签问题。