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 核心参考教程 内置对象
Oct 13 Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
js中if语句的几种优化代码写法
Mar 12 Javascript
面向对象的Javascript之三(封装和信息隐藏)
Jan 27 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
jquery实现简单Tab切换菜单效果
Jul 17 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
简述Angular 5 快速入门
Nov 04 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 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 遍历XP文件夹下所有文件
2008/11/27 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
详解jQuery事件
2017/01/13 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
Django自定义过滤器定义与用法示例
2018/03/22 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
Django实现分页显示效果
2019/10/31 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
实习自荐信
2013/10/13 职场文书
金属材料工程个人求职的自我评价
2013/12/04 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
读书活动总结
2014/04/28 职场文书
团日活动总结怎么写
2014/06/25 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript