原生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 相关文章推荐
防止按钮在短时间内被多次点击的方法
Mar 10 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
浅谈EasyUI中Treegrid节点的删除
Mar 01 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
基于JavaScript实现动态创建表格和增加表格行数
Dec 20 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
May 13 Javascript
bootstrap组件之导航组件使用方法
Jan 19 Javascript
Vue异步加载about组件
Oct 31 Javascript
详解基于mpvue的小程序markdown适配解决方案
May 08 Javascript
微信小程序时间轴实现方法示例
Jan 14 Javascript
原生js无缝轮播插件使用详解
Mar 09 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实现httpRequest的方法
2015/03/13 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
javascript事件问题
2009/09/05 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
详解Python的Lambda函数与排序
2016/10/25 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python占位符输入方式实例
2019/05/27 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
关于Python解包知识点总结
2020/05/05 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Python常用类型转换实现代码实例
2020/07/28 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
运动会入场解说词300字
2014/01/25 职场文书
职业生涯规划书范文
2014/03/10 职场文书
教师新年寄语
2014/04/03 职场文书
入党自传范文2015
2015/06/26 职场文书
推广普通话的宣传语
2015/07/13 职场文书