• vue 移动端车牌键盘


    1.npm install input-plate-number --save 样式可以,键盘相对严谨,但是输入有bug,

    2.npm install vue-carplate --save         插件样式个人看来是最好看的,键盘的输入最严谨,但是没有新能源车牌的选项,

    3.https://github.com/Pinenutss/LicensePlate  插件是样式不好看,键盘的输入也不严谨,但是有新能源车牌,

    https://github.com/liaoyinglong/plate-number-input依赖  样式、键盘输入都可以,但和项目(37.5px)不适配,也不好修改

    4.最终使用手写的车牌键盘(vue+vant),易于修改各种需求

    车牌键盘
    <template>
      <div class="plateNumber">
        <div class="wrap">
          <van-tabs v-model="formData.commonCard">
            <van-tab title="普通车牌" name="1"></van-tab>
            <van-tab title="新能源车牌" name="2"></van-tab>
          </van-tabs>
          <!-- 车牌号码输入框 -->
          <div class="num-box">
            <div :class="{ active: activeKeyWordIndex == 0, num0: true }" @click="clickFirstWrap()">
              <span>{{ formData.num0 }}</span>
            </div>
            <div :class="{ active: activeKeyWordIndex == 1, num1: true }" @click="clickKeyWordWrap(1)">
              <span>{{ formData.num1 }}</span>
            </div>
            <em class="spot"></em>
            <div :class="{ active: activeKeyWordIndex == 2, num1: true }" @click="clickKeyWordWrap(2)">
              <span>{{ formData.num2 }}</span>
            </div>
            <div :class="{ active: activeKeyWordIndex == 3, num1: true }" @click="clickKeyWordWrap(3)">
              <span>{{ formData.num3 }}</span>
            </div>
            <div :class="{ active: activeKeyWordIndex == 4, num1: true }" @click="clickKeyWordWrap(4)">
              <span>{{ formData.num4 }}</span>
            </div>
            <div :class="{ active: activeKeyWordIndex == 5, num1: true }" @click="clickKeyWordWrap(5)">
              <span>{{ formData.num5 }}</span>
            </div>
            <div :class="{ active: activeKeyWordIndex == 6, num1: true }" @click="clickKeyWordWrap(6)">
              <span>{{ formData.num6 }}</span>
            </div>
            <div
              v-if="formData.commonCard == '2'"
              :class="{ active: isActive == 7, num1: true }"
              @click="clickKeyWordWrap(7)"
            >
              <span>{{ formData.num7 }}</span>
            </div>
          </div>
          <div style="margin: 16px; margin-top: 1rem">
            <van-button round block type="info" @click="submitFn()">确认</van-button>
          </div>
        </div>
        <div class="keyboard-wrap" v-if="firstWrapStatus">
          <div class="keyboard" >
            <van-button v-for="(item, index) in abbPlate._1" :key="index" @click="selectFirstWord(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard" >
            <van-button v-for="(item, index) in abbPlate._2" :key="index" @click="selectFirstWord(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard" >
            <van-button v-for="(item, index) in abbPlate._3" :key="index" @click="selectFirstWord(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard" >
            <van-button v-for="(item, index) in abbPlate._4" :key="index" @click="selectFirstWord(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard" >
            <van-button v-for="(item, index) in abbPlate._5" :key="index" @click="selectFirstWord(item)">{{ item }}</van-button>
            <span class="bordernone"></span>
          </div>
    
        </div>
        <div class="keyboard-wrap" v-if="keyBoardStatus">
          <!-- <div class="number-wrap"></div>
          <div class="letter-wrap"></div>
          <div class="cn-wrap"></div> -->
          <div class="keyboard"  v-if="activeKeyWordIndex !== 1">
            <van-button v-for="(item, index) in allKeyWord._1" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard" v-if="activeKeyWordIndex !== 1">
            <van-button v-for="(item, index) in allKeyWord._2" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
          </div>
          <div class="keyboard">
            <van-button v-for="(item, index) in allKeyWord._3" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard">
            <van-button v-for="(item, index) in allKeyWord._4" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard">
             <van-button v-for="(item, index) in allKeyWord._5" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
          </div>
          <div class="keyboard">
            <van-button v-for="(item, index) in allKeyWord._6" :key="index" @click="clickKeyBoard(item)">{{ item }}</van-button>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <!-- <span class="delete" @click="deleteWord"><img src="@/assets/images/icon-delete.png" alt="" /></span> -->
          </div>
          <div class="keyboard" v-if="(activeKeyWordIndex === 6 && formData.commonCard == '1') || activeKeyWordIndex === 7">
            <span v-for="(item, index) in allKeyWord._7" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
          </div>
          <div class="cancel">
            <span @click="clearInput()">清除</span>
            <span @click="keyBoardStatus = false">关闭</span>
          </div>
        </div>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          formData: {
            commonCard: '1',
            num0: '',
            num1: '',
            num2: '',
            num3: '',
            num4: '',
            num5: '',
            num6: '',
            num7: ''
          },
          abbPlate: {
            _1: ['京','沪','津','渝','鲁','冀','晋'],
            _2: ['蒙','辽','吉','黑','苏','浙','皖'],
            _3: ['闽','赣','豫','湘','鄂','粤','桂'],
            _4: ['琼','川','贵','云','藏','陕','甘'],
            _5: ['青','宁','新','港','澳','台'],
          },
          allKeyWord: {
            _1: [1, 2, 3, 4, 5, 6, 7],
            _2: [8, 9, 0],
            _3: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
            _4: ['H', 'J', 'K', 'L', 'M', 'N', 'O'],
            _5: ['P', 'Q', 'R', 'S', 'T', 'U', 'V'],
            _6: ['W', 'X', 'Y', 'Z'],
            _7: ['港', '澳', '学', '领', '警']
          },
          activeKeyWordIndex: 0, // 当前车牌号
          keyBoardStatus: false,
          firstWrapStatus: false, // 选择弹窗
          confirmTitle: '',
          submitConfirm: false,
          submitConfirmFalse: false,
          submitConfirmText: '',
    
          isActive: 0
        }
      },
      mounted() {},
      methods: {
        clearInput() {
          this.formData = {
            commonCard: '1',
            num0: '',
            num1: '',
            num2: '',
            num3: '',
            num4: '',
            num5: '',
            num6: '',
            num7: ''
          }
        },
        clickFirstWrap() {
          // 点击第一个输入框
          this.firstClickStatus = true
          this.firstWrapStatus = true
          this.keyBoardStatus = false
          this.formData.num0 = ''
    
          this.activeKeyWordIndex = 0
        },
        selectFirstWord(value) {
          // 选择省份
          // if (event.target.localName !== 'span') {
          //   return
          // }
          // this.formData.num0 = event.target.innerText
          this.formData.num0 = value
          this.firstSelectStatus = true
          this.firstWrapStatus = false
          this.firstClickStatus = false
          this.keyBoardStatus = true
          this.activeKeyWordIndex = 1
          // this.$refs.num1.focus()
          // document.getElementById('num1').focus()
        },
        clickKeyBoard(item) {
          // 点击自定义键盘
          console.log(item)
          this.formData['num' + this.activeKeyWordIndex] = item
    
          if (this.formData.commonCard === '1') {
            this.activeKeyWordIndex++
            if (this.activeKeyWordIndex > 6) {
              this.keyBoardStatus = false
              this.submitFn()
            }
          } else {
            this.activeKeyWordIndex++
            if (this.activeKeyWordIndex > 7) {
              this.keyBoardStatus = false
              this.submitFn()
            }
          }
        },
        deleteWord() {
          // 退格
          // console.log(this.activeKeyWordIndex)
          // console.log(this.formData['num' + (this.activeKeyWordIndex - 1)])
          if (this.activeKeyWordIndex > 1) {
            this.formData['num' + (this.activeKeyWordIndex - 1)] = ''
            this.activeKeyWordIndex--
          }
        },
        clickKeyWordWrap(activeKeyWordIndex) {
          console.log(activeKeyWordIndex)
          this.keyBoardStatus = true
          this.activeKeyWordIndex = activeKeyWordIndex
          this.formData['num' + this.activeKeyWordIndex] = ''
    
          this.isActive = activeKeyWordIndex
        },
        submitFn() {
          let plateLicense
          if (this.formData.commonCard === '1') {
            plateLicense = this.plate_license_1
            plateLicense = this.palindrome(plateLicense)
            if (plateLicense.length < 7) {
              // alert('请输入正确的车牌号')
              this.$toast('请输入正确的车牌号')
              return
            }
          }
          if (this.formData.commonCard === '2') {
            plateLicense = this.plate_license_2
            plateLicense = this.palindrome(plateLicense)
            if (plateLicense.length < 8) {
              // alert('请输入正确的车牌号')
               this.$toast('请输入正确的车牌号')
              return
            }
          }
          this.$emit('getPlateLicense', plateLicense)
          console.log(plateLicense)
          // alert(plateLicense)
        },
        palindrome(str) {
          var arr = str.split('')
          arr = arr.filter(function (val) {
            return (
              val !== ' ' &&
              val !== ',' &&
              val !== '.' &&
              val !== '?' &&
              val !== ':' &&
              val !== ';' &&
              val !== '`' &&
              val !== "'" &&
              val !== '_' &&
              val !== '/' &&
              val !== '-' &&
              val !== '\' &&
              val !== '' &&
              val !== '(' &&
              val !== ')'
            )
          })
          return arr.join('')
        },
        checkIsHasSpecialStr(str) {
          var flag = false
          var arr = str.split('')
          arr.forEach(val => {
            if (
              val === '!' ||
              val === '}' ||
              val === '{' ||
              val === ']' ||
              val === '[' ||
              val === '&' ||
              val === '$' ||
              val === '@' ||
              val === ' ' ||
              val === ',' ||
              val === '.' ||
              val === '?' ||
              val === ':' ||
              val === ';' ||
              val === '`' ||
              val === "'" ||
              val === '_' ||
              val === '/' ||
              val === '-' ||
              val === '\' ||
              val === '' ||
              val === '(' ||
              val === ')'
            ) {
              flag = true
            }
          })
          return flag
        },
        checkIsHasChineseStr(str) {
          var Reg = /.*[u4e00-u9fa5]+.*/
          if (Reg.test(str)) {
            return true
          }
          return false
        }
      },
      computed: {
        plate_license_1() {
          return (
            this.formData.num0 +
            this.formData.num1 +
            this.formData.num2 +
            this.formData.num3 +
            this.formData.num4 +
            this.formData.num5 +
            this.formData.num6
          )
        },
        plate_license_2() {
          return (
            this.formData.num0 +
            this.formData.num1 +
            this.formData.num2 +
            this.formData.num3 +
            this.formData.num4 +
            this.formData.num5 +
            this.formData.num6 +
            this.formData.num7
          )
        }
      }
    }
    </script>
    <style lang="scss" scoped>
    /deep/.van-tabs__line {
        background-color: #1989fa;
    }
    /deep/.van-button--normal {
        padding: 0;
    }
    .plateNumber {
      // font-size: 24px;
    }
    .flex-items-center {
      display: flex;
      align-items: center;
    }
    @-webkit-keyframes active {
      0% {
        opacity: 0.8;
      }
      50% {
        opacity: 0.4;
      }
      100% {
        opacity: 0.8;
      }
    }
    
    @keyframes active {
      0% {
        opacity: 0.8;
      }
      50% {
        opacity: 0.4;
      }
      100% {
        opacity: 0.8;
      }
    }
    
    // .active {
    //   -webkit-animation: active 2.2s infinite;
    //   animation: active 2.2s infinite;
    //   background-color: #1989fa;
    // }
    .wrap {
      height: 11.1rem;
      padding: 0.85rem 0.6rem;
      background-color: #fff;
      border-radius: 0.5rem;
      // input输入框
      .num-box {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-top: 1rem;
        .spot {
           0.1rem;
          height: 0.1rem;
          border-radius: 50%;
          background-color: #d8d8d8;
        }
        & > div {
           1rem;
          height: 1rem;
          border: 1px solid #e4e4e4;
          &.first {
            position: relative;
            text-align: center;
            line-height: 1.7rem;
            font-weight: 200;
            .input-wrap {
              position: absolute;
              top: 0;
              left: 0;
              right: 0;
              bottom: 0;
              &.active {
                z-index: 100;
              }
            }
            em {
              color: #979797;
              // font-size: 1.6rem;
              line-height: 1.7rem;
            }
            span {
              display: inline-block;
               100%;
              height: 100%;
              // background-color: #9cbce2;
              color: #000;
              line-height: 1rem;
            }
          }
          &.active {
            border: 1px solid #4a90e2;
            &:after {
              border-bottom: 0.5rem solid #4a90e2;
            }
          }
          span {
            display: flex;
            align-items: center;
            justify-content: center;
             100%;
            height: 100%;
            // font-size: 1rem;
            color: #000;
            &.first {
              background-color: #9cbce2;
              color: #fff;
              text-indent: 0.4rem;
              border-radius: 0;
            }
          }
        }
      }
    
      .info {
        // font-size: 0.5rem;
        margin-top: 0.9rem;
        color: #000;
        text-align: left;
        img {
           0.6rem;
          vertical-align: middle;
        }
      }
    }
    .first-word-wrap {
      // height: 9.4rem;
      background-color: #e0e0e0;
      padding: 0.4rem 0.4rem 0.6rem;
      position: fixed;
      bottom: 0;
      left: 0;
      right: 0;
      .first-word {
        display: flex;
        justify-content: space-between;
        margin-bottom: 0.45rem;
        .word {
          box-sizing: border-box;
           1rem;
          height: 1rem;
          // border: 1px solid #9cbce2;
          box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.35);
          border-radius: 0.16rem;
          text-align: center;
          &.bordernone {
            border: none;
            box-shadow: none;
          }
          span {
            box-sizing: border-box;
            display: flex;
            align-items: center;
            justify-content: center;
            text-align: center;
             100%;
            height: 100%;
            background-color: #fff;
            color: #000;
            // border: 1px solid #fff;
            border-radius: 0.125rem;
          }
          img {
             1.6rem;
          }
        }
        &:nth-last-of-type(1) {
          margin-bottom: 0rem;
        }
      }
    }
    .keyboard-wrap {
      background-color: #e0e0e0;
      position: fixed;
      bottom: 0;
      left: 0;
      right: 0;
      padding: 0.7rem 0.6rem 0.4rem;
      .keyboard {
        display: flex;
        justify-content: space-between;
        align-items: center;
        height: 1rem;
        margin-bottom: 0.3rem;
        span {
          text-align: center;
          display: flex;
           1rem;
          align-items: center;
          justify-content: center;
          height: 1rem;
          box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.35);
          background-color: #fff;
          border-radius: 0.125rem;
          &:active {
            background-color: #e4e4e4;
          }
          &.bordernone {
            border: none;
            box-shadow: none;
            background-color: #e0e0e0;
            &:active {
              background-color: #e0e0e0;
            }
          }
          &.delete {
            background-image: linear-gradient(to left, #25aae1, #1989fa, #25aae1);
            img {
               1.15rem;
            }
          }
        }
      }
      .cancel {
        display: flex;
        justify-content: space-between;
        align-items: center;
        // margin-top: -1.25rem;
        span {
          display: flex;
          align-items: center;
          justify-content: center;
           3.6rem;
          height: 1rem;
          background-image: linear-gradient(to left, #25aae1, #1989fa, #25aae1);
          color: #fff;
          border-radius: 0.125rem;
        }
      }
    }
    </style>

     5.不用插件的舶来品

    <template>
      <div class="plateNumber">
        <div class="wrap">
          <div class="radio-box">
            <label class="flex-items-center">
              <img v-if="formData.commonCard == 1" src="@/assets/images/icon_chose_s@2x.png" alt="" />
              <img v-else src="@/assets/images/icon_chose_n@2x.png" alt="" />
              <input type="radio" v-model="formData.commonCard" value="1" />普通车牌
            </label>
            <label class="flex-items-center">
              <img v-if="formData.commonCard == 2" src="@/assets/images/icon_chose_s@2x.png" alt="" />
              <img v-else src="@/assets/images/icon_chose_n@2x.png" alt="" />
              <input type="radio" v-model="formData.commonCard" value="2" />新能源车牌
            </label>
          </div>
          <div class="card-header">车牌号码:</div>
          <div class="num-box">
            <div class="num0" @click="clickFirstWrap()">
              <span>{{ formData.num0 }}</span>
            </div>
            <div class="num1" @click="clickKeyWordWrap(1)">
              <span>{{ formData.num1 }}</span>
            </div>
            <em class="spot"></em>
            <div class="num1" @click="clickKeyWordWrap(2)">
              <span>{{ formData.num2 }}</span>
            </div>
            <div class="num1" @click="clickKeyWordWrap(3)">
              <span>{{ formData.num3 }}</span>
            </div>
            <div class="num1" @click="clickKeyWordWrap(4)">
              <span>{{ formData.num4 }}</span>
            </div>
            <div class="num1" @click="clickKeyWordWrap(5)">
              <span>{{ formData.num5 }}</span>
            </div>
            <div class="num1" @click="clickKeyWordWrap(6)">
              <span>{{ formData.num6 }}</span>
            </div>
            <div v-if="formData.commonCard == '2'" class="num1" @click="clickKeyWordWrap(7)">
              <span>{{ formData.num7 }}</span>
            </div>
          </div>
    
          <div class="submit-box">
            <button @click="submitFn()">确认</button>
          </div>
        </div>
        <div class="first-word-wrap" v-if="firstWrapStatus">
          <div class="first-word" @click="selectFirstWord($event)">
            <div class="word">
              <span>京</span>
            </div>
            <div class="word">
              <span>湘</span>
            </div>
            <div class="word">
              <span>津</span>
            </div>
            <div class="word">
              <span>鄂</span>
            </div>
            <div class="word">
              <span>沪</span>
            </div>
            <div class="word">
              <span>粤</span>
            </div>
            <div class="word">
              <span>渝</span>
            </div>
            <div class="word">
              <span>琼</span>
            </div>
          </div>
          <div class="first-word" @click="selectFirstWord($event)">
            <div class="word">
              <span>翼</span>
            </div>
            <div class="word">
              <span>川</span>
            </div>
            <div class="word">
              <span>晋</span>
            </div>
            <div class="word">
              <span>贵</span>
            </div>
            <div class="word">
              <span>辽</span>
            </div>
            <div class="word">
              <span>云</span>
            </div>
            <div class="word">
              <span>吉</span>
            </div>
            <div class="word">
              <span>陕</span>
            </div>
          </div>
          <div class="first-word" @click="selectFirstWord($event)">
            <div class="word">
              <span>黑</span>
            </div>
            <div class="word">
              <span>甘</span>
            </div>
            <div class="word">
              <span>苏</span>
            </div>
            <div class="word">
              <span>青</span>
            </div>
            <div class="word">
              <span>浙</span>
            </div>
            <div class="word">
              <span>皖</span>
            </div>
            <div class="word">
              <span>藏</span>
            </div>
            <div class="word">
              <span>闽</span>
            </div>
          </div>
          <div class="first-word" @click="selectFirstWord($event)">
            <div class="word">
              <span>蒙</span>
            </div>
            <div class="word">
              <span>赣</span>
            </div>
            <div class="word">
              <span>桂</span>
            </div>
            <div class="word">
              <span>鲁</span>
            </div>
            <div class="word">
              <span>宁</span>
            </div>
            <div class="word">
              <span>豫</span>
            </div>
            <div class="word">
              <span>新</span>
            </div>
            <div class="word bordernone">
              <!-- <img src="@/assets/images/icon-switch.png" alt=""> -->
            </div>
          </div>
        </div>
        <div class="keyboard-wrap" v-if="keyBoardStatus === true">
          <!-- <div class="number-wrap"></div>
          <div class="letter-wrap"></div>
          <div class="cn-wrap"></div> -->
          <div class="keyboard" v-if="activeKeyWordIndex !== 1">
            <span v-for="(item, index) in allKeyWord._1" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
          </div>
          <div class="keyboard" v-if="activeKeyWordIndex !== 1">
            <span v-for="(item, index) in allKeyWord._2" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
          </div>
          <div class="keyboard">
            <span v-for="(item, index) in allKeyWord._3" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
          </div>
          <div class="keyboard">
            <span v-for="(item, index) in allKeyWord._4" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
          </div>
          <div class="keyboard">
            <span v-for="(item, index) in allKeyWord._5" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
          </div>
          <div class="keyboard">
            <span v-for="(item, index) in allKeyWord._6" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <span class="bordernone"></span>
            <!-- <span class="bordernone" v-if="activeKeyWordIndex === 1"></span>
              <span class="bordernone" v-if="activeKeyWordIndex === 1"></span> -->
            <!-- <span @click="deleteWord" v-if="activeKeyWordIndex === 1">x</span> -->
          </div>
          <div class="keyboard" v-if="activeKeyWordIndex !== 1">
            <span v-for="(item, index) in allKeyWord._7" :key="index" @click="clickKeyBoard(item)">{{ item }}</span>
            <span class="bordernone"></span>
            <span class="delete" @click="deleteWord"><img src="@/assets/images/icon-delete.png" alt="" /></span>
          </div>
          <div class="cancel">
            <span @click="keyBoardStatus = false">完成</span>
          </div>
        </div>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          formData: {
            commonCard: '1',
            num0: '',
            num1: '',
            num2: '',
            num3: '',
            num4: '',
            num5: '',
            num6: '',
            num7: ''
          },
          allKeyWord: {
            _1: [1, 2, 3, 4, 5, 6, 7],
            _2: [8, 9, 0],
            _3: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
            _4: ['H', 'J', 'K', 'L', 'M', 'N', 'O'],
            _5: ['P', 'Q', 'R', 'S', 'T', 'U', 'V'],
            _6: ['W', 'X', 'Y', 'Z'],
            _7: ['港', '澳', '学', '领', '警']
          },
          activeKeyWordIndex: 1, // 当前车牌号
          keyBoardStatus: false,
          firstWrapStatus: false, // 选择弹窗
          confirmTitle: '',
          submitConfirm: false,
          submitConfirmFalse: false,
          submitConfirmText: ''
        }
      },
      mounted() {},
      methods: {
        clickFirstWrap() {
          // 点击第一个输入框
          this.firstClickStatus = true
          this.firstWrapStatus = true
          this.keyBoardStatus = false
          this.formData.num0 = ''
        },
        selectFirstWord(event) {
          // 选择省份
          if (event.target.localName !== 'span') {
            return
          }
          this.formData.num0 = event.target.innerText
          this.firstSelectStatus = true
          this.firstWrapStatus = false
          this.firstClickStatus = false
          this.keyBoardStatus = true
          this.activeKeyWordIndex = 1
          // this.$refs.num1.focus()
          // document.getElementById('num1').focus()
        },
        clickKeyBoard(item) {
          // 点击自定义键盘
          console.log(item)
          this.formData['num' + this.activeKeyWordIndex] = item
    
          if (this.formData.commonCard === '1') {
            this.activeKeyWordIndex++
            if (this.activeKeyWordIndex > 6) {
              this.keyBoardStatus = false
            }
          } else {
            this.activeKeyWordIndex++
            if (this.activeKeyWordIndex > 7) {
              this.keyBoardStatus = false
            }
          }
        },
        deleteWord() {
          // 退格
          // console.log(this.activeKeyWordIndex)
          // console.log(this.formData['num' + (this.activeKeyWordIndex - 1)])
          if (this.activeKeyWordIndex > 1) {
            this.formData['num' + (this.activeKeyWordIndex - 1)] = ''
            this.activeKeyWordIndex--
          }
        },
        clickKeyWordWrap(activeKeyWordIndex) {
          this.keyBoardStatus = true
          this.activeKeyWordIndex = activeKeyWordIndex
          this.formData['num' + this.activeKeyWordIndex] = ''
        },
        submitFn() {
          let plateLicense
          if (this.formData.commonCard === '1') {
            plateLicense = this.plate_license_1
            plateLicense = this.palindrome(plateLicense)
            if (plateLicense.length < 7) {
              alert('请输入正确的车牌号')
              return
            }
          }
          if (this.formData.commonCard === '2') {
            plateLicense = this.plate_license_2
            plateLicense = this.palindrome(plateLicense)
            if (plateLicense.length < 8) {
              alert('请输入正确的车牌号')
              return
            }
          }
          this.$emit('getPlateLicense', plateLicense)
          console.log(plateLicense)
          alert(plateLicense)
        },
        palindrome(str) {
          var arr = str.split('')
          arr = arr.filter(function (val) {
            return (
              val !== ' ' &&
              val !== ',' &&
              val !== '.' &&
              val !== '?' &&
              val !== ':' &&
              val !== ';' &&
              val !== '`' &&
              val !== "'" &&
              val !== '_' &&
              val !== '/' &&
              val !== '-' &&
              val !== '\' &&
              val !== '' &&
              val !== '(' &&
              val !== ')'
            )
          })
          return arr.join('')
        },
        checkIsHasSpecialStr(str) {
          var flag = false
          var arr = str.split('')
          arr.forEach(val => {
            if (
              val === '!' ||
              val === '}' ||
              val === '{' ||
              val === ']' ||
              val === '[' ||
              val === '&' ||
              val === '$' ||
              val === '@' ||
              val === ' ' ||
              val === ',' ||
              val === '.' ||
              val === '?' ||
              val === ':' ||
              val === ';' ||
              val === '`' ||
              val === "'" ||
              val === '_' ||
              val === '/' ||
              val === '-' ||
              val === '\' ||
              val === '' ||
              val === '(' ||
              val === ')'
            ) {
              flag = true
            }
          })
          return flag
        },
        checkIsHasChineseStr(str) {
          var Reg = /.*[u4e00-u9fa5]+.*/
          if (Reg.test(str)) {
            return true
          }
          return false
        }
      },
      computed: {
        plate_license_1() {
          return (
            this.formData.num0 +
            this.formData.num1 +
            this.formData.num2 +
            this.formData.num3 +
            this.formData.num4 +
            this.formData.num5 +
            this.formData.num6
          )
        },
        plate_license_2() {
          return (
            this.formData.num0 +
            this.formData.num1 +
            this.formData.num2 +
            this.formData.num3 +
            this.formData.num4 +
            this.formData.num5 +
            this.formData.num6 +
            this.formData.num7
          )
        }
      }
    }
    </script>
    <style lang="scss" scoped>
    html {
      font-size: 20px !important;
    }
    .plateNumber {
      font-size: 24px;
    }
    .flex-items-center {
      display: flex;
      align-items: center;
    }
    .wrap {
      height: 11.1rem;
      margin: 0.5rem 0.6rem;
      padding: 0.85rem 0.6rem;
      background-color: #fff;
      border-radius: 0.5rem;
      .radio-box {
        display: flex;
        align-items: center;
        justify-content: flex-end;
        // font-size: 0.7rem;
        text-align: right;
        color: #4a4a4a;
        input[type='radio'] {
          display: none;
        }
        label {
          padding-left: 0.6rem;
          cursor: pointer;
          img {
             0.8rem;
            margin-right: 0.1rem;
          }
        }
      }
      .card-header {
        // font-size: 0.75rem;
        margin: 0.2rem 0 0.5rem;
        color: #4a4a4a;
      }
      // input输入框
      .num-box {
        display: flex;
        justify-content: space-between;
        align-items: center;
        .spot {
           0.2rem;
          height: 0.2rem;
          border-radius: 50%;
          background-color: #d8d8d8;
        }
        & > div {
           1.8rem;
          height: 1.8rem;
          border: 1px solid #e4e4e4;
          &.first {
            position: relative;
            text-align: center;
            line-height: 1.7rem;
            font-weight: 200;
            .input-wrap {
              position: absolute;
              top: 0;
              left: 0;
              right: 0;
              bottom: 0;
              &.active {
                z-index: 100;
              }
            }
            em {
              color: #979797;
              // font-size: 1.6rem;
              line-height: 1.7rem;
            }
            span {
              display: inline-block;
               100%;
              height: 100%;
              // background-color: #9cbce2;
              color: #828282;
              line-height: 1.8rem;
            }
          }
          &.active {
            border: 1px solid #4a90e2;
            &:after {
              border-bottom: 0.5rem solid #4a90e2;
            }
          }
          span {
            display: flex;
            align-items: center;
            justify-content: center;
             100%;
            height: 100%;
            // font-size: 1rem;
            color: #828282;
            &.first {
              background-color: #9cbce2;
              color: #fff;
              text-indent: 0.4rem;
              border-radius: 0;
            }
          }
        }
      }
      .submit-box {
        button {
           100%;
          height: 2.2rem;
          border-radius: 0.25rem;
          // font-size: 0.75rem;
          margin-top: 0.7rem;
          background: linear-gradient(320deg, rgba(74, 144, 226, 1) 0%, rgba(101, 172, 248, 1) 100%);
          color: #fff;
        }
      }
      .info {
        // font-size: 0.5rem;
        margin-top: 0.9rem;
        color: #828282;
        text-align: left;
        img {
           0.6rem;
          vertical-align: middle;
        }
      }
    }
    .first-word-wrap {
      // height: 9.4rem;
      background-color: #d2d5db;
      padding: 0.6rem 0.8rem 1.1rem;
      position: fixed;
      bottom: 0;
      left: 0;
      right: 0;
      .first-word {
        display: flex;
        justify-content: space-between;
        margin-bottom: 0.45rem;
        .word {
          box-sizing: border-box;
           1.8rem;
          height: 1.8rem;
          // border: 1px solid #9cbce2;
          box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.35);
          border-radius: 0.16rem;
          text-align: center;
          &.bordernone {
            border: none;
            box-shadow: none;
          }
          span {
            box-sizing: border-box;
            display: flex;
            align-items: center;
            justify-content: center;
            text-align: center;
             100%;
            height: 100%;
            background-color: #fff;
            color: #000;
            // border: 1px solid #fff;
            border-radius: 0.125rem;
          }
          img {
             1.6rem;
          }
        }
        &:nth-last-of-type(1) {
          margin-bottom: 0rem;
        }
      }
    }
    .keyboard-wrap {
      background-color: #d2d5db;
      position: fixed;
      bottom: 0;
      left: 0;
      right: 0;
      padding: 0.6rem 0.6rem 0.4rem;
      .keyboard {
        display: flex;
        justify-content: space-between;
        align-items: center;
        height: 2rem;
        margin-bottom: 0.3rem;
        span {
          text-align: center;
          display: flex;
           1.8rem;
          align-items: center;
          justify-content: center;
          height: 1.8rem;
          margin: 0 0.3rem;
          box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.35);
          background-color: #fff;
          border-radius: 0.125rem;
          &:active {
            background-color: #e4e4e4;
          }
          &.bordernone {
            border: none;
            box-shadow: none;
            background-color: #d2d5db;
            &:active {
              background-color: #d2d5db;
            }
          }
          &.delete {
            background-color: #465266;
            img {
               1.15rem;
            }
          }
        }
      }
      .cancel {
        display: flex;
        justify-content: flex-end;
        align-items: center;
        span {
          display: flex;
          align-items: center;
          justify-content: center;
           3.6rem;
          height: 1.8rem;
          background-color: #465266;
          color: #fff;
          border-radius: 0.125rem;
        }
      }
    }
    </style>
    

      

      

    君不见,高堂明镜悲白发,朝如青丝暮成雪
  • 相关阅读:
    jmm八大原子操作
    线程状态及各状态下与锁和CPU的关系
    navicat破解
    解析JSON完美案例
    Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address xxx.xx.xx.xx found
    linux修改hosts并立即生效设置
    winows下常用ng命令
    MySql 事务隔离级别简述,以及为什么互联网项目用:读已提交(Read Commited)这个隔离级别
    vite vue webstorm修改代码页面不自动更新
    MySQL 8的递归查询
  • 原文地址:https://www.cnblogs.com/lzhflzjx/p/13740476.html
Copyright © 2020-2023  润新知