原生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 相关文章推荐
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
Dec 20 Javascript
jQuery中die()方法用法实例
Jan 19 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
vuex的简单使用教程
Feb 02 Javascript
vue.js图片转Base64上传图片并预览的实现方法
Aug 02 Javascript
简述pm2常用命令集合及配置文件说明
May 30 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
Vue 数据响应式相关总结
Jan 28 Vue.js
基于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 第二节 数据类型之数组
2012/04/28 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
jQuery常见开发技巧详细整理
2013/01/02 Javascript
jquery禁用右键示例
2014/04/28 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
python分割和拼接字符串
2013/11/01 Python
python继承和抽象类的实现方法
2015/01/14 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
详解如何修改python中字典的键和值
2020/09/29 Python
python复合条件下的字典排序
2020/12/18 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
建筑专业自荐信
2013/10/18 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
普通党员对照检查材料
2014/08/28 职场文书
旷课检讨书
2015/01/26 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
黑白记忆观后感
2015/06/18 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python