首页 > 编程 > JavaScript > 正文

JavaScript仿支付宝6位数字密码输入框

2019-11-19 18:12:51
字体:
来源:转载
供稿:网友

  前几天,项目有个功能和某宝购物支付密码的输入框有点类似,就自己写了这篇博文,权当总结笔记吧。

  嗦半天了,直接上代码:

结构层:

<div>  <div>请在下方输入6位数字</div>  <div class="ipt-box-nick">  <input type="tel" maxlength="6" class="ipt-real-nick"/>  <div class="ipts-box-nick">   <div class="ipt-fake-box">   <input type="text" >   <input type="text" >   <input type="text" >   <input type="text" >   <input type="text" >   <input type="text" >   </div>  </div>  <div class="ipt-active-nick"><img src="https://t.alipayobjects.com/images/rmsweb/T1nYJhXalXXXXXXXXX.gif"></div>  </div> </div>

通过结构层,分析下大概思路:

本功能就是一个真实输入框和6个假输入框的故事。

将真实输入框和假输入框容器都定位重叠,注意将真实输入框的优先级设置较高,不然就输入不了咯。

为了做成看似假输入框在输入,则将真实输入框隐藏,用opacity隐藏哦。

用户输入时,通过行为层js将真实输入框的值分配给每个假输入框。

输入的同时,控制假输入框光标的效果,我用了一张某宝的图片做成的,实际上,假输入框是没有获取到焦点的。

注意:

  这里真实输入框的type类型用的是tel,而不是number。因为后者会生成小箭头呀,前者在用户点击输入框时app判断type是tel就会弹出数字输入键盘更好。

表现层:

