微信小程序6位密碼框/驗證碼實現(xiàn) 基于微信7.0.9

需求

實現(xiàn)一個能夠輸入6位密碼框組件(如微信支付密碼框類似)


支付組件.jpeg

思路一(不可行方案)

使用一個Input 配合 letter-spacing 屬性使用。后實驗下來盆耽,input 并不使用css中的 letter-spacing 屬性冰肴。

思路二 (可行方案)

在頁面中俗壹,隱藏一個input,然后控制 input 組件的 focus 屬性從而實現(xiàn)6位密碼框輸入脐嫂。
需要注意的是匠抗,在我寫這個組件并驗證時故源,(iphone xs max ios13.3) 微信版本為7.0.8,實測組件可以正常工作汞贸。當我微信升級為7.0.9時绳军,input 手動設置 focus 并沒有生效,同時矢腻,該 input 沒有辦法再次聚焦并彈出輸入法门驾。(很奇怪的是,我同事的手機也是iphone xs max ios13.3 微信 7.0.9 沒有這個問題

組件布局拆分

支付輸入框3.png

組件wxml

<view class="pay-password-container">
  <text class="pay-password-title">安全驗證</text>
  <text class="pay-password-tips">您使用了虛擬資產(chǎn)多柑,為保障安全奶是,請輸入支付密碼!</text>
  <view style="position:relative">
    <view class="pay-password-layout">
      <view wx:for="{{passwordlayout}}" class="pay-password-item">
        <view wx:if="{{index < passwordCode.length}}" class="dot" />
      </view>
    </view>
    <!-- 這里采用了一個投機取巧的辦法竣灌,使用兩個Input 防止在某些機型上,input設置focus會導致input整個失效-->
    <input value="{{passwordCode}}" password maxlength="6" type="number" class='input-container-2' bindinput="passwordInput" />
  </view>
  <input value="{{passwordCode}}" focus="{{focus}}" maxlength="6" type="number" class='input-container-2' bindinput="passwordInput" bindfocus="getFocus" bindblur="blur" />
  <view class='forget-password' catchtap="clickForgetPassword">忘記密碼?</view>
  <view class="empty-layout" />
  <view class="controll-layout">
    <view class="cancel-button" catchtap="dismiss">
      <text>取消</text>
    </view>
    <view class="divider" />
    <view class="sure-button" catchtap="sure">
      <text>確定</text>
    </view>
  </view>
  </view>

組件wxss

.pay-password-container {
  width: 650rpx;
  height: 525rpx;
  border-radius: 16rpx;
  background: #fff;
  display: flex;
  display: -webkit-flex;
  flex-direction: column;
  align-items: center;
}

.pay-password-title {
  font-size: 40rpx;
  font-weight: bold;
  color: #030303;
  margin-top: 59rpx;
  flex-shrink: 0;
}

.pay-password-tips {
  font-size: 24rpx;
  color: #333;
  opacity: 0.5;
  margin-top: 31rpx;
  flex-shrink: 0;
}

.pay-password-layout {
  display: flex;
  display: -webkit-flex;
  flex-direction: row;
  margin-top: 40rpx;
  flex-shrink: 0;
  z-index: 105rpx;
}

.pay-password-item:first-child {
  height: 90rpx;
  width: 90rpx;
  border-radius: 8rpx 0rpx 0rpx 8rpx;
  border-top: 1px solid #bbb;
  border-left: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  display: flex;
  display: -webkit-flex;
  justify-content: center;
  align-items: center;
}

.pay-password-item {
  height: 90rpx;
  width: 90rpx;
  border-top: 1px solid #bbb;
  border-left: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  display: flex;
  display: -webkit-flex;
  justify-content: center;
  align-items: center;
}

.pay-password-item:last-child {
  height: 90rpx;
  width: 90rpx;
  border-radius: 0rpx 8rpx 8rpx 0rpx;
  border-top: 1px solid #bbb;
  border-left: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  border-right: 1px solid #bbb;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  display: flex;
  display: -webkit-flex;
  justify-content: center;
  align-items: center;
}

.pay-password-item .dot {
  height: 20rpx;
  width: 20rpx;
  background: #030303;
  border-radius: 50%;
}

.input-container-2 {
  position: absolute;
  top: 40rpx;
  height: 100rpx;
  width: 1500rpx;
  left: -500rpx;
}

.empty-layout {
  flex-grow: 1;
}

.controll-layout {
  flex-shrink: 0;
  border-top: 1px solid #e9e9e9;
  width: 100%;
  height: 100rpx;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  display: flex;
  display: -webkit-flex;
}

.controll-layout .cancel-button {
  flex-grow: 1;
  display: flex;
  display: -webkit-flex;
  justify-content: center;
  align-items: center;
}

.cancel-button text {
  color: #333;
  opacity: 0.5;
  font-size: 34rpx;
}

.controll-layout .divider {
  background: #e9e9e9;
  height: 100%;
  width: 1px;
  flex-shrink: 0;
}

.controll-layout .sure-button {
  flex-grow: 1;
  display: flex;
  display: -webkit-flex;
  justify-content: center;
  align-items: center;
}

.sure-button  text {
  font-size: 34rpx;
  color: #f8aa00;
  font-weight: bold;
}

.forget-password {
  font-size: 24rpx;
  color: #333;
  opacity: 0.5;
  margin-top: 30rpx;
  align-self: flex-end;
  margin-right: 55rpx;
}

組件js

input1 帶 focus 屬性及汉,手動設置 focus 讓其彈出。
input2 不帶 focus 屬性坷随,需要用戶手動點擊輸入框(6格)后,輸入甸箱。
這樣就避免了對 輸入框(6格)監(jiān)聽tap事件育叁,并設置focus 來讓 input 聚焦,讓輸入法彈起豪嗽。就解決了部分手機上手動設置 focus 會導致 input 組件沒有響應的問題谴蔑。

Component({
  data: {
    passwordlayout: [1, 1, 1, 1, 1, 1],
    passwordCode: "",
    focus: false
  },

  methods: {
    showModal: function () {
      this.setData({
        focus: true
      })
    },

    closeModal: function () {
      this._clearData();
    },

    passwordInput: function (e) {
      this.setData({
        passwordCode: e.detail.value
      })
    },

    focusInput: function () {
      this.setData({
        focus: true
      })
    },

    getFocus: function () {
      this.setData({
        focus: true
      })
    },

    blur: function () {
      this.setData({
        focus: false
      })
    },

    dismiss: function (e) {
      this.closeModal();
    },

    sure: function (e) {
      if (this.data.passwordCode.length < 6) {
        UIManager.showToast('請輸入支付密碼');
        return;
      }
      //todo 支付密碼驗證
    },

    clickForgetPassword: function (e) {
      //todo 忘記密碼
    },
  }
})
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市龟梦,隨后出現(xiàn)的幾起案子隐锭,更是在濱河造成了極大的恐慌,老刑警劉巖计贰,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦睡,死亡現(xiàn)場離奇詭異,居然都是意外死亡躁倒,警方通過查閱死者的電腦和手機荞怒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門洒琢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褐桌,你說我怎么就攤上這事衰抑。” “怎么了荧嵌?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵呛踊,是天一觀的道長。 經(jīng)常有香客問我啦撮,道長谭网,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任赃春,我火速辦了婚禮蜻底,結果婚禮上,老公的妹妹穿的比我還像新娘聘鳞。我一直安慰自己薄辅,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布抠璃。 她就那樣靜靜地躺著站楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搏嗡。 梳的紋絲不亂的頭發(fā)上窿春,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音采盒,去河邊找鬼旧乞。 笑死,一個胖子當著我的面吹牛磅氨,可吹牛的內(nèi)容都是我干的尺栖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼烦租,長吁一口氣:“原來是場噩夢啊……” “哼延赌!你這毒婦竟也來了?” 一聲冷哼從身側響起叉橱,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤挫以,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窃祝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掐松,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡泻仙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年量没,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片究抓。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刺下,死狀恐怖稽荧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨丈,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布翁潘,位于F島的核電站拜马,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俩莽。R本人自食惡果不足惜乔遮,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一申眼、第九天 我趴在偏房一處隱蔽的房頂上張望蝉衣。 院中可真熱鬧,春花似錦病毡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裸删。三九已至阵赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間清蚀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工榛搔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留践惑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓童本,卻偏偏與公主長得像穷娱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泵额,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的嫁盲,因此網(wǎng)頁是網(wǎng)絡信息傳遞的載體烈掠。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 3,887評論 0 0
  • 每天的學習記錄左敌,可能有的地方寫的不對,因為剛學矫限,以后發(fā)現(xiàn)錯的話會回來改掉整體流程 https://develope...
    有點健忘閱讀 4,663評論 0 7
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化,入門級到專家級取董,廣度和深度都會有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,580評論 0 7
  • 學習CSS的最佳網(wǎng)站沒有之一 http://www.w3school.com.cn/tags/index.asp ...
    Amyyy_閱讀 1,050評論 0 1
  • 最近做一個H5的頁面枢里,里面有個輸入驗證碼交互蹂午,就是移動端比較常見的那種驗證碼輸入交互。就是那種冰悠,對,就是那種溉卓,一個...
    前端西瓜哥閱讀 2,935評論 3 0