uniapp~v3 移动端验证码分割的实现

2023-08-09  本文已影响0人  焚心123

直接打开链接查看效果图(https://mp-91187d2c-1225-4c77-b616-a32b09715ff4.cdn.bspapp.com/cloudstorage/微信图片_20230810154501.png)

input中的maxlength不能一开始写死,否则当你复制的数据大于6之后,input是展示,但是页面效果不会展示,所以做了一个动态的控制,我写的有个小bug,当你输入完最后一个数据,点击最后数据删除的时候,不会显示光标,删除一个数据之后才会展示,原因是下面class的判断有问题,你也可以试着修改下

<view class="flexr flexcc f40 c25 m-t-72 box" @click="showBtn">
            <template v-for="(item,index) in 6" :key="index">
                <view class="box-v">{{code[index]}}
                <view :class="(code.length) == index&&show==1?'ac':''"> 
                </view>
                </view>
            </template>
            <input type="number" ref="inp" :maxlength="m"  class="inp f40 c25" v-model="code"  @input="inputFun" >
</view>
const data = reactive({
    code:'',//当前的验证码
    show:0,//当用户点击之后在展示光标
    m:-1//maxlength,-1可以无限输入
})
const inputFun = e=>{
    if(data.code.length>6){
        data.code = data.code.slice(0,6)    
        data.m=6
    }else if(data.code.length==0){
        data.m = -1
    }
}
      .box{
            position: relative;
            // padding:0 20upx;
            .box-v{
                width: 74upx;
                height: 60upx;
                line-height: 60upx;
                box-sizing: border-box;
                text-align: center;
                padding: 4upx 0;
                border-bottom: 1upx solid #B6BDD0;
                position: relative;
                margin-right: 40upx;
            }
            .box-v:last-child{
                margin-right: 0;
            }
            .ac{
                position: absolute;
                width: 2upx;
                height: 60upx;
                background-color: #000;
                top: 0;
                left: 20%;
                transform: translate(-20%);
                animation: shan 1s linear infinite;
            }
            @keyframes shan {
                0%{
                    opacity: 0;
                }
                100%{
                    opacity: 1;
                }
            }
            .inp{
                position: absolute;
                height: 60upx;
                width: 100%;
                // letter-spacing: 84upx;
                // padding-left: 30upx;
                // border: 1upx solid #000;
                opacity: 0;
            }
        }
上一篇下一篇

猜你喜欢

热点阅读