zoukankan      html  css  js  c++  java
  • 仿某宝6位数字密码输入框

      下个月就要过年了,感觉有点瞎忙。翻了翻博客,感觉这个月都在打酱油啊。借口那么多,其实真的有点懒了,呵呵!

      我争取在放假前,将自我总结以及来年计划发出来,把自己打造为勉族,不然真要浑噩度日了。

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

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

    结构层:

    <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; }
    View Code

      样式里面就一个定位重叠,一个隐藏真实输入框,我就不想多唠叨了。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>
    View Code

    效果演示:

    回家撸的代码和公司写的时候有点出入,万变不离其宗,效果出来就ok啦。

    要过年咯,有个世界公敌已出现^_^一个'懒'字足矣打败everybody!浪起来丫!

     

  • 相关阅读:
    IOS8 设置TableView Separatorinset 分割线从边框顶端开始
    文件目录的访问
    The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法:
    NSString 的常见方法
    如何在一个工作站里创建多个工程(同一个xcode下面创建多个工程)
    自定义NSLog
    内存恶鬼drawRect
    URL编码解码
    怎样在UICollectionView中添加Header和footer
    本人开始玩微信公众号了!名称:BHS编程技术交流分享,只发干货,不发水文,欢迎阅读
  • 原文地址:https://www.cnblogs.com/puyongsong/p/6223798.html
Copyright © 2011-2022 走看看