京东淘宝的密码输入框功能点
- 只能输入数字
- 只能输入6位字符
- 每次输入一个字符,对应位置的小黑点显示
- 每次删除一个字符,对应位置的小黑点消失
实现思路
1、写好6位密码输入框的静态样式和html结构
2、将密码输入框input定位到父容器,覆盖之前写好的6位密码输入框区域,并设置为透明
3、虽然设置了密码输入框为透明,但当密码输入框获得焦点的时候,输入框的光标会显示出来,并不是透明状态。为了解决这个问题,暂时想到了两种方法,第一种,利用css将光标也设置为透明,不过这种方法有一定的兼容问题;第二种,当输入框获得焦点的时候,将输入框定位到屏幕外面,用户看不到输入框,自然也就看不到光标在那里一闪一闪了。
4、对于用户只能输入数字的功能,这里用正则表达式就搞定了,如果用户输入了非数字字符,将input输入框的值清空
5、对于用户输入超过6位字符的情况,利用字符串的截取方法截取input.value的前6位字符
6、循环遍历圆点,将index小于input.value.length的圆点显示出来
7、用户输入超过6个的数字的时候,你再去删除,你会发现要删除很多字符,那些小圆点才会相应的消失,所以这里,将截取的6位字符赋值给input输入框的值,让input.value长度永远小于等于6
HTML结构
父容器 input-ps 用于input输入框的定位
一位密码对应一个input-ps-item和dot
<div class="input-ps"> <div class="input-ps-item"> <span class="dot"></span> //小圆点 </div> <div class="input-ps-item"> <span class="dot"></span> </div> <div class="input-ps-item"> <span class="dot"></span> </div> <div class="input-ps-item"> <span class="dot"></span> </div> <div class="input-ps-item"> <span class="dot"></span> </div> <div class="input-ps-item last"> <span class="dot"></span> </div> <input id="input-mima" class="input-mima" type="text"/> </div>
CSS样式
css样式自己定义就行,想要什么样式自己写~~~注意几个关键点
dot初始状态为隐藏状态
input输入框为绝对定位,覆盖在6个密码块上,设置为透明
.input-ps{ position: relative; display: flex; align-items: center; width: 8.28125rem; height: 1.375rem; margin: 0 auto; border: 1px solid #d9d9d9; border-radius: 0.1875rem; background-color: #fff; } .input-ps-item{ display: flex; justify-content: space-around; align-items: center; flex: 1; height: 0.78125rem; border-right: 1px solid #d9d9d9; } .last{ border: none; } .dot{ display: none; width: 0.234375rem; height: 0.234375rem; border-radius: 0.234375rem; background-color: #363e49; } .input-mima{ position: absolute; left: 0; top: 0; height: 1.375rem !important; color: transparent; opacity: 0; }
JS脚本
/** * 获取dom节点 */ var dom = { $input_mima : document.getElementById("input-mima") //隐藏起来的密码输入框 } /** * 隐藏的密码输入框获得焦点事件 * 输入框获得焦点后,将输入框的定位定到屏幕看不见的位置 */ dom.$input_mima.addEventListener("focus",function(){ this.style.top = "-10000px"; }) /** * 隐藏的密码输入框失去焦点事件 * 输入框失去焦点后,将输入框的定位定原来的位置 */ dom.$input_mima.addEventListener("blur",function(){ this.style.top = "0"; }) /** * 隐藏的输入框输入值的事件 * 判断输入的值中是否都是数字 * 如果都是数字,截取最前面6位数字 * 如果不全是数字,将输入框中的值设置空 * 遍历dot点,将和输入框内值的长度一致的dot个数显示出来 * */ dom.$input_mima.addEventListener("input",function(){ var mima ; //正则判断输入的值是否全是数字 if(/^[0-9]*$/.test(this.value)){ mima = this.value.substring(0,6); //截取输入框中值的前6个字符 this.value = mima; //将输入框中的值设置位截取到的值 }else{ mima = ""; this.value = mima; //将输入框的值设置位空 } //遍历圆点dot,将index小于密码长度的圆点显示出来。这里我是用的mui框架的遍历方法,如果你用的不是mui框架,可以换成其他的方式遍历,下面有一个原生JS的循环方法 mui(".dot").each(function(index){ if(index < mima.length){ this.style.display = "block"; }else{ this.style.display = "none"; } }) //原生的循环方法 - ,- // var dot_list = document.getElementsByClassName("dot"); // for(var index =0;index<dot_list.length;index++){ // if(index < mima.length){ // dot_list[index].style.display = "block"; // }else{ // dot_list[index].style.display = "none"; // } // } //输入的密码达到6位之后判断密码是否正确,这边模拟了一下正确密码是123456的情况 //密码正确之后进行你想要的操作 //如果不希望输入的密码字符达到6位后自动进行业务逻辑的代码,这部分可以不写,将你的业务逻辑绑定到别的节点 if(mima.length >=6){ //TODO 这里写业务逻辑代码 //模拟密码 if(mima == "123456"){ //TODO 这里写业务逻辑代码 } } })
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]