今天和大家分享一个不使用图片美化复选框的方式。来看下效果图吧,如下是3种不同状态下的效果:
一. Html结构
<div class="check-wrap">
<input type="checkbox" class="icheck" id="icheck" />
<label for="icheck" class="ilabel"></label>
</div>注: label 标签的 for 属性值必须指定为 input 的 id 名称。
二. CSS 代码
.check-wrap{
position: relative;
height: 24px;
width: 24px;
}
.icheck{
opacity: 0;
}
.ilabel{
border-radius: 3px;
cursor: pointer;
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ilabel:after{
content: " ";
border: 2px solid #DDD;
display: block;
font-weight: bold;
text-align: center;
border-radius: 3px;
width: 20px;
height: 20px;
}
.icheck:checked + .ilabel:after{
content: "✓";
border-color: #3f51b5;
background-color: #3f51b5;
color: #fff;
}
.icheck:indeterminate + .ilabel:after{
content: "■";
color: #3f51b5;
background-color: #FFF;
border-color: #3f51b5;
}1. 将原有的 input 标签透明度设为0
2. label:after 的宽高设置 20px 是因为 border 占据了4px
3. checkbox 的 indeterminate 状态大家用的可能比较少(效果图中的第2个状态),只能通过 js 进行设置,这种情况通常用在树型结构(即:子节点有选中但并未全部选中的时候父节点的状态)
<script>
var icheck = document.getElementById("icheck");
icheck.indeterminate = true;
</script>
自定义input[type="radio"]的样式
对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一。
为了最大程度的显示出它们的差别,并且为了好看,首先定义了一些样式:
html:
css:
然后在各个浏览器中观察,会发现有很大的差别:
对于 firefox 浏览器,即便是设置了宽和高,依然是没有效果,input[type="radio"] 的那个圆圈还是初始状态那么大。其它浏览器的表现也不一致,为了达到一致的效果,我们需要做兼容处理。
思路:
1. 将 input[type="radio"] 隐藏, opacity: 0; 置于上层,当我们点击它时,就能正确的响应原本的事件。
2. 自定义一个圆圈,置于下层,模拟原本相似的样式;
3. 用 js 实现选中 input[type="radio"] 时,在其下层的自定义的元素改变原来的背景颜色。
代码:
html:
css:
js:
这样处理后,在浏览器中展示效果全部一样了:
扩展:
1. 对于代码中出现的定位,对父元素使用 position: relative; 给子元素使用 position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; 能实现让子元素相对于父元素居中(满足水平居中和竖直居中)显示。如果只是需要竖直居中,则不需要添加 right: 0; 和 left: 0; 的样式。
2. 有时当我们不容易确定子元素的高度时,可以这样设置:对父元素 position: relative; 对子元素 position: absolute; top: 10px; bottom: 10px; margin: auto; 这样一来,子元素的高度就是父元素的高度减去20px后的值了,同样,top 和 bottom 支持百分数,可扩展性更强。
优化更新:
需求:
1. 有时候我们需要内联的单选样式;
2. 选中的按钮内的小圆圈不需要占满整个外圈的大小。
思路:
1. 让每一个包裹选择的 div 左浮动;
2. 给父元素添加圆形的外边框,子元素设置一个稍小于父元素大小的背景。
代码:
html:
css:
js:
效果显示如下:
自定义input[type="file"]的样式
input[type="file"]的样式在各个浏览器中的表现不尽相同:
另外,当我们规定 input[type="file"] 的高度,并把它的行高设置成与其高度相等后,chrome中难看的样式出现了:
“未选择任何文件”这一行并没有竖直居中。
似乎在 firefox 中好看一些,嗯,我比较喜欢用 firefox。但是这些浏览器中的表现不一致,我们必须做兼容处理。
思路:
1. 自定义与其中一个浏览器表现类似的样式,将其放在下层;
2. 将浏览器本身的表现出来的样式“隐藏掉”, opacity: 0; 置于上层,这样我们点击的才是 input[type="file"] 响应的事件;
3. 选择文件或改变文件后,改变显示 file 的值。
代码:
html:
css:
js:
这样处理后,就在各个浏览器中表现一致了:
input复选框单选框样式美化
css3美化radio单选框(兼容IE9+)
css3美化checkbox复选框(兼容IE9+)