js 实现验证码输入框示例详解


Posted in Javascript onSeptember 23, 2022

前言

验证码输入框应该是很常见的需求吧,不知道各位小伙伴在在遇到的时候是选择找一找插件还是自己动手撸一个呢?我花了点时间撸了一个出来,实际体验还不错,分享给大家。

思路

我在实现之前肯定也是上网搜了一下的,网上的方式大多是使用多个input标签来实现,但我觉得不太优雅,就自己想了一个方法。使用了6个div标签和一个input标签。验证码长度一般是4位或6位,我这里用6位做演示。

  • 先将6个div使用flex布局平铺。
  • 再将input使用绝对定位覆盖在6个div上面。
  • 监听input元素的input、focus、blur事件,对用户的输入进行处理。

遇到的问题

上述布局在pc端是ok的,但是在移动端会有问题,移动端的光标底部会有个控件,你能够拖动调整光标位置。大概长这个样子,如下图:

js 实现验证码输入框示例详解

不过解决方法也很简单,红色背景是box,蓝色背景是input

  • input宽度设置大一点,同时使用position: absolute; right: 0; top: 0;右对齐
  • box设置overflow: hidden;将左侧多余部分隐藏,这样就看不到光标啦。

为了方便理解,我将top设置为48px,如下图

js 实现验证码输入框示例详解

实际应该是top: 0,如下图

js 实现验证码输入框示例详解

下面是代码,聪明的你一看就明白。

HTML

<div class="box">
    <div class="field-list">
        <div class="field-item"></div>
        <div class="field-item"></div>
        <div class="field-item"></div>
        <div class="field-item"></div>
        <div class="field-item"></div>
        <div class="field-item"></div>
    </div>
    <input class="field-input" type="text" maxlength="6">
</div>

CSS

.box {
    position: relative;
    width: 338px;
    overflow: hidden;
}
.field-list {
    display: flex;
    justify-content: space-between;
}
.field-item {
    box-sizing: border-box;
    width: 48px;
    height: 48px;
    line-height: 46px;
    font-size: 24px;
    text-align: center;
    font-weight: bold;
    border: 1px solid #ccc;
    border-radius: 3px;
}
.field-item-focus {
    border-color: #409EFF;
}
.field-item-focus::before {
    content: '';
    display: block;
    width: 2px;
    height: 30px;
    margin: 8px auto;
    background: skyblue;
    animation: blink 1s steps(1) infinite;
}
@keyframes blink {
    50% {
        opacity: 0;
    }
}
.field-input {
    box-sizing: border-box;
    position: absolute;
    top: 0;
    right: 0;
    width: calc(100% + 60px);
    height: 48px;
    padding: 0;
    border: none;
    outline: none;
    opacity: 0;
    background: transparent;
}

JS

// 获取dom
const fieldList = document.querySelectorAll('.field-item');
const fieldInput = document.querySelector('.field-input');
// 监听input输入事件,只支持输入数字,过滤非数字字符
fieldInput.addEventListener('input', function (e) {
    const v = e.target.value.replace(/[^\d]/g, '');
    e.target.value = v;
    // 考虑粘贴情况,循环赋值
    for (let i = 0; i < 6; i++) {
        fieldList[i].innerHTML = v[i] || '';
    }
    // 移除旧光标
    removeCursor();
    // 计算新光标出现位置
    calcCursorPosition();
});
// focus
fieldInput.addEventListener('focus', function (e) {
    calcCursorPosition();
});
// blur
fieldInput.addEventListener('blur', function (e) {
    removeCursor();
});
// 计算光标出现位置
function calcCursorPosition() {
    const length = fieldInput.value.length;
    if (length < 6) {
        fieldList[length].classList.add('field-item-focus');
    }
}
// 移除光标
function removeCursor() {
    // 最后一位没有光标,?.操作符避免报错
    document.querySelector('.field-item-focus')?.classList.remove('field-item-focus');
}

实现效果

js 实现验证码输入框示例详解

以上就是js 实现验证码输入框示例详解的详细内容,更多关于js 验证码输入框的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript css float属性的特殊写法
Nov 13 Javascript
让checkbox不选中即将选中的checkbox不选中
Jul 11 Javascript
javascript实现无缝上下滚动特效
Dec 16 Javascript
详解AngularJS中的http拦截
Feb 09 Javascript
js+html获取系统当前时间
Nov 10 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
为什么要使用Vuex的介绍
Jan 19 Javascript
vue中过滤器filter的讲解
Jan 21 Javascript
详解使用uni-app开发微信小程序之登录模块
May 09 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
May 22 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 Javascript
ES6 Generator基本使用方法示例
Jun 06 Javascript
TypeScript 内置高级类型编程示例
Sep 23 #Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 #Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 #Javascript
TS 类型兼容教程示例详解
Sep 23 #Javascript
TS 类型收窄教程示例详解
Sep 23 #Javascript
JavaScript实现简单的音乐播放器
Aug 14 #Javascript
vue实现简易音乐播放器
Aug 14 #Vue.js
You might like
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
php之Memcache学习笔记
2013/06/17 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
php实现三级级联下拉框
2016/04/17 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
js几个验证函数代码
2010/03/25 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
pandas值替换方法
2018/07/10 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
django框架使用方法详解
2019/07/18 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
出纳岗位职责
2015/01/31 职场文书
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers