原生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 相关文章推荐
jquery 简单的进度条实现代码
Mar 11 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
Nov 01 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 Javascript
Bootstrap Fileinput文件上传组件用法详解
May 10 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
May 18 Javascript
Bootstrap 布局组件(全)
Jul 18 Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 Javascript
微信小程序-小说阅读小程序实例(demo)
Jan 12 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 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实现LOL数据远程获取
2014/06/10 PHP
8个PHP数组面试题
2015/06/23 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
jquery 简单导航实现代码
2009/09/11 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python数组复制拷贝的实现方法
2015/06/09 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
python sorted方法和列表使用解析
2019/11/18 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
python+opencv实现车道线检测
2021/02/19 Python
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
素食餐饮项目创业计划书
2014/02/02 职场文书
建房协议书
2014/04/11 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis