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修改css样式style
Apr 15 Javascript
基于jquery的返回顶部效果(兼容IE6)
Jan 17 Javascript
用按钮控制iframe显示的网页实现方法
Feb 04 Javascript
javascript重复绑定事件造成的后果说明
Mar 02 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
javascript运行机制之this详细介绍
Feb 07 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
May 25 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
VueJS组件之间通过props交互及验证的方式
Sep 04 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
Jan 08 jQuery
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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
使用 MySQL Date/Time 类型
2008/03/26 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python中的localtime()方法使用详解
2015/05/22 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
python如何查看安装了的模块
2020/06/23 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
租赁协议书范本
2014/04/22 职场文书
初中班级口号
2014/06/09 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
计划生育个人总结
2015/03/02 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
oracle索引总结
2021/09/25 Oracle
vue+echarts实现多条折线图
2022/03/21 Vue.js