原生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实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
Jquery 最近浏览过的商品的功能实现代码
May 14 Javascript
jquery中通过父级查找进行定位示例
Jun 28 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
浅谈javascript中的constructor
Jun 08 Javascript
通过BootStrap实现轮播图的实际应用
Sep 26 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
Vue filter介绍及详细使用
Apr 04 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
May 05 Javascript
ES6 Symbol数据类型的应用实例分析
Jun 26 Javascript
Vue3.0的优化总结
Oct 16 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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
Protoss魔法科技
2020/03/14 星际争霸
从手册去理解分析PHP session机制
2011/07/17 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
three.js 入门案例详解
2018/01/23 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
Python中的lstrip()方法使用简介
2015/05/19 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
竞选文艺委员演讲稿
2014/04/28 职场文书
助理政工师申报材料
2014/06/03 职场文书
党的生日演讲稿
2014/09/10 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
2014年个人年终总结
2015/03/09 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