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 相关文章推荐
自写的一个jQuery圆角插件
Oct 26 Javascript
jQuery中andSelf()方法用法实例
Jan 08 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
VsCode插件整理(小结)
Sep 14 Javascript
vue自定义一个v-model的实现代码
Jun 21 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
React实现阿里云OSS上传文件的示例
Aug 10 Javascript
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
PHP文本操作类
2006/11/25 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JS基础之undefined与null的区别分析
2011/08/08 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python虚拟环境项目实例
2017/11/20 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
pytorch 常用线性函数详解
2020/01/15 Python
Python计算信息熵实例
2020/06/18 Python
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
高中课前三分钟演讲稿
2014/09/13 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
个人事迹材料范文
2014/12/29 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技