TL;DR!
input[type="checkbox"] {
content: url('http://placekitten.com/200/210');
appearance: none;
display: block;
width: 200px;
height: 200px;
}
input[type="checkbox"]:checked {
content: url('http://placekitten.com/210/220');
}
<input type="checkbox" />
纯 CSS 解决方案
摘要
复选框输入是用于实现切换功能的本机元素,我们可以利用它来获益。
利用 :checked 伪类 - 将其附加到复选框的伪元素(因为您不能真正影响 input 本身的背景),并相应地更改其背景。
实施
input[type="checkbox"]:before {
content: url('images/icon.png');
display: block;
width: 100px;
height: 100px;
}
input[type="checkbox"]:checked:before {
content: url('images/another-icon.png');
}
演示
这里有一个full working demo on jsFiddle 来说明这种方法。
重构
这有点麻烦,我们可以做一些改变来清理不必要的东西;因为我们并没有真正应用背景图像,而是设置元素的content,所以我们可以省略伪元素并直接在复选框上设置。
诚然,它们在这里没有任何实际用途,只是掩盖了复选框的本机呈现。我们可以简单地删除它们,但在最好的情况下会导致 FOUC,或者如果我们无法获取图像,它只会显示一个巨大的复选框。
输入appearance属性:
(-moz-)appearance CSS 属性用于...显示一个元素
使用基于操作系统主题的平台原生样式。
我们可以通过分配appearance: none 来覆盖平台原生样式并完全绕过该故障(我们必须自然地考虑供应商前缀,并且任何地方都不支持无前缀形式 , 眼下)。然后简化了选择器,代码更加健壮。
实施
input[type="checkbox"] {
content: url('images/black.cat');
display: block;
width: 200px;
height: 200px;
-webkit-appearance: none;
}
input[type="checkbox"]:checked {
content: url('images/white.cat');
}
演示
再次,live demo of the refactored version is on jsFiddle。
参考文献
注意:目前这仅适用于 webkit,我正在尝试将其修复为 gecko 引擎。一旦我发布更新版本。
更新:appearance 属性现在是 widely adopted,因此使用供应商前缀是多余的。万岁!