移动端6位验证码输入框实现

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:15   1907   0

移动端6位验证码输入框实现

参考文章

效果图:

效果图

react demo部分代码

verCode\verCode.jsx

import { useState, useRef } from 'react';
import styles from './verCode.module.less';
import classnames from 'classnames';
/**
 * 手机端6位验证码输入框
 * 用1个输入框输入,输入框设置opacity:0 
 * 使用6个li标签显示验证码,点击li标签时,输入框获取焦点
 * 
 */
const VerCodes = (props) => {
  const [verCodes, setVerCode] = useState();
  const [focus, setFocus] = useState();
  const curInputRef = useRef();

  const codeChange = (value) => {
    const codeLength = value.length;
    setVerCode(value);
    if(codeLength === 6) {
      console.log('验证码输入完成')
      // do something
    }
  };

  const codeClick = () => {
    curInputRef?.current?.focus();
  };

  const onFocus = () => {
    setFocus(true);
  };

  const onBlur = () => {
    setFocus(false);
  };

  return (
    <div className={styles.codesWrap}>
      <div className={styles.stepConTitle}>获取验证码</div>
      <div className={styles.codeInputWrap}>
        <ul className={styles.codeContainer} onClick={() => codeClick()}>
          {Array(6).fill('').map((num, index) => {
            return (
              <li 
                className={classnames(styles.fieldWrap, verCodes?.[index] ? styles.highlight : '', verCodes?.length === index && focus ? styles.focus : '')} 
                key={index}
              >
                {verCodes?.[index]}
              </li>
            );
          })
          }
        </ul>
        <AntdInputItem
          className={styles.codeInput}
          value={verCodes}
          ref={curInputRef}
          onChange={codeChange}
          onFocus={onFocus}
          onBlur={onBlur}
          type={'number'}
          maxLength={6}
        >
        </AntdInputItem>
      </div>
    </div>
  )
}
export default VerCodes;

verCode\verCode.module.less

.codesWrap {
  :global {
    .am-input-item {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      opacity: 0;
    }
  }
  .codeContainer {
    list-style: none;
    display: flex;
    .fieldWrap {
      width: 34px;
      height: 44px;
      font-size: 36px;
      color: #333;
      line-height: 44px;
      text-align: center;
      border-bottom: 1px solid #EFEFEF; 
      margin-right: 15px;
      position: relative;
      &.highlight {
        border-color: #222222;
      }
      &.focus::after {
        content: "";
        width: 1px;
        height: 40px;
        background: #c7152d;
        display: block;
        position: absolute;
        left: 50%;
      }
    }
  }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP