原生javascript自定义input[type=radio]效果示例


Posted in Javascript onAugust 27, 2019

本文实例讲述了原生javascript自定义input[type=radio]效果。分享给大家供大家参考,具体如下:

找到最为简单的仅仅使用css3的方案

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
  input[type="radio"]+label::before {
    content: "";
    /*不换行空格*/
    display: inline-block;
    vertical-align: middle;
    font-size: 18px;
    width: 10px;
    height: 10px;
    margin-right: 10px;
    border-radius: 50%;
    border: 2px solid #01cd78;
    text-indent: 15px;
    line-height: 1;
    padding: 4px;
  }
  input[type="radio"]:checked+label::before {
    background-color: #01cd78;
    background-clip: content-box;
  }
  input[type="radio"] {
    position: absolute;
    clip: rect(0, 0, 0, 0);
  }
  </style>
</head>
<body>
  <div class="female">
    <input type="radio" id="female" name="sex" checked="" />
    <label for="female">女</label>
  </div>
  <div class="male">
    <input type="radio" id="male" name="sex" />
    <label for="male">男</label>
  </div>
</body>
</html>

在最近的一次开发中,或者在之前的开发中,经常性的用到单选框这个form表单元素。而ui给出的设计方案绝对也不是原生的radio样式,面对这种场景,自定义radio效果成为一种解决方案。

直接上图,如下

原生javascript自定义input[type=radio]效果示例

测试代码,如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>自定义radio和checkbox</title>
  <style type="text/css">
  #ceshi label input {
    display: none;
  }
  #ceshi label span {
    display: inline-block;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    border: 2px solid #ddd;
    box-sizing: border-box;
    position: relative;
    top: 3px;
    margin-right: 6px;
  }
  #ceshi label span.active {
    border: 3px solid red;
  }
  </style>
</head>
<body>
  <form id="ceshi" action="test.php" method="get">
    <label>
      <span></span>
      <input type="radio" name="t" value="这是测试1">这是测试1
    </label>
    <label>
      <span></span>
      <input type="radio" name="t" value="这是测试2">这是测试2
    </label>
    <label>
      <span></span>
      <input type="radio" name="t" value="这是测试3">这是测试3
    </label>
    <input type="submit" name="" value="提交">
  </form>
  <script type="text/javascript">
    Object.prototype.siblings = function() {
      var arr = []; //保存兄弟节点 
      var prev = this.previousSibling; //o的前一个同胞节点 
      //先往上查询兄弟节点 
      while (prev) {
        if (prev.nodeType == 1 && prev.tagName == this.tagName) {
          arr.unshift(prev); //数组首部插入数组,保证节点顺序 
        }
        prev = prev.previousSibling; //把上一节点赋值给prev 
      }
      //往下查询兄弟节点 
      var next = this.nextSibling; //o的后一个同胞节点 
      while (next) {
        if (next.nodeType == 1 && next.tagName == this.tagName) {
          arr.push(next); //数组尾部插入,保证节点顺序 
        }
        next = next.nextSibling; //下一节点赋值给next,用于循环 
      }
      return arr;
    }
    //判断HTMLElement是否含有某个class
    Object.prototype.hasClass = function(cls) {
      return this.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
    }
    //HTMLElement对象添加类
    Object.prototype.addClass = function(cls) {
      if (!this.hasClass(cls)) this.className += " " + cls;
    }
    //HTMLElement对象删除类
    Object.prototype.removeClass = function(cls) {
      if (this.hasClass(cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        this.className = this.className.replace(reg, ' ');
      }
    }
    function nativeSelfRadio(dom) {
      dom.getElementsByTagName("span")[0].addClass("active");
      dom.siblings().forEach(function(ele, val) {
        ele.getElementsByTagName("span")[0].removeClass('active');
        //ele.getElementsByTagName("span")[0].classList.remove('active');
      })
    }
    //绑定事件
    var len=document.getElementById("ceshi").getElementsByTagName("label");
    for (var i = 0; i < len.length; i++) {
      len[i].getElementsByTagName("input")[0].checked=false;//设置不选中
      len[i].onclick=function(){
         nativeSelfRadio(this);
      }
    }
  </script>
</body>
</html>

最初开发时候,也习惯了用jquery,但慢慢也意识到原生不熟走不远的道理,于是开始各种原生实现。上述测试代码均采用原生js实现;

本人觉得需要关注的地方有:

1)、函数挂载的原型对象是HTMLElement,实际原型对象写为Object也是可以的

2)、添加或者删除类可以自己来写,也可以用HTML5的接口classList,添加或者删除类

3)、避免返回该页面,radio依然为选中状态,需要加载完页面后将radio选中状态设置为false,如果业务需要单独选中哪个,就需要定制了

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 特殊字符
Apr 05 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
Aug 12 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
Apr 01 Javascript
Jquery实现弹出层分享微博插件具备动画效果
Apr 03 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
JS基于Ajax实现的网页Loading效果代码
Oct 27 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
JS使用eval()动态创建变量的方法
Jun 03 Javascript
微信小程序 地图定位简单实例
Oct 14 Javascript
Angular.Js中ng-include指令的使用与实现
May 07 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
openlayers实现地图测距测面
Sep 25 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 #Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 #Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 #Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 #jQuery
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
Aug 26 #Javascript
javascript实现抢购倒计时程序
Aug 26 #Javascript
VUE路由动态加载实例代码讲解
Aug 26 #Javascript
You might like
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Python二元赋值实用技巧解析
2019/10/25 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
django使用graphql的实例
2020/09/02 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
元旦促销方案
2014/03/15 职场文书
参观接待方案
2014/03/17 职场文书
设备管理实施方案
2014/05/31 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
美丽人生观后感
2015/06/03 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
详解Python为什么不用设计模式
2021/06/24 Python