JavaScript仿支付宝6位数字密码输入框
作者:webNick 发布时间:2024-07-16 03:09:24
标签:js,密码,输入框
前几天,项目有个功能和某宝购物支付密码的输入框有点类似,就自己写了这篇博文,权当总结笔记吧。
啰嗦半天了,直接上代码:
结构层:
<div>
<div>请在下方输入6位数字</div>
<div class="ipt-box-nick">
<input type="tel" maxlength="6" class="ipt-real-nick"/>
<div class="ipts-box-nick">
<div class="ipt-fake-box">
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
</div>
</div>
<div class="ipt-active-nick"><img src="https://t.alipayobjects.com/images/rmsweb/T1nYJhXalXXXXXXXXX.gif"></div>
</div>
</div>
通过结构层,分析下大概思路:
本功能就是一个真实输入框和6个假输入框的故事。
将真实输入框和假输入框容器都定位重叠,注意将真实输入框的优先级设置较高,不然就输入不了咯。
为了做成看似假输入框在输入,则将真实输入框隐藏,用opacity隐藏哦。
用户输入时,通过行为层js将真实输入框的值分配给每个假输入框。
输入的同时,控制假输入框光标的效果,我用了一张某宝的图片做成的,实际上,假输入框是没有获取到焦点的。
注意:
这里真实输入框的type类型用的是tel,而不是number。因为后者会生成小箭头呀,前者在用户点击输入框时app判断type是tel就会弹出数字输入键盘更好。
表现层:
.ipt-box-nick {
height: 40px !important;
line-height: 40px !important;
position: relative !important; }
.ipt-box-nick .ipt-real-nick {
position: absolute !important;
top: 0 !important;
left: 0 !important;
width: 100%;
height: 40px !important;
line-height: 40px !important;
opacity: 0 !important;
z-index: 3 !important; }
.ipt-box-nick .ipts-box-nick {
position: absolute !important;
top: 0 !important;
left: 0 !important;
z-index: 1 !important;
width: 100%;
height: 40px !important;
line-height: 40px !important;
overflow: hidden; }
.ipt-box-nick .ipts-box-nick .ipt-fake-box {
height: 40px !important;
line-height: 40px !important;
display: flex !important;
justify-content: space-between !important; }
.ipt-box-nick .ipts-box-nick .ipt-fake-box input {
width: 40px !important;
height: 40px !important;
border: 1px solid #D7D7D7 !important;
color: #810213 !important;
font-weight: bold !important;
font-size: 18px !important;
text-align: center !important;
padding: 0 !important; }
.ipt-box-nick .ipt-active-nick {
width: 40px !important;
height: 40px !important;
line-height: 40px !important;
text-align: center;
position: absolute !important;
top: 0;
left: 0;
z-index: 2; }
.ipt-box-nick .ipt-active-nick img {
vertical-align: middle; }
样式里面就一个定位重叠,一个隐藏真实输入框,我就不想多唠叨了。css我用sass写的,转译css有点乱,博友们将就看看吧。
行为层:
$(".ipt-real-nick").on("input", function() {
//console.log($(this).val());
var $input = $(".ipt-fake-box input");
if(!$(this).val()){//无值光标顶置
$('.ipt-active-nick').css('left',$input.eq(0).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');
}
if(/^[0-9]*$/g.test($(this).val())){//有值只能是数字
//console.log($(this).val());
var pwd = $(this).val().trim();
for (var i = 0, len = pwd.length; i < len; i++) {
$input.eq(i).val(pwd[i]);
if($input.eq(i).next().length){//模拟光标,先将图片容器定位,控制left值而已
$('.ipt-active-nick').css('left',$input.eq(i+1).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');
}
}
$input.each(function() {//将有值的当前input后的所有input清空
var index = $(this).index();
if (index >= len) {
$(this).val("");
}
});
if (len == 6) {
//执行其他操作
console.log('输入完整,执行操作');
}
}else{//清除val中的非数字,返回纯number的value
var arr=$(this).val().match(/\d/g);
$(this).val($(this).val().slice(0,$(this).val().lastIndexOf(arr[arr.length-1])+1));
//console.log($(this).val());
}
});
因为tel类型,在pc端兼容问题,所以加了点正则。
本身没有什么复杂的东西,我就不多啰嗦了,需要注意的地方都加注释了。
附上完整代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>仿支付宝数字密码输入框</title>
<style>
.ipt-box-nick {
width:300px;
height: 40px !important;
line-height: 40px !important;
position: relative !important; }
.ipt-box-nick .ipt-real-nick {
position: absolute !important;
top: 0 !important;
left: 0 !important;
width: 100%;
height: 40px !important;
line-height: 40px !important;
opacity: 0 !important;
z-index: 3 !important; }
.ipt-box-nick .ipts-box-nick {
position: absolute !important;
top: 0 !important;
left: 0 !important;
z-index: 1 !important;
width: 100%;
height: 40px !important;
line-height: 40px !important;
overflow: hidden; }
.ipt-box-nick .ipts-box-nick .ipt-fake-box {
height: 40px !important;
line-height: 40px !important;
display: flex !important;
justify-content: space-between !important; }
.ipt-box-nick .ipts-box-nick .ipt-fake-box input {
width: 40px !important;
height: 38px !important;
border: 1px solid #D7D7D7 !important;
color: #810213 !important;
font-weight: bold !important;
font-size: 18px !important;
text-align: center !important;
padding: 0 !important;
border-radius:2px;}
.ipt-box-nick .ipt-active-nick {
width: 40px !important;
height: 40px !important;
line-height: 40px !important;
text-align: center;
position: absolute !important;
top: 0;
left: 0;
z-index: 2; }
.ipt-box-nick .ipt-active-nick img {
vertical-align: middle; }
</style>
</head>
<body>
<div>
<div class="lh40-nick h40-nick fwb-nick">请在下方输入6位数字</div>
<div class="ipt-box-nick mb15-nick">
<input type="tel" maxlength="6" class="ipt-real-nick"/>
<div class="ipts-box-nick">
<div class="ipt-fake-box">
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
<input type="text" >
</div>
</div>
<div class="ipt-active-nick"><img src="https://t.alipayobjects.com/images/rmsweb/T1nYJhXalXXXXXXXXX.gif"></div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script>
$(".ipt-real-nick").on("input", function() {
//console.log($(this).val());
var $input = $(".ipt-fake-box input");
if(!$(this).val()){//无值光标顶置
$('.ipt-active-nick').css('left',$input.eq(0).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');
}
if(/^[0-9]*$/g.test($(this).val())){//有值只能是数字
//console.log($(this).val());
var pwd = $(this).val().trim();
for (var i = 0, len = pwd.length; i < len; i++) {
$input.eq(i).val(pwd[i]);
if($input.eq(i).next().length){//模拟光标,先将图片容器定位,控制left值而已
$('.ipt-active-nick').css('left',$input.eq(i+1).offset().left-parseInt($('.ipt-box-nick').parent().css('padding-left'))+'px');
}
}
$input.each(function() {//将有值的当前input后的所有input清空
var index = $(this).index();
if (index >= len) {
$(this).val("");
}
});
if (len == 6) {
//执行其他操作
console.log('输入完整,执行操作');
}
}else{//清除val中的非数字,返回纯number的value
var arr=$(this).val().match(/\d/g);
$(this).val($(this).val().slice(0,$(this).val().lastIndexOf(arr[arr.length-1])+1));
//console.log($(this).val());
}
});
</script>
</body>
</html>
效果演示:
以上所述是小编给大家介绍的JavaScript仿支付宝6位数字密码输入框网站的支持!
来源:http://www.cnblogs.com/puyongsong/archive/2016/12/28/6223798.html


猜你喜欢
- 不多说,我们直接上源码:# -*- coding:UTF-8 -*-'''实现文件打包、上传与校验Created o
- 1、在Django配置搜索结果页的路由映射"""pachong URL Configuration
- 二、XML的定义 XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能
- 概念Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,
- 本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下:import numpy as npimport matplo
- 本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/python#-*- codi
- 存储过程的优缺点: 存储过程优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProce
- 1.window.event兼容脚本 2.屏蔽Form提交事件 3.获取事件源 4.添加事件兼容写法 5.Firefox注册innerTex
- 在JAVASCRIPT中LEFT函数的等价函数:function left(mainStr,lngLen) {if&nb
- 一、环境由于这学期开了图像处理这门课,所以想着在各种实验开始之前自己先动手试一下图像处理那首先要配个环境嘛,配环境真的是我长久以来的噩梦了,
- 今天在开发的时候,项目报了一个警告 Duplicate named routes definition ,这里记录一下
- #!/usr/bin/python## get subprocess module import subprocess ## ca
- 由于考勤机与OA对接,OA会在每天定时取考勤机数据,但是需要考勤机是连接状态,所以搜索了下相关教程,写了个脚本自动连接。完全是个Python
- 在使用FCKeditor的时候,可能会碰到以下这个问题,就是在编辑器页面出错,提示为:找不到页面/fckeditor/editor/fcke
- Go语言转换JSON数据真是非常的简单。以EasyUI的Demo为例,将/demo/datagrid/datagrid_data1.json
- folium是python的一个用来绘制地图,并在地图上打点,画圈,做颜色标记的工具类。简单易学,和pandas可以很好的融合,是居家必备良
- 注:本文只讨论技术不涉及商业,如有侵权请告知,未经本人同意转载后果自负!本文是通过浏览器端ajax,node端request-json进行爬
- 该方是基于uiautomator2如下版本进行验证的:PS C:\windows\system32> pip show uiautom
- 字符串字符串常用操作拼接字符串拼接字符串需要使用‘+’运算符可完成对多个字符串的拼接。如str =
- 本文实例为大家分享了python实现五子棋双人对弈的具体代码,供大家参考,具体内容如下我用的是pygame模块来制作窗口代码如下:# 1、引