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 图片轮播(5张图片)
Dec 30 Javascript
Js动态添加复选框Checkbox的实例方法
Apr 08 Javascript
javascript检测是否联网的实现代码
Sep 28 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
jQuery实现的经典滑动门效果
Sep 22 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
微信小程序 icon组件详细及实例代码
Oct 25 Javascript
完美解决axios跨域请求出错的问题
Feb 05 Javascript
ajax前台后台跨域请求处理方式
Feb 08 Javascript
微信小程序拼接图片链接无底洞深入探究
Sep 03 Javascript
详解JavaScript中Arguments对象用途
Aug 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
简述jQuery ajax的执行顺序
2016/01/05 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
利用JS制作万年历的方法
2017/08/16 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
Python代码调试的几种方法总结
2015/04/15 Python
python如何读写csv数据
2018/03/21 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
详解python3中tkinter知识点
2018/06/21 Python
python 调用钉钉机器人的方法
2019/02/20 Python
Django框架自定义session处理操作示例
2019/05/27 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
环境科学毕业生自荐信
2013/11/21 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
优秀教师推荐材料
2014/12/16 职场文书
技术员个人工作总结
2015/03/03 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js