仿某宝6位数字密码输入框,密码输入框

  上一个月将在过大年了,以为某些瞎忙。翻了翻博客,认为下月都在打老抽啊。借口那么多,其实真正有些懒了,呵呵!

  今日,项目有个效用和某宝购物支出密码的输入框有点类似,就和好写了那篇博文,权当计算笔记吧。

仿某宝6位数字密码输入框,密码输入框。创造三个UITextField,珍视是创造三个哦,
然后用5根竖线实行私分,那样就是让大家看来了一个有陆个壹律的输入框在那边躺着了;
你说输入时万分黑点点啊,我们得以经过创办三个长方形的UIView,设置圆角为宽高的二分之一,正是二个圆了,
具体如何在当中显示,即是概念这几个鲜红圆点的frame啊,让他突显在中游。

  作者争取在放假前,将本人计算以及度岁布置发出来,把温馨创制为勉族,否则真要浑噩度日了。

  啰嗦半天了,直接上代码:

可以禁止UITextField的粘合复制功效

  前几日,项目有个功用和某宝购物支出密码的输入框有点类似,就和好写了那篇博文,权当总括笔记吧。

结构层:

 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender { 

  啰嗦半天了,直接上代码:

<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>

         return NO;

结构层:

<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>

因而结构层,分析下粗粗思路

本效能正是一个忠实输入框和四个假输入框的典故。

  • 将真实输入框和假输入框容器都固定重叠,注意将忠实输入框的先行级设置较高,不然就输入不了咯。
  • 为了做成看似假输入框在输入,则将真实输入框隐藏,用opacity隐藏哦。
  • 用户输入时,通过行为层js将真实输入框的值分配给各种假输入框。
  • 输入的还要,调控假输入框光标的成效,作者用了一张某宝的图片做成的,实际上,假输入框是没有博获得关键的。

注意:

  这里实在输入框的type类型用的是tel,而不是number。因为后者会扭转小箭头呀,前者在用户点击输入框时app判定type是tel就能弹出数字输入键盘越来越好。

经过结构层,分析下差不离思路:

 }

表现层:

图片 1图片 2

.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; }

View
Code

  样式里面就2个稳住重叠,一个掩蔽真实输入框,笔者就不想多唠叨了。css作者用sass写的,转译css有点乱,博友们将就看看吧。

本成效就是贰个实打实输入框和5个假输入框的逸事。

demo:

 行为层:

$(".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端包容难点,所以加了点正则。

我并未有啥样复杂的东西,小编就不多啰嗦了,需求小心的地点都加注释了。

沾满完整代码:

图片 3图片 4

<!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>

View Code

功能演示:

回乡撸的代码和供销合作社写的时候有些出入,万变不离其宗,效果出来就ok啦。

要度岁咯,有个世界公敌已应际而生^_^一个’懒’字足矣击败everybody!浪起来丫!

 

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

GitHub:

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

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

相关文章