创建自定义键盘可访问复选框
我见过很多设计师设计出这些华丽的复选框样式,但当你看到它们实现后,你甚至无法用键盘选中它。假设我们设计师的样式指南里有这种情况。
我以前见过这种实现,看起来很漂亮。然而,当我按下tab
按键时,它却直接跳过了。如果这个字段是必填项,那你就是在坑你的一大堆用户。他们用::before
或::after
伪元素来制作一个漂亮的复选框,然后用:checked
伪类来决定复选框本身的样式。这看起来很酷,但问题是他们用在了display: none
复选框输入框本身上。这样做会使得复选框本身对浏览器不可见,对于那些依赖键盘浏览网站的人来说,这简直是无解。

起点
让我们一步一步地讲解一下这个过程。我的初始代码如下:
<fieldset>
<legend>Accessible Checkboxes</legend>
<input type="checkbox" name="Checkbox" id="check_1">
<label for="check_1">Checkbox</label>
<input type="checkbox" name="CSS Only" id="css_only">
<label for="css_only">CSS Only</label>
<input type="checkbox" name="" id="disabled_sample" disabled>
<label for="disabled_sample">A disabled checkbox</label>
<input type="checkbox" name="Fourth Option" id="fourth_check">
<label for="fourth_check">Fourth Option</label>
</fieldset>
我会从一个简单的复选框列表开始。这是我目前的 CSS:
input[type="checkbox"] {
position: absolute;
}
input[type="checkbox"] + label {
display: block;
position: relative;
padding: 0 1.5rem;
}
在标签上创建伪元素
我要做的第一件事是确保创建一个可以代替复选框的伪元素。为此,我将在元素::before
上创建一个伪元素<label>
。现在它看起来像这样:
input[type="checkbox"] + label::before {
content: '';
position: relative;
display: inline-block;
margin-right: 10px;
width: 20px;
height: 20px;
background: white;
}
我特意把原来的未设置样式的复选框保留在那里。这样做的原因是,这样可以更容易地判断复选框何时获得焦点、被选中等等。这有助于我推迟到最后一刻才隐藏复选框。
选中时在伪元素上添加样式
截至目前,当我们尝试勾选复选框时,除了正常行为外,它不会执行任何其他操作。我们需要做的是使用伪类添加一些 CSS 魔法:checked
。如下所示:
input[type="checkbox"]:checked + label::before {
background: #5ac5c9;
}
添加您的自定义复选标记
如果您想在::before
元素内容中添加一个 Unicode 复选标记,完全可以做到。不过,我想稍微花点心思。现在,我们要确保自定义元素内部有一个垂直的复选标记。我通过添加一个::after
伪元素来实现这一点。我们在这里做的是创建一个带有两个边框的直角,然后旋转它。
input[type="checkbox"]:checked + label::after {
content: '';
position: absolute;
top: 3px;
left: 27px;
border-left: 2px solid black;
border-bottom: 2px solid black;
height: 6px;
width: 13px;
transform: rotate(-45deg);
}
额外的挑战,不是勾选,而是画一个“X”。
为伪元素添加焦点样式
太好了!我们现在可以出发了吗?嗯,还没到。
我们仍然需要确保伪元素“获得焦点”。我们现在要做的是在复选框获得焦点时复制焦点样式。我们不想这样做的原因display: none
是,移除显示会完全阻止复选框获得焦点。我希望有一些具体的焦点样式,因为它们在不同浏览器中可能有所不同。下面是我最终的做法,因为我想复制 Chrome 的默认焦点样式,但要在所有浏览器中都复制。虽然不一样,但很接近!
input[type="checkbox"]:focus + label::before {
outline: #5d9dd5 solid 1px;
box-shadow: 0 0px 8px #5e9ed6;
}
现在我们可以隐藏原来的复选框了!看看在我们解决这个问题的时候,保留它有多有用?
input[type="checkbox"] {
position: absolute;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
}
(以上代码是常见的视觉隐藏css)

为禁用的复选框添加一些样式
最后一件事,我们应该让禁用复选框的样式有所不同。以下是我做的:
input[type="checkbox"]:disabled + label {
color: #575757;
}
input[type="checkbox"]:disabled + label::before {
background: #ddd;
}
就是这样!同样的原则也可以应用到单选按钮上。欢迎在Twitter上或在下方评论区留言,分享你的想法!
免责声明:我差点没发这篇文章。昨晚刷推特的时候,我看到了一篇几乎和这篇文章一样的帖子。我问了推特圈的人是否应该发,结果绝大多数人都说“好!”。另一篇我还没看,只是粗略地看了一眼,主要是因为不想影响我的写作。不过,我想给你提供一个链接,方便你阅读:如何制作可自定义访问的复选框和单选按钮。
文章来源:https://dev.to/lkopacz/create-custom-keyboard-accessible-checkboxes-2036