微信小程序之自定义验证码or密码输入框 - 薛将军

时间:2024-02-21 17:10:34

微信小程序之自定义验证码or密码输入框

业务场景:

  小程序中有地方用到需要自定义输入验证码或者密码的地方,例如:

 

或者

 

 

这类场景。

需求:n个方框为输入框,框中有光标,且光标随着输入字符移动,输入完成后隐藏输入框/自动校验等

实现:方框用div模拟输入框,然后一个输入框覆盖在方框div上,光标用动画实现

伪代码:

wxml文件:

<view class="input">
  <view class="input-item" wx:for="{{4}}" wx:key="index" data-index="{{index}}">
    <view class="input-value">{{password[index]}}</view>
    <view class="focus {{index === focusIndex ? \'show\': \'hide\'}}"></view>
 </view>
 <input class="input-password" maxlength="4" bindinput="setValue" bindblur="inputBlur" type="number" focus="{{focus}}"></input>
</view>

js文件:

Component({
  /**
   * 组件的初始数据
   */
  data: {
    focusIndex: 0, // 光标所在位置
    value: \'\', // 实际输入的值
    focus: true, // 是否获得焦点
    password: \'\', //替换显示的值*
  },
  /**
   * 组件的方法列表
   */
  methods: {
    setValue (e) {
      // 设置光标
      var value = e.detail.value
      this.setData({
        value: value,
        focusIndex: value.length,
        focus: value.length < 4,
        password: \'*\'.repeat(value.length)
      })
    },
    inputBlur (e) {
      if (e.detail.value.length === 4) {
        this.triggerEvent(\'complated\', {
          value: e.detail.value
        })
      }
    }
  }
})

wxss文件:

.input {
  margin-top: 70rpx;
  padding: 0 60rpx;
  position: relative;
}
.input-item {
  position: relative;
  display: inline-block;
  width: 90rpx;
  height: 90rpx;
  border-bottom: 2rpx solid #333;
}
.input-item:not(:first-child) {
  margin-left: 26.67rpx;
}
.input-value {
  display: inline-block;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  font-size: 28rpx;
}
.input-password {
  position: absolute;
  left: -360rpx;
  top: 0;
  height: 90rpx;
  width: 880rpx;
  opacity: 0;
}
.focus {
  width: 2rpx;
  height: 50rpx;
  background-color: #333;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
.show {
  display: block;
  animation: blink 1s linear infinite;
}
.hide {
  display: none;
}

@keyframes blink {
  0%, 50% {
    opacity: 1;
  }

  50.01%, to {
    opacity: 0;
  }
}

大致这样,password可以做明文替换为*

 骚操作就是将input定位在自定义div上面,并且将input的宽度拉大,然后向左移动整个模拟div的宽度,隐藏掉它。