次要思路:
- 应用 input 用于输出,宽高刚好等于六个明码框就行
- 应用六个 div 用于展现输出的明码应用 * 号代替也可
- 每个明码块里写一个用于展现提示符的 div 依据 place 匹配提示符应该呈现的格子
- input 的层级须要高于六个明码展现块,设置 opacity: 0; 把 input 暗藏起来,这样用户就看不到 input 框,点击明码块的时候其实是点击的 input 框进行输出
- 明码块遍历明码数组做对应的展现就行
代码如下:
<template> <div class="salary-container"> <div class="dialog"> <div class="box-border"> <div class="box"> <input class="int" v-model="name" maxlength="6" type="text"> <div class="enter" v-for="(item, index) in password"> <!-- 跳跃的批示符 --> <div :class="{'tips': place == index}"></div> {{item}} </div> </div> </div> </div> </div></template><script>export default { data() { return { name: '', place: 0, password: ['','','','','',''] } }, created() { this.init() }, watch: { name(newV){ let arr = newV.split('') //转为数组 if(arr.length > 6){ arr = arr.splice(0, 6) //只取六位 } this.place = arr.length //更新批示符的地位 this.password = ['','','','','',''] arr.map((item, index) => { this.password[index] = item }) } },}</script><style lang="scss" scoped>@keyframes fade { //闪动的动画 from { opacity: 1.0; } 50% { opacity: 0.2; } to { opacity: 1.0; }}.dialog{ width: 100vw; height: 100vh; z-index: 999; background-color: rgba(0,0,0, .6); display: flex; justify-content: center; align-items: center; .box-border{ width: 500px; height: 200px; background-color: #fff; border: 1px solid #fff; box-shadow: 0px 0px 10px rgba(0,0,0, .6) inset; display: flex; justify-content: center; align-items: center; .box{ position: relative; display: flex; .enter{ width: 50px; height: 50px; border: 1px solid #000; margin: 0 5px 0 0; z-index: 100; display: flex; font-size: 30px; justify-content: center; align-items: center; //跳跃的批示符 .tips{ height: 30px; width: 1px; background-color: #000; animation: fade 1000ms infinite; } } .int{ border: none; display: inline-block; width: 100%; height: 50px; position: absolute; z-index: 999; opacity: 0; } } }}.salary-container{ padding:30px;}</style>
效果图: