jQuery实现自定义checkbox和radio样式


Posted in Javascript onJuly 13, 2015

1,起因

最近在工作中要实现自定义式的radio样式,而我们通常使用的时默认的样式,因为自己实在想不到解决的方法,于是开始搜索,最终看到了不错的解决办法,可以完美解决我们遇到的问题。

2,原理

大家都知道在写结构的时候,radio或checkbox都会跟随label一起使用,label的for属性值和input的id值相同的情况下,点击label就可以选中input,这里正是利用label 来覆盖我们的input默认样式,通过给label添加背景图片(美化的checkbox或radio),也就是在点击的过程中,我们是看不到默认的input的(给input设置z-index:-1),而点击的是label,通过不同的事件,加载不同的背景图片(这里是改变背景图片的位置)

3,设置美化checkbox或radio的默认样式

(1)页面结构

<form class="form" method="post">
  <fieldset>
    <legend>Which genres do you like?</legend>
    <input type="checkbox" value="action" id="check-1" name="genre"><label for="check-1" class="">Action / Adventure</label>
    <input type="checkbox" value="comedy" id="check-2" name="genre"><label for="check-2" class="">Comedy</label>
    <input type="checkbox" value="epic" id="check-3" name="genre"><label for="check-3" class="">Epic / Historical</label>
    <input type="checkbox" value="science" id="check-4" name="genre"><label for="check-4" class="">Science Fiction</label>
    <input type="checkbox" value="romance" id="check-5" name="genre"><label for="check-5" class="">Romance</label>
    <input type="checkbox" value="western" id="check-6" name="genre"><label for="check-6" class="">Western</label>
  </fieldset> 
  <fieldset>
    <legend>Caddyshack is the greatest movie of all time, right?</legend>
    <input type="radio" value="1" id="radio-1" name="opinions"><label for="radio-1" class="">Totally</label>
    <input type="radio" value="1" id="radio-2" name="opinions"><label for="radio-2" class="">You must be kidding</label>
    <input type="radio" value="1" id="radio-3" name="opinions"><label for="radio-3" class="">What's Caddyshack?</label>
  </fieldset>
</form>

 (2)jquery code(前提必须引入jquery库)

jQuery.fn.customInput = function(){
  $(this).each(function(i){
    if($(this).is('[type=checkbox],[type=radio]')){
      var input = $(this);
      //get the associated label using the input's id
      var label = $('label[for='+input.attr('id')+']');
      //get type,for classname suffix
      var inputType = (input.is('[type=checkbox]')) ? 'checkbox' : 'radio';
      //wrap the input + label in a div
      $('<div class="custom-'+ inputType +'"></div>').insertBefore(input).append(input,label);
      //find all inputs in this set using the shared name attribute
      var allInputs = $('input[name='+input.attr('name')+']');
      //necessary for browsers that don't support the :hover pseudo class on labels
      label.hover(function(){
        $(this).addClass('hover');
        if(inputType == 'checkbox' && input.is(':checked')) {
          $(this).addClass('checkedHover');
        }
      },function(){
        $(this).removeClass('hover checkedHover');
      });
       
      //bind custom event, trigger it, bind click,focus,blur events
      input.bind('updateState',function(){
        if(input.is(':checked')){
          if(input.is(':radio')){
            allInputs.each(function(){
              $('label[for='+$(this).attr('id')+']').removeClass('checked');
            });
          };
          label.addClass('checked');
        } else {
          label.removeClass('checked checkedHover checkedFocus');
        }
      })
      .trigger('updateState')
      .click(function(){
        $(this).trigger('updateState');
      })
      .focus(function(){
        label.addClass('focus');
        if(inputType == 'checkbox' && input.is(':checked')) {
          $(this).addClass('checkedFocus');
        }
      })
      .blur(function(){
        label.removeClass('focus checkedFocus');
      });        
    }
  });
}

 引入jquery库,再引入上面的代码后,就可以执行下面的代码

$('input').customInput();

 (3)生成的外层div

如果你的代码结构是label和input成对写的话,那么在它们的外层就会生成一个div,如图

jQuery实现自定义checkbox和radio样式

(4)设置自定义默认样式

准备好一张图,如下:

jQuery实现自定义checkbox和radio样式

你可能会问,为什么上面没有在顶端,而是有一定的距离,因为我们的input选项多是居中的,而我们是使用label的背景图片来模拟的,所以我们是为了让input选项居中显示。总之:ico小图标一定要垂直排列,一定要留有一定的距离来达到居中显示。

/* wrapper divs */
      .custom-checkbox,
      .custom-radio {
        position: relative;
        display: inline-block;
      }
      /* input, label positioning */
      .custom-checkbox input,
      .custom-radio input {
        position: absolute;
        left: 2px;
        top: 3px;
        margin: 0;
        z-index: -1;
      }
      .custom-checkbox label,
      .custom-radio label {
        display: block;
        position: relative;
        z-index: 1;
        font-size: 1.3em;
        padding-right: 1em;
        line-height: 1;
        padding: .5em 0 .5em 30px;
        margin: 0 0 .3em;
        cursor: pointer;
      }

 这是最外层的一些设置,当然你可以自己修改

/* ==默认状态效果== */
      .custom-checkbox label { 
        background: url(images/checkbox.gif) no-repeat; 
      }
      .custom-radio label { 
        background: url(images/button-radio.png) no-repeat; 
      }
      .custom-checkbox label, 
      .custom-radio label {
        background-position: 0px 0px;
      }
/*==鼠标悬停和得到焦点状态==*/
      .custom-checkbox label.hover,
      .custom-checkbox label.focus,
      .custom-radio label.hover,
      .custom-radio label.focus {
        /*background-position: -10px -114px;*/
      }
      
      /*==选中状态==*/
      .custom-checkbox label.checked,
      .custom-radio label.checked {
        background-position: 0px -47px;
      }
      .custom-checkbox label.checkedHover,
      .custom-checkbox label.checkedFocus {
        /*background-position: -10px -314px;*/
      }
      .custom-checkbox label.focus,
      .custom-radio label.focus {
        outline: 1px dotted #ccc;
      }

结尾:总之,我是完美的解决了我的问题,顺便截图发一个看看

jQuery实现自定义checkbox和radio样式

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
Oct 11 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
javascript实现数独解法
Mar 14 Javascript
js实现微信分享代码
Oct 11 Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 Javascript
javascript数字验证的实例代码(推荐)
Aug 20 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
Feb 14 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 13 Javascript
javascript作用域问题实例分析
Jul 13 #Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 #Javascript
jquery实现图片上传之前预览的方法
Jul 11 #Javascript
JavaScript使用RegExp进行正则匹配的方法
Jul 11 #Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 #Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 #Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 #Javascript
You might like
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
php fread函数使用方法总结
2019/05/28 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
python实现猜拳小游戏
2020/04/05 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
大课间活动实施方案
2014/03/06 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
2015年加油站工作总结
2015/05/13 职场文书
MySQL基础(一)
2021/04/05 MySQL
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript