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.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
获取body标签的两种方法
Oct 13 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
Oct 10 Javascript
JavaScript严格模式详解
Jan 16 Javascript
AngularJS封装$http.post()实例详解
May 06 Javascript
vue使用vue-cli快速创建工程
Jul 28 Javascript
JavaScript编程设计模式之构造器模式实例分析
Oct 25 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
Oct 25 Javascript
vue2.0父子组件间传递数据的方法
Aug 16 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 Javascript
浅谈vuex为什么不建议在action中修改state
Feb 02 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
资料注册后发信小技巧
2006/10/09 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
js opener的使用详解
2014/01/11 Javascript
js格式化时间的方法
2015/12/18 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
python爬虫常用的模块分析
2014/08/29 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
python中字符串的操作方法大全
2018/06/03 Python
python list转矩阵的实例讲解
2018/08/04 Python
pandas 将索引值相加的方法
2018/11/15 Python
django基于restframework的CBV封装详解
2019/08/08 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
关爱老人标语
2014/06/21 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL
python画条形图的具体代码
2022/04/20 Python