.ipt-box-nick { height: 40px !important; line-height: 40px !important; position: relative !important; } .ipt-box-nick .ipt-real-nick { position: absolute !important; top: 0 !important; left: 0 !important; width: 100%; height: 40px !important; line-height: 40px !important; opacity: 0 !important; z-index: 3 !important; } .ipt-box-nick .ipts-box-nick { position: absolute !important; top: 0 !important; left: 0 !important; z-index: 1 !important; width: 100%; height: 40px !important; line-height: 40px !important; overflow: hidden; } .ipt-box-nick .ipts-box-nick .ipt-fake-box {  height: 40px !important;  line-height: 40px !important;  display: flex !important;  justify-content: space-between !important; }  .ipt-box-nick .ipts-box-nick .ipt-fake-box input {  width: 40px !important;  height: 40px !important;  border: 1px solid #D7D7D7 !important;  color: #810213 !important;  font-weight: bold !important;  font-size: 18px !important;  text-align: center !important;  padding: 0 !important; } .ipt-box-nick .ipt-active-nick { width: 40px !important; height: 40px !important; line-height: 40px !important; text-align: center; position: absolute !important; top: 0; left: 0; z-index: 2; } .ipt-box-nick .ipt-active-nick img {  vertical-align: middle; }

  样式里面就一个定位重叠,一个隐藏真实输入框,我就不想多唠叨了。css我用sass写的,转译css有点乱,博友们将就看看吧。

 行为层:

$(".ipt-real-nick").on("input", function() {  //console.log($(this).val());  var $input = $(".ipt-fake-box input");  if(!$(this).val()){//无值光标顶置   $('.ipt-active-nick').css('left',$input.eq(0).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');  }  if(/^[0-9]*$/g.test($(this).val())){//有值只能是数字   //console.log($(this).val());   var pwd = $(this).val().trim();   for (var i = 0, len = pwd.length; i < len; i++) {   $input.eq(i).val(pwd[i]);   if($input.eq(i).next().length){//模拟光标,先将图片容器定位,控制left值而已    $('.ipt-active-nick').css('left',$input.eq(i+1).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');   }   }   $input.each(function() {//将有值的当前input后的所有input清空   var index = $(this).index();   if (index >= len) {    $(this).val("");   }   });   if (len == 6) {   //执行其他操作   console.log('输入完整,执行操作');   }  }else{//清除val中的非数字,返回纯number的value   var arr=$(this).val().match(//d/g);   $(this).val($(this).val().slice(0,$(this).val().lastIndexOf(arr[arr.length-1])+1));   //console.log($(this).val());  }  });

因为tel类型,在pc端兼容问题,所以加了点正则。

本身没有什么复杂的东西,我就不多嗦了,需要注意的地方都加注释了。

附上完整代码:

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>仿支付宝数字密码输入框</title> <style>  .ipt-box-nick {   width:300px;   height: 40px !important;   line-height: 40px !important;   position: relative !important; }  .ipt-box-nick .ipt-real-nick {   position: absolute !important;   top: 0 !important;   left: 0 !important;   width: 100%;   height: 40px !important;   line-height: 40px !important;   opacity: 0 !important;   z-index: 3 !important; }  .ipt-box-nick .ipts-box-nick {   position: absolute !important;   top: 0 !important;   left: 0 !important;   z-index: 1 !important;   width: 100%;   height: 40px !important;   line-height: 40px !important;   overflow: hidden; }  .ipt-box-nick .ipts-box-nick .ipt-fake-box {   height: 40px !important;   line-height: 40px !important;   display: flex !important;   justify-content: space-between !important; }  .ipt-box-nick .ipts-box-nick .ipt-fake-box input {   width: 40px !important;   height: 38px !important;   border: 1px solid #D7D7D7 !important;   color: #810213 !important;   font-weight: bold !important;   font-size: 18px !important;   text-align: center !important;   padding: 0 !important;   border-radius:2px;}  .ipt-box-nick .ipt-active-nick {   width: 40px !important;   height: 40px !important;   line-height: 40px !important;   text-align: center;   position: absolute !important;   top: 0;   left: 0;   z-index: 2; }  .ipt-box-nick .ipt-active-nick img {   vertical-align: middle; } </style></head><body><div> <div class="lh40-nick h40-nick fwb-nick">请在下方输入6位数字</div> <div class="ipt-box-nick mb15-nick">  <input type="tel" maxlength="6" class="ipt-real-nick"/>  <div class="ipts-box-nick">   <div class="ipt-fake-box">    <input type="text" >    <input type="text" >    <input type="text" >    <input type="text" >    <input type="text" >    <input type="text" >   </div>  </div>  <div class="ipt-active-nick"><img src="https://t.alipayobjects.com/images/rmsweb/T1nYJhXalXXXXXXXXX.gif"></div> </div></div><script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script><script> $(".ipt-real-nick").on("input", function() {  //console.log($(this).val());  var $input = $(".ipt-fake-box input");  if(!$(this).val()){//无值光标顶置   $('.ipt-active-nick').css('left',$input.eq(0).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');  }  if(/^[0-9]*$/g.test($(this).val())){//有值只能是数字   //console.log($(this).val());   var pwd = $(this).val().trim();   for (var i = 0, len = pwd.length; i < len; i++) {    $input.eq(i).val(pwd[i]);    if($input.eq(i).next().length){//模拟光标,先将图片容器定位,控制left值而已     $('.ipt-active-nick').css('left',$input.eq(i+1).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');    }   }   $input.each(function() {//将有值的当前input后的所有input清空    var index = $(this).index();    if (index >= len) {     $(this).val("");    }   });   if (len == 6) {    //执行其他操作    console.log('输入完整,执行操作');   }  }else{//清除val中的非数字,返回纯number的value   var arr=$(this).val().match(//d/g);   $(this).val($(this).val().slice(0,$(this).val().lastIndexOf(arr[arr.length-1])+1));   //console.log($(this).val());  } });</script></body></html>

效果演示:

以上所述是小编给大家介绍的JavaScript仿支付宝6位数字密码输入框,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表