天天看點

分享一個PC端六格密碼輸入框寫法

分享一個PC端六格密碼輸入框寫法

如圖。我們一般做商城類的項目不免會用到支付密碼輸入框,我研究了下并決定發上來,也當作是自己成長路上的一點小小的記錄。本次介紹的是基于vue的項目

html:

<template>
  <div class='am_payPwd' :id="`ids_${id}`">
    <input type="password"
      maxlength="1"
      @input="changeInput"
      @click="changePwd"
      v-model="pwdList[i]"
      @keyup="keyUp($event)"
      @keydown="oldPwdList = pwdList.length"
      class="shortInput"
      v-for="(v, i) in 6" :key="i">
  </div>
</template>      

css:

.am_payPwd {
  display: inline-block;
  width: 242px;
  height: 40px;
  border: 1px solid #999;
  border-radius: 5px;
  padding: 10px 0;
  position: relative;
  margin-left: 1px;
  .shortInput {
    text-align: center;
    font-size: 20px;
    float: left;
    width: 40px;
    height: 20px;
    color: #333;
    outline: #ff0067;
    &:not(:last-child) {
      border-right: 1px solid #999;
    }
  }
}      

js:

data () {
    return {
      pwdList: [],
      oldPwdList: [],
      isDelete: false,
      ipt: ''
    }
  },
  props: {
    id: String, // 當一個頁面有多個密碼輸入框時,用id來區分
    default: '1'
  },
  mounted () {  
    this.ipt = document.querySelectorAll(`#ids_${this.id} .shortInput`)
  },
  methods: {
    keyUp (ev) {
      let index = this.pwdList.length
      if (!index) return
      if (ev.keyCode === 8) {
        this.isDelete = true
        if (this.oldPwdList === this.pwdList.length) {
          if (index === this.pwdList.length) {
            this.pwdList.pop()
          }
          index--
        } else {
          index > 0 && index--
        }
        this.ipt[index].focus()
      } else if (this.isDelete && index === this.pwdList.length && /^\d$/.test(ev.key)) {
        this.isDelete = false
        this.pwdList.pop()
        this.pwdList.push(ev.key)
        this.ipt[this.pwdList.length] && this.ipt[this.pwdList.length].focus()
      }
      this.$emit('getPwd', this.pwdList.join(''))
    },
    changePwd () {
      let index = this.pwdList.length
      index === 6 && index--
      this.ipt[index].focus()
    },
    changeInput () {
      let index = this.pwdList.length
      let val = this.pwdList[index - 1]
     if (!/[0-9]/.test(val)) { 
        this.pwdList.pop()            
        return       
      }
      if (!val) {
        this.pwdList.pop()
        index--
        if (index > 0) this.ipt[index - 1].focus()
      } else {
        if (index < 6) this.ipt[index].focus()
      }
    }
  }      

如有考慮不周的,請指出

每一次的記錄,都是向前邁進的一步

繼續閱讀