[CSS]<input> checkbox按钮显示的自定义

上一篇提到了将input元素的type设置为radio时(也就是单选框)的自定义,那么将input元素的type为checkbox时,input的自定义显示又将如何处理呢?系统默认的显示方式是勾选,如果我们要达到手机设置界面开关按钮的显示效果,那该如何做到呢?这里为大家提供两种通过CSS来实现的方法。

方法一:使用CSS3新属性appearance

如果读过上一篇关于CSS的文章,读者可能会想到这里也可以使用<label>元素来实现相应的自定义,但是在使用<label>之前这里先介绍一种利用CSS3新特性的一种实现方法,该方法是参考了腾讯公司微信应用的推荐写法。

CSS3添加了一个新属性appearance,所有主流浏览器都不支持 appearance 属性,但是Firefox 支持替代的 -moz-appearance 属性,Safari 和 Chrome 支持替代的 -webkit-appearance 属性。所以在手机浏览器上该属性是都是适用的。将appearance属性设置成“none”将会隐藏<input>的默认显示样式,但是边框的改变和背景的改变依旧可以显示出来。完整的实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">    
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">    
<style>        
/*switch 按钮*/        
  .switch-ui{            
  -webkit-appearance: none;   /*隐藏默认的显示样式*/         
  -moz-appearance: none;   /*隐藏默认的显示样式*/         
  appearance: none;    /*隐藏默认的显示样式*/  
/* 将<input>显示的形状变成椭圆*/        
  width: 44px;            
  height: 24px;            
  border-radius: 12px;            
  top: 3px;            
  position: relative;/*此处设置为relative便于后面的:after和:before通过设置position为absolute来改变相对位置*/           
  border: 1px solid #dfdfdf;            
  outline: 0;            
  box-sizing: border-box;            
  background: #dfdfdf;         
  }          
  .switch-ui:checked {            
  border-color: #12b7f5;            
  background-color: #12b7f5;        
  }                  
  .switch-ui:after, .switch-ui:before {            
  content: " ";            
  position: absolute;            
  top: 0;            
  left: 0;            
  height: 22px;            
  border-radius: 11px; 
  /* transition 用来设置动画的持续时间,这里的动画类型是transform,即位置偏移动画*/           
  -webkit-transition: -webkit-transform .3s;            
  transition: -webkit-transform .3s;            
  transition: transform .3s;            
  transition: transform .3s,-webkit-transform .3s;        
  }        
  .switch-ui:before {            
    width: 42px;        
  } 
  .switch-ui:after {            
  width: 22px;            
  background-color: #fff;            
  box-shadow: 0 1px 3px rgba(0, 0, 0, .4);        
  } 
 /*checked状态下,:before大小变为0*/          
  .switch-ui:checked:before {            
  -webkit-transform: scale(0);            
  transform: scale(0);        
  }
/*checked状态下,:after位置向右偏移20px*/        
  .switch-ui:checked:after {            
  -webkit-transform: translateX(20px);            
  transform: translateX(20px);        
  }    
</style>    
<title></title>
</head>
<body>
<div  class="container">    
<form>        
  <span class="">选项一</span><input type="checkbox" id="switch_1" name="mode" value = "0" class="switch-ui">        
  <span class="">选项二</span><input type="checkbox" id="switch_2" name="mode" value = "0" class="switch-ui">    
</form>
</div>
</body>
</html>

(关键细节的一些说明,可以查看以上代码中的注释)
具体的显示效果如下图

<input>显示的自定义.jpg

方法二:使用<label>元素

虽然使用属性appearance来实现<input>的自定义看上去的显示已经比较完美,但是这种方法其对浏览器的兼容性很不友好,尤其是IE浏览器包括edge浏览器都无法支持。为了提高兼容性,可以使用<label>方法来实现<input>显示的自定义。
该方法与上一篇文章介绍的方法类似,原理都是基于<label>标签存在的特性:当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。完整的实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>    
<meta charset="UTF-8">    
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">    <style>        
/*switch 按钮*/        
.switch-ui{            
  display: none;        
}        
.switch-ui+label{                      
  display: inline-block;/*此处必须要加上这个设置,否则label的宽度显示会有问题*/
  /* 将<input>显示的形状变成椭圆*/              
  width: 44px;            
  height: 24px;            
  border-radius: 12px;            
  top: 3px;            
  position: relative;/*此处设置为relative便于后面的:after和:before通过设置position为absolute来改变   相对位置*/            
  border: 1px solid #dfdfdf;            
  outline: 0;            
  box-sizing: border-box;            
  background: #dfdfdf;        
  }        
.switch-ui:checked +label{            
  border-color: #12b7f5;            
  background-color: #12b7f5;        
}        
.switch-ui+label:after {            
  width: 22px;            
  background-color: #fff;            
  box-shadow: 0 1px 3px rgba(0, 0, 0, .4);        
}        
.switch-ui+label:after, .switch-ui+label:before {            
  content: " ";            
  position: absolute;            
  top: 0;            
  left: 0;            
  height: 22px;            
  border-radius: 11px;            
/* transition 用来设置动画的持续时间,这里的动画类型是transform,即位置偏移动画*/          
  -webkit-transition: -webkit-transform .3s;           
  transition: -webkit-transform .3s;            
  transition: transform .3s;            
  transition: transform .3s,-webkit-transform .3s;        
}        
.switch-ui+label:before {            
  width: 42px;        
}        
/*checked状态下,:before大小变为0*/        
  .switch-ui:checked+label:before {            
  -webkit-transform: scale(0);            
  transform: scale(0);        
}        
/*checked状态下,:after位置向右偏移20px*/        
  .switch-ui:checked+label:after {            
  -webkit-transform: translateX(20px);            
  transform: translateX(20px);        
}    
</style>    
<title></title>
</head><body>
<div  class="container">    
<form>        
<span class="">选项一</span><input type="checkbox" id="switch_1" value = "0" class="switch-ui" checked><label for="switch_1"></label>        
<span class="">选项二</span><input type="checkbox" id="switch_2" value = "1" class="switch-ui"><label for="switch_2"></label>    
</form></div>
</body>
</html>

从上面的代码可以看出来,其实大部分CSS属性的设置与第一种方法是一致的,只是CSS的选择器有所更改,从“.switch-ui”变成了“.switch-ui+label”,而.switch-ui自己做了隐藏设置(“display: none; ”),让<label> 代替<input>做显示。

这里的按钮的显示风格只是iOS手机上的switch控件的风格,通过改变.switch-ui 的椭圆的大小以及:after 和:before的大小和位置也可以实现android手机的风格,或者更换背景图实现更多自定义的风格。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,822评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 今天六一,陪着韬宝玩耍,忽然想起我小时候的趣事,发现我们那时没有手机,没有IPad,但是我们自己动手制作玩具,虽然...
    微雨悦读阅读 588评论 0 1
  • 事情系甘葛,今晚在百佳买东西的时候,偶遇了一个帅哥A,还对视了3!秒!无意中抬头,卧槽,怎么辣么想香港明星林文龙?...
    花痴少女阅读 384评论 0 0