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 相关文章推荐
js实现页面打印功能实例代码(附去页眉页脚功能代码)
Dec 15 Javascript
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
javascript实现原生ajax的几种方法介绍
Sep 21 Javascript
jquery实现的一个简单进度条效果实例
May 12 Javascript
浅谈javascript中的闭包
May 13 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
Vue2.0 vue-source jsonp 跨域请求
Aug 04 Javascript
AngularJs每天学习之总体介绍
Aug 07 Javascript
vue实现验证码按钮倒计时功能
Apr 10 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 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+xml编程之xpath的应用实例
2015/01/24 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
window.open不被拦截的实现代码
2012/08/22 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python常用函数详解
2016/09/13 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
学习Django知识点分享
2019/09/11 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
优秀团支部事迹材料
2014/02/08 职场文书
抗洪救灾标语
2014/10/08 职场文书
保险公司增员口号
2015/12/25 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android