前言:最近有个需求要将全平台的交易密码由原来的 6-16位 复杂密码改成6位纯数字交易密码,涉及到很是多的业务场景,但修改起来也无非两种:设置交易密码,使用交易密码
-webkit-text-security: disc;
能够将input里面的内容展现位 •••
;因此明暗文切换,就变成了动态添加这个样式, 而后用 type=tel
调起数字键盘,maxlength=6
控制长度,在安卓机上完美运行,符合预期ios -webkit-text-security: disc;
对这个样式支持的不太好)判断浏览器设备ua 安卓:样式 + type=tel + maxlength=6 ios: type=tel + type=password + pattern=[0-9]* pattern=[0-9]* : 这个是用来ios环境下 在 type=password 的状况下调起数字键盘,但这个东西却在安卓上不起做用
调起数字键盘,安卓ios分开处理的缘由
数字的验证有两个: <input type="number" pattern="\d"> <input type="number" pattern="[0-9]*"> 对表单验证来讲,这两个正则的做用是同样的,表现的话差别就很大: iOS中,只有[0-9]*才能够调起九宫格数字键盘,\d 无效 Android 4.4如下(包括X5内核),二者都调起数字键盘; Android 4.4.4以上,只认 type 属性,也就是说,若是上面的代码将 type="number" 改成 type="text" ,将调起全键盘而不会是九宫格数字键盘。
代码方案: 一个 input 设置成透明、边框去掉、颜色去掉,下面放一个div,两个位置重合 当input focus 的时候,给 div设置个边框,至关于input聚焦时的高亮展现,blur 的时候去掉这个边框 <div> <input type="tel" pattern="[0-9]*" maxlength="6" class="pwd-input"> <div class="fake-box"> <div class="pwd-dot"><span class="dot"></span></div> <div class="pwd-dot"><span class="dot"></span></div> <div class="pwd-dot"><span class="dot"></span></div> <div class="pwd-dot"><span class=""></span></div> <div class="pwd-dot"><span class=""></span></div> <div class="pwd-dot"><span class=""></span></div> </div> </div> .pwd-input { width: 300%; height: 4.4rem; color: transparent; position: absolute; top: 0; left: -200%; border: none; font-size: 18px; opacity: 0; z-index: 1; } .fake-box .pwd-dot { display: inline-block; width: 16.66%; height: 4.4rem; color: #13334D; border: none; border-right: 1px solid #D8E2E9; text-align: center; vertical-align: top; background: #ffffff; } .dot { margin: 1.6rem 0; display: inline-block; width: 1.2rem; height: 1.2rem; border-radius: 50%; background: #13334D; }
其实刚开始,这个六个格子的是别人提供的现成的 react 组件,但有个老系统无法用react,因此本身就照着组件写了一个相似的东西,刚开始看不懂 为何要把width:300%; left:-200%
内心还狠狠的把写组件的人嘲笑了一番,最后才发现本身是too young too simple