前言:最近有個需求要將全平臺的交易密碼由原來的 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