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 版
Mar 24 Javascript
javascript 精粹笔记
May 09 Javascript
jquery可见性过滤选择器使用示例
Jun 24 Javascript
javascript实现TreeView 无刷新展开的实例代码
Jul 13 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
简单的js图片轮换代码(js图片轮播)
May 06 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
May 03 Javascript
JavaScript中的原型prototype完全解析
May 10 Javascript
vue 动态修改a标签的样式的方法
Jan 18 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
JavaScript常见事件对象与操作实例总结
Jan 05 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
Oct 29 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
来自phpguru得Php Cache类源码
2010/04/15 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
Javascript实现单例模式
2016/01/24 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
vue 优化CDN加速的方法示例
2018/09/19 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
理解python多线程(python多线程简明教程)
2014/06/09 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
Python实现扫码工具的示例代码
2020/10/09 Python
证婚人经典证婚词
2014/01/09 职场文书
大学生军训感想
2014/02/16 职场文书
项目施工员岗位职责
2014/03/09 职场文书
特教教师先进事迹
2014/05/21 职场文书
科技活动周标语
2014/10/08 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
外贸采购员岗位职责
2015/04/03 职场文书