评论

如何实现一个6位数的密码输入框

如何实现一个简单的6位数密码输入框

背景:

因为公司业务调整需要做用户支付这一块
开发者需要在小程序上实现一个简单的6位数密码输入框

首先想下如何实现该效果:

1.使用input覆盖在框上面,设置letter-spacing达到数字之间间距的效果,实现时发现在input组件上使用letter-spacing无效果

2.循环六个view模拟的框,光标使用动画模拟,一个隐藏的input,点击view框时触发input的Focus属性弹起键盘,同时模拟的光标展示出来,输入值后,input的value长度发生变化,设置光标位置以及模拟的密码小黑圆点

好了,废话不多数,咱们直接上手。

wxml
<view class='container'>
  <!-- 模拟输入框 -->
  <view class='pay-box {{focusType ? "focus-border" : ""}}' bindtap="handleFocus" style='width: 604rpx;height: 98rpx'>
    <block wx:for="{{boxList}}" wx:key="{{index}}">
      <view class='password-box {{index === 0 ? "b-l-n":""}}'>
        <view wx:if="{{(dataLength === item - 1)&& focusType}}" class="cursor"></view>
        <view wx:if="{{dataLength >= item}}" class="input-black-dot"></view>
      </view>
    </block>
  </view>
  <!-- 隐藏input框 -->
  <input value="{{input_value}}" focus="{{isFocus}}" maxlength="6" type="number" class='hidden-input' bindinput="handleSetData" bindfocus="handleUseFocus" bindblur="handleUseFocus" />
</view>
wxss
/* 第一个格子输入框 */
.container .b-l-n {
  border-left: none;
}

.pay-box {
  margin: 0 auto;
  display: flex;
  flex-direction: row;
  border-left: 1px solid #cfd4d3;
}

/* 支付密码框聚焦的时候 */

.focus-border {
  border-color: #0c8;
}

/* 单个格式样式(聚焦的时候) */
.password-box {
  flex: 1;
  border: 1px solid #0c8;
  margin-right: 10rpx;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* 模拟光标 */

.cursor {
  width: 2rpx;
  height: 36rpx;
  background-color: #0c8;
  animation: focus 1.2s infinite;
}

/* 光标动画 */

@keyframes focus {
  from {
    opacity: 1;
  }

  to {
    opacity: 0;
  }
}

/* 模拟输入的password的黑点 */

.input-black-dot {
  width: 20rpx;
  height: 20rpx;
  background-color: #000;
  border-radius: 50%;
}

/* 输入框 */

.hidden-input {
  margin-top: 200rpx;
  position: relative;
}

JS
Component({
  data: {
    //输入框聚焦状态
    isFocus: false,
    //输入框聚焦样式 是否自动获取焦点
    focusType: true,
    valueData: '', //输入的值
    dataLength: '',
    boxList: [1, 2, 3, 4, 5, 6]
  },
  // 组件属性
  properties: {

  },
  // 组件方法
  methods: {
    // 获得焦点时
    handleUseFocus() {
      this.setData({
        focusType: true
      })
    },

    // 失去焦点时
    handleUseBlur() {
      this.setData({
        focusType: false
      })
    },

    // 点击6个框聚焦
    handleFocus() {
      this.setData({
        isFocus: true
      })
    },

    // 获取输入框的值
    handleSetData(e) {
      // 更新数据
      this.setData({
        dataLength: e.detail.value.length,
        valueData: e.detail.value
      })
      // 当输入框的值等于6时(发起支付等...)
      if (e.detail.value.length === 6) {
        // 通知用户输入数字达到6位数可以发送接口校验密码是否正确
        this.triggerEvent('initData', e.detail.value)
      }
    }
  }
})
实现方式很简单,有点小问题,还有一些后续准备做的优化点,等完善后上线后再来修改一波。

最后附上代码片段:

https://developers.weixin.qq.com/s/8CtRqJmT7W8k

最后一次编辑于  2020-07-06  
点赞 26
收藏
评论

7 个评论

  • 满目山河
    满目山河
    2019-07-09

    关闭清除输入框的值没用  下次进来还在

    2019-07-09
    赞同 1
    回复
  • AILUG
    AILUG
    2022-10-28

    好像不太行呦 输入框怎么隐藏都还是会获得焦点显示出来

    2022-10-28
    赞同
    回复 1
    • Healer
      Healer
      08-20
      把input内容设置成居右显示,这样原生光标就到右边,这时候把input宽度去掉或者设置成自适应,然后设置一个负的右边距。这样原生光标就到了视口之外,问题就解决了
      08-20
      回复
  • 糖压瓶
    糖压瓶
    2021-07-17

    请问input怎么隐藏

    2021-07-17
    赞同
    回复 2
    • 陈晓峰 Sylvan
      陈晓峰 Sylvan
      2021-08-24
      设置宽高为0,手动设置 input focus 属性
      2021-08-24
      回复
    • Rainbow*_*^@^
      Rainbow*_*^@^
      2022-05-07回复TNT
      为什么设置visibility:hidden没用呢?是在wxss里面设置吗?
      2022-05-07
      回复
  • 涨涨涨
    涨涨涨
    2019-06-28

    6个label的for 指向input 的id 就行了

    2019-06-28
    赞同
    回复
  • 2019-06-06

    6个input  设一个focus变量 通过变量控制焦点切换input可行么 感觉这么做简单

    2019-06-06
    赞同
    回复 1
    • 
      2020-10-23
      键盘会来回收起弹出的,换成textarea不会收起,但是没法限制弹出的键盘类型,而且有其他奇怪的BUG,比如无法选中等
      2020-10-23
      1
      回复
  • 等风来,随风去
    等风来,随风去
    2019-06-01

    Tp5.1+VUE+Layui+ivew 开发、全新ui、免费开源下载完美商城源码及小程序和公众号打通版免费项目案例:http://github.crmeb.net/u/liaofei

    2019-06-01
    赞同
    回复
  • Hasaki
    Hasaki
    2019-05-30

    ..?

    2019-05-30
    赞同
    回复
登录 后发表内容