React 验证码/手机验证码/OTP 输入组件

2,072 阅读1分钟

基于input实现一个验证码输入框组件,支持PC/H5环境使用,H5环境使用时支持唤起数字键盘。

效果截图 1653728711532.jpg

已发布至npm仓库:github.com/jaijia-bao/…

点击查看 Demo 及文档

实现比较简单,有两点可以提一下:

用一个input还是多个input?

简单调研了下,发现有两种实现思路:一个input或者多个input。

多个input的思路是自动切换前后输入框的focus状态,但是不管逻辑复杂度还是交互体验都不太友好,最终没有采用此方案。

一个input的实现比较简单,视觉上隐藏默认组件,然后手动画输入框,逻辑上关联focus/blur状态。

注意: input隐藏效果得用CSS用定位来实现

display/visibility/opacity等属性实现隐藏效果时会导致H5环境下键盘弹不起来

.input-box-wrap {
  position: absolute;
  left: -9999px;
}

<div className="input-box-wrap">
  <input />
</div>

用CSS实现focus态插入符闪烁效果

实现类似原生input输入框focus时插入符闪烁效果(caret),网上有找到信息说用透明度实现,但呈现出来出来会有一个颜色的过渡效果;重新调研下可以用animation.steps实现,又遇到了颜色损失的问题-比如红色不够红。

枚举尝试了多次后可以用以下代码实现:

.item-content-active::before {
  //...
  animation: rc-captcha-input-flash steps(2) 1s infinite;
}

@keyframes rc-captcha-input-flash {
  0% {
    visibility: hidden;
  }

  100% {
    visibility: visible;
  }
}

参考文章