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 弹出窗体点击按钮返回选择数据的实现
Apr 01 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
需要牢记的JavaScript基础知识
Sep 25 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
webstorm添加*.vue文件支持
May 08 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
基于vue.js组件实现分页效果
Dec 29 Javascript
Vue组件模板的几种书写形式(3种)
Feb 19 Javascript
vscode 插件开发 + vue的操作方法
Jun 05 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
php中socket的用法详解
2014/10/24 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
python 连接sqlite及简单操作
2017/06/30 Python
用python实现对比两张图片的不同
2018/02/05 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
python发送邮件脚本
2018/05/22 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
大学生军训自我评价分享
2013/11/09 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏
vscode内网访问服务器的方法
2022/06/28 Servers