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 相关文章推荐
google地图的路线实现代码
Aug 20 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
May 13 Javascript
jquery实现勾选复选框触发事件给input赋值
Feb 01 Javascript
判断数组的最佳方法(推荐)
Oct 11 Javascript
jQuery读取XML文件的方法示例
Feb 03 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
Jun 20 jQuery
Vue-CLI项目中路由传参的方式详解
Sep 01 Javascript
vue组件库的在线主题编辑器的实现思路
Apr 03 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 Javascript
利用vue3+ts实现管理后台(增删改查)
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 批量更新网页内容实现代码
2010/01/05 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
javascript实现数独解法
2015/03/14 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
网络维护管理员的自我评价分享
2013/11/11 职场文书
食品安全责任书
2014/04/15 职场文书
人事任命书范文
2014/06/04 职场文书
大学副班长竞选稿
2015/11/21 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python