css设置移动端checkbox和radio样式

复选框 `Checkbox `是 Web 应用常用控件,随处可见,原生的复选框控件一般就像下面这样:

这取决于操作系统和浏览器,有些时候,这种样子并不能满足设计要求,这时需要更为精致的复选框样式。以往只有少数浏览器才支持对这类控件应用样式,比如拿到这样一张设计图:

blue.png

在过去,想要通过简单地修改样式达成这种设计效果根本不行,不过,现在借助强大的 CSS3 属性 appearance 可以对该类控件有空前的样式控制能力:

input[type="checkbox"] {
  -webkit-appearance: none;
}

这样设置该属性值为 none 就去掉了复选框原有的呈现方式,变成了一个普普通通的元素,然后就可以为之应用样式了,添加如下样式:

input[type="checkbox"] {
  -webkit-appearance: none;
  background: #fff url(i/blue.png);
  height: 22px;
  vertical-align: middle;
  width: 22px;
}

通过结合使用状态伪类选择器 :checked 可以为选中状态下的 checkbox 设置不同的样式,用以从视觉上区别:

input[type="checkbox"]:checked {
  background-position: -48px 0;
}

此时点击复选框,可以看到复选框样式的变化效果,另外,根据那张设计图片所示还得加上获取焦点,禁用等状态的样式:

input[type="checkbox"]:focus,
input[type="checkbox"]:hover {
  background-position: -24px 0;
  outline: none;
}

input[type="checkbox"]:checked {
  background-position: -48px 0;
}

input[type="checkbox"][disabled] {
  background-position: -72px 0;
}

input[type="checkbox"][disabled]:checked {
  background-position: -96px 0;
}

因为图片已经事先合并成一张了,简单修改一下 background-position 就可以了,同时前面几个选择器的优先级(权重)一样,所以书写顺序很重要。

兼容性

目前只兼容 Webkit 系列浏览器;虽然 Firefox 也实现了替代的 -moz-appearance 属性,不过控件原有的背景颜色、边框样式无法修改,暂时也不大好用;IE 系列暂时不支持该属性,更详细的兼容情况查看 Caniuse/appearance 。因此需要为 IE 浏览器清除掉背景图片的影响:

input[type="checkbox"] {
  background: #fff url(i/blue.png);
  background: none\0;
  *background: none;
  ...
}

为了兼容更多的主流浏览器,需要寻求另外的解决方案,在所有主流浏览器里,点击关联某个复选框的 label 时,产生的效果和点击元素自身相同,会切换复选框控件的选中状态。浏览器的这种行为给了我们一个至关重要的挂钩,既然能依靠 label 元素来控制原生复选框的状态,那么就可以不必直接操作实际的复选框元素,而把操作和样式都转移到与之关联的 label 元素上去:

<input id="example" type="checkbox">
<label for="example"></label>

确保 label 元素的 for 属性的值和复选框 input 的 id 值一致,同时将 label 元素放置于 input 之后,这样 CSS 可以通过相邻兄弟选择器(Adjacent sibling selector)定位到这个 label 元素并为之应用样式:

input[type="checkbox"] + label:before {
  background: #fff url(i/blue.png);
  content: " ";
  height: 22px;
  left: 0;
  position: absolute;
  width: 22px;
}

有了样式化的 label 元素来提供交互,原生的 checkbox 控件就显得有点多余了,虽然可以用 display: none 把它隐藏掉,不过隐藏后的表单元素是不能获得焦点的,所以最好的方式还是用 label 元素把它遮住,这样既能支持键盘交互,同时当图片加载失败的时候,又能保证原生的控件可用:

input[type="checkbox"] {
  box-sizing: border-box;
  left: 4px;
  margin: 0;
  padding: 0;
  position: absolute;
  top: 3px;
}

图片要足够大能将原生的 checkbox 控件完全遮挡住,因为这里用到了绝对定位,所以需要增加一个定位参照:

<!-- HTML -->
<div class="checkbox">
  <input id="exampleCheckbox" type="checkbox">
  <label for="exampleCheckbox"></label>
</div>

/* CSS */
.checkbox {
  min-height: 24px;
  padding-left: 24px;
  position: relative;
}

左边预留内边距是为了排版更美观,同时,和之前一样,搭配上其它状态下的样式:

input[type="checkbox"]:focus + label:before,
input[type="checkbox"] + label:hover:before {
  background-position: -24px 0;
}

input[type="checkbox"]:checked + label:before {
  background-position: -48px 0;
}

input[type="checkbox"][disabled] + label:before {
  background-position: -72px 0;
}

input[type="checkbox"][disabled]:checked + label:before {
  background-position: -96px 0;
}

兼容性

只要支持 CSS3 selectors 的浏览器基本上都能兼容,同时具备原生控件的绝大多数交互特性。IE 8 不支持 :checked 伪类选择器,将伪元素 :before 修改为双冒号 ::before 可以去掉对 IE 8 的影响:

input[type="checkbox"] + label::before { ... }

关于伪元素生成内容的兼容性见 CSS Generated content for pseudo-elements 。诚然,上面的方法假设了支持 :checked 伪类选择器的浏览器同时也支持双冒号伪元素写法,而不支持的浏览器则都不支持,这是一种不太好的方式,这种假设事实上也是不正确的,造成了部分老旧浏览器不可用的问题,如果使用 :not() 选择器则更为合理,使用 :not(:checked) 来为未选中的控件添加样式, :not():checked 同属一个规范 css3-selectors ,兼容性应该一致 CSS3 selectors 。不过写法有点变化, :checked:not(:checked) 都需要添加上基本的样式:

input[type="checkbox"]:checked + label:before,
input[type="checkbox"]:not(:checked) + label:before {
  background: #fff url(i/blue.png);
  content: " ";
  height: 22px;
  left: 0;
  position: absolute;
  width: 22px;
}

input[type="checkbox"]:not(:checked):focus + label:before,
input[type="checkbox"]:not(:checked) + label:hover:before {
  background-position: -24px 0;
}

input[type="checkbox"]:checked + label:before {
  background-position: -48px 0;
}

input[type="checkbox"][disabled]:not(:checked) + label:before {
  background-position: -72px 0;
}

input[type="checkbox"][disabled]:checked + label:before {
  background-position: -96px 0;
}

查看简单示例 ,对于那些并不支持 :checked 伪类选择器的浏览器(比如 IE 8),则可以借助 javaScript 来根据控件状态修改真正的 class 属性达到区分不同状态的目的,比如根据是否被选中来添加或删除一个 checked 的 class:

// jQuery
$(‘input[type="checkbox"]‘).on(‘change‘, function() {
  $(this)[$(this).prop(‘checked‘) ? ‘addClass‘ : ‘removeClass‘](‘checked‘);
});

/* CSS */
input[type="checkbox"].checked + label:before { ... }

有了前面的基础,要制作类似于开关按钮的控件也是非常简单的了,还是熟悉的结构:

<div class="checkbox">
  <input id="example" type="checkbox">
  <label for="example">Check</label>
</div>

首先勾勒出开关的形状,一个圆角矩形中间放一个圆形按钮:

input[type="checkbox"]:checked + label,
input[type="checkbox"]:not(:checked) + label {
  background-color: #e0e0e0;
  border-radius: 24px;
  cursor: pointer;
  display: inline-block;
  height: 24px;
  position: relative;
  text-indent: -9999px;
  width: 48px;
}

input[type="checkbox"]:checked + label:after,
input[type="checkbox"]:not(:checked) + label:after {
  background-color: #fff;
  border-radius: 20px;
  content: " ";
  height: 20px;
  left: 2px;
  position: absolute;
  top: 2px;
  width: 20px;
}

选中的效果只要简单修改下外框的背景色和中间按钮的位置就行:

input[type="checkbox"]:checked + label {
  background-color: #8c8;
}

input[type="checkbox"]:checked + label:after {
  left: 26px;
}

不过这种跳跃式变化实在是太生硬了,添加点过渡效果,看上去更平滑:

input[type="checkbox"]:checked + label,
input[type="checkbox"]:not(:checked) + label {
  -webkit-transition: background-color 0.3s;
    transition: background-color 0.3s;
}

input[type="checkbox"]:checked + label:after,
input[type="checkbox"]:not(:checked) + label:after {
  -webkit-transition: left 0.3s;
    transition: left 0.3s;
}

点击就能看到效果,对于中间的按钮部分使用 CSS3 Transforms 来替代 left 效果更好,速度更快:

input[type="checkbox"]:checked + label:after,
input[type="checkbox"]:not(:checked) + label:after {
  -webkit-transition:

left -webkit-transform 0.3s; -o-transition: -o-transform 0.3s; transition: left transform 0.3s; } input[type="checkbox"]:checked + label:after { left: 26px; -webkit-transform: translateX(24px); -ms-transform: translateX(24px); -o-transform: translateX(24px); transform: translateX(24px); }

不支持 CSS3 Transforms 的浏览器仍然可以看到背景色的变化,不影响可用性,详见 CSS3 Transforms 。关于性能问题,请参考 High Performance Animations 。快速点击“控件”会因选中效果造成不能切换状态的情况,所以去掉“控件”可以被选中的能力:

input[type="checkbox"]:checked + label,
input[type="checkbox"]:not(:checked) + label {
  (-prefix-)user-select: none;
}

这里的浏览器厂商前缀根据需要替换成相应的, 查看简单示例 。当然还需要提供聚焦以及禁用等状态的样式,就不在这里重复了。以上所有技术可同时适用于单选框(radio)。

时间: 2024-08-08 01:27:32

