单选/复选框是 Web 应用常用控件,随处可见,原生的单/复选框控件的外观一般都不怎么美观,有些时候,原生的控件模样并不能满足设计要求,这时需要更为精致的控件样式,我们更希望其样式可以允许自定义。
CSS3 新增了一个伪类选择器 :checked
,用于选择被勾选的单/复选框,利用该选择器可以分别为未选中和选中状态的单/复选框应用不同的样式,怎么给它应用样式呢?直接修改单/复选框的样式比较困难,不过可以使用一些其它方法来实现。
单选/复选框作为一个表单控件,可以使用一个 <label>
元素与之关联,将 <label>
元素的 for
属性指向复选框的 id
属性,这里使用一个复选框来举例说明:
<input id="example-checkbox" type="checkbox">
<label for="example-checkbox">Check</label>
此时,每次点击这个 <label>
元素会发现复选框的选择状态也会变化,测试表明,点击关联某个单/复选框的 <label>
时,产生的效果和点击单/复选框自身相同。然后,因为 <label>
元素紧邻在单/复选框之后,通过组合使用相邻元素选择器(Adjacent sibling selector),我们可以把相应的样式应用到 <label>
元素上去,相比较而言,给 <label>
元素应用样式要比给原生的单/复选框应用样式简单多了。
相邻元素选择器,在两个选择器中间添加一个加号,像这样 selector1 + selector2,表示选择 selector1 元素之后紧邻的 selector2 元素:
input[type="checkbox"] + label {
/* 未选中状态 */
}
input[type="checkbox"]:checked + label {
/* 选中状态 */
}
为了不对 <label>
元素自身的样式造成影响,这里使用生成内容伪元素(::before/::after)来应用单/复选框的自定义样式,首先使用 ::before 伪元素来生成复选框的外框样式:
input[type="checkbox"] + label::before {
background-color: #fff;
border: 1px solid #50a7f8;
border-radius: 3px;
content: "