视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript实现淘宝京东6位数字支付密码效果
2020-11-27 22:09:41 责编:小采
文档

京东淘宝的密码输入框功能点

  • 只能输入数字
  • 只能输入6位字符
  • 每次输入一个字符,对应位置的小黑点显示
  • 每次删除一个字符,对应位置的小黑点消失
  • 实现思路

    1、写好6位密码输入框的静态样式和html结构
    2、将密码输入框input定位到父容器,覆盖之前写好的6位密码输入框区域,并设置为透明
    3、虽然设置了密码输入框为透明,但当密码输入框获得焦点的时候,输入框的光标会显示出来,并不是透明状态。为了解决这个问题,暂时想到了两种方法,第一种,利用css将光标也设置为透明,不过这种方法有一定的兼容问题;第二种,当输入框获得焦点的时候,将输入框定位到屏幕外面,用户看不到输入框,自然也就看不到光标在那里一闪一闪了。
    4、对于用户只能输入数字的功能,这里用正则表达式就搞定了,如果用户输入了非数字字符,将input输入框的值清空
    5、对于用户输入超过6位字符的情况,利用字符串的截取方法截取input.value的前6位字符
    6、循环遍历圆点,将index小于input.value.length的圆点显示出来
    7、用户输入超过6个的数字的时候,你再去删除,你会发现要删除很多字符,那些小圆点才会相应的消失,所以这里,将截取的6位字符赋值给input输入框的值,让input.value长度永远小于等于6

    HTML结构

    父容器 input-ps 用于input输入框的定位
    一位密码对应一个input-ps-item和dot

    <div class="input-ps">
     <div class="input-ps-item">
     <span class="dot"></span> //小圆点
     </div>
     <div class="input-ps-item">
     <span class="dot"></span>
     </div>
     <div class="input-ps-item">
     <span class="dot"></span>
     </div>
     <div class="input-ps-item">
     <span class="dot"></span>
     </div>
     <div class="input-ps-item">
     <span class="dot"></span>
     </div>
     <div class="input-ps-item last">
     <span class="dot"></span>
     </div>
     <input id="input-mima" class="input-mima" type="text"/>
    </div>
    

    CSS样式

    css样式自己定义就行,想要什么样式自己写~~~注意几个关键点

    dot初始状态为隐藏状态
    input输入框为绝对定位,覆盖在6个密码块上,设置为透明

    .input-ps{
     position: relative;
     display: flex;
     align-items: center;
     width: 8.28125rem;
     height: 1.375rem;
     margin: 0 auto;
     border: 1px solid #d9d9d9;
     border-radius: 0.1875rem;
     background-color: #fff;
    }
    .input-ps-item{
     display: flex;
     justify-content: space-around;
     align-items: center;
     flex: 1;
     height: 0.78125rem;
     border-right: 1px solid #d9d9d9;
    }
    .last{
     border: none;
    }
    .dot{
     display: none;
     width: 0.234375rem;
     height: 0.234375rem;
     border-radius: 0.234375rem;
     background-color: #363e49;
    }
    .input-mima{
     position: absolute;
     left: 0;
     top: 0;
     height: 1.375rem !important;
     color: transparent;
     opacity: 0;
    }

    JS脚本

    /**
     * 获取dom节点
     */
     var dom = {
     $input_mima : document.getElementById("input-mima") //隐藏起来的密码输入框
     }
    
     /**
     * 隐藏的密码输入框获得焦点事件
     * 输入框获得焦点后,将输入框的定位定到屏幕看不见的位置
     */
     dom.$input_mima.addEventListener("focus",function(){
     this.style.top = "-10000px";
     })
     /**
     * 隐藏的密码输入框失去焦点事件
     * 输入框失去焦点后,将输入框的定位定原来的位置
     */
     dom.$input_mima.addEventListener("blur",function(){
     this.style.top = "0";
     })
     /**
     * 隐藏的输入框输入值的事件
     * 判断输入的值中是否都是数字
     * 如果都是数字,截取最前面6位数字
     * 如果不全是数字,将输入框中的值设置空
     * 遍历dot点,将和输入框内值的长度一致的dot个数显示出来
     *
     */
     dom.$input_mima.addEventListener("input",function(){
     var mima ;
     //正则判断输入的值是否全是数字
     if(/^[0-9]*$/.test(this.value)){
     mima = this.value.substring(0,6); //截取输入框中值的前6个字符
     this.value = mima; //将输入框中的值设置位截取到的值
     }else{
     mima = "";
     this.value = mima; //将输入框的值设置位空
     }
     //遍历圆点dot,将index小于密码长度的圆点显示出来。这里我是用的mui框架的遍历方法,如果你用的不是mui框架,可以换成其他的方式遍历,下面有一个原生JS的循环方法
     mui(".dot").each(function(index){
     if(index < mima.length){
     this.style.display = "block";
     }else{
     this.style.display = "none";
     }
     })
     //原生的循环方法 - ,-
     // var dot_list = document.getElementsByClassName("dot");
     // for(var index =0;index<dot_list.length;index++){
     // if(index < mima.length){
     // dot_list[index].style.display = "block";
     // }else{
     // dot_list[index].style.display = "none";
     // }
     // }
    
     //输入的密码达到6位之后判断密码是否正确,这边模拟了一下正确密码是123456的情况
     //密码正确之后进行你想要的操作
     //如果不希望输入的密码字符达到6位后自动进行业务逻辑的代码,这部分可以不写,将你的业务逻辑绑定到别的节点
     if(mima.length >=6){
     //TODO 这里写业务逻辑代码
     //模拟密码
     if(mima == "123456"){
     //TODO 这里写业务逻辑代码
     }
    
     }
    })

    下载本文
    显示全文
    专题