css设置移动端checkbox和radio样式的相关文章

css input checkbox和radio样式美化

css input checkbox和radio样式美化 2014年9月1日 132495次浏览 在之前的一篇文章中,我已经介绍了input file上传按钮的美化,地址:http://www.haorooms.com/post/css_input_uploadmh ,今天,我们来讲一下checkbox美化和radio美化,关于select下拉框的美化的话,要用一个jquery插件了,这个插件后面我们再讲!急用的同学可以留言! 但是像checkbox美化和radio美化,input美化,根本就不

自定义checkbox, radio样式总结

任务目的 深入了解html label标签 了解CSS边框.背景.伪元素.伪类(注意和伪元素区分)等属性的设置 了解CSS中常见的雪碧图,并能自己制作使用雪碧图 任务描述 参考 样例(点击查看),实现页面开发,要求实现效果基本一致 任务注意事项 尝试背景图和伪元素两种不同方式实现,对比两种方式各自的优缺点. 注意测试不同情况,尤其是极端情况下的效果. 参考资料 MDN label: 了解html中label的基本知识 MDN background-position: 了解背景图片定位相关知识 M

自定义checkbox, radio样式

17.2.25.nimil 今天开始做百度前端学院的任务,第一个是自定义checkbox, radio样式. checkbox和radio两个标签是不可以改变样式的,background-color.border等属性都对其无效. 但是本身的样式又不太美观: 本身的radio外观:本身的checkedbox外观. 不能改样式,却又如此的不美观,实在不符合我们现在的审美和需求. 这是百度给的一个样式图片: 首先,HTML: <div> <input type="radio&quo

[ HTML5 表单样式 checkbox | radio ] 自定义checkbox 与radio样式实现思路

自定义checkbox 与radio样式实现思路: 1.隐藏原生的input选框  2.自定义新的选框  3.并通过CSS或JS控制切换是否选中的状态 声明:转载自网络,本人只作为学习之用,如果原作者发现(觉着)有侵权意图敬请联系本人,删除或修改,本人尊重原文作者的劳动并对原文作者的分享表示感谢和敬意... 分析原理: 实现 1.结构:用label绑定input,推荐使用label包裹input,以减少不必要的id: 2.样式:隐藏input标签,为label添加背景或使用其他小标签(<i>&

jQuery实现自定义checkbox和radio样式

jQuery实现自定义checkbox和radio样式 1,起因 最近在工作中要实现自定义式的radio样式,而我们通常使用的时默认的样式,因为自己实在想不到解决的方法,于是开始搜索,最终看到了不错的解决办法,可以完美解决我们遇到的问题. 2,原理 大家都知道在写结构的时候,radio或checkbox都会跟随label一起使用,label的for属性值和input的id值相同的情况下,点击label就可以选中input,这里正是利用label 来覆盖我们的input默认样式,通过给label添

checkbox和radio样式美化

看惯了input[checkbox]和input[radio]默认样式,有没有想要改变一下呢?比如下面的样式: 比起html默认的样式,上图这些是不是美观多了呢?并且这样的input美化,无需jquery插件,只要几行css代码就可以. 思路 思路很简单:(1)将之前的按钮透明度opacity设置为0:(2)外层用div包裹 实现过程 图片下载:       [html代码] <div class="hdz_input_radio checked"><input ty

css设置中文字体(font-family:&quot;黑体&quot;)后样式失效问题

做项目时偶遇的一诡异问题,同样的代码,在ff和IE7以上页面显示正常,但IE6无论怎么改都不起作用,本来以为是IE6的某些浮动bug所致,结果弄了很长时间也不行,后来不经意间把原来设定的font-family: "黑体"属性去掉了,一切恢复正常...到网上搜了下,还真有不少人遇到同样的问题,下面摘录一段: css文件里font-family: "黑体";这句会导致后面的css定义全部不起作用了.只要把font-family: "黑体";改成fon

CSS设置边框、符号、背景样式、链接属性

一.CSS边框空白 padding-top:10px; /*上边框留空白*/ padding-right:10px; /*右边框留空白*/ padding-bottom:10px; /*下边框留空白*/ padding-left:10px; /*左边框留空白 二.CSS符号属性 list-style-type:none; /*不标记*/ list-style-type:decimal; /*阿拉伯数字标记*/ list-style-type:lower-roman; /*小写罗马数字标记,如:i

巧用CSS3伪类选择器自定义checkbox和radio的样式

由于原生的checkbox和radio的样式太简陋了,在设计页面的时候,设计师往往会设计自己的checkbox和radio样式.一半情况下,为了适应各个浏览器的兼容性,我们都会用其他的元素替代原生的checkbox和radio,然后用js实现选中和未选中时候的样式,用来模拟checkbox和radio. 例如这种: 用其他元素模拟(以checkbox为例): <div class='checkbox'></div> $('.checkbox').click(function(){