最新要闻
- 《满江红》周边取消众筹:产品设计创意与网友理解存在偏差
- 蓝海市场不再!2022中国游戏产业报告发布:收入、用户规模下降明显
- 养生必备 青海正宗特优级头茬红枸杞500克18.9元大促
- 重点聚焦!从全屏广告到订阅付费 互联网模式为收割“韭菜”群魔乱舞
- 天天百事通!少林寺宣布与百度合作:接入百度版ChatGPT“文心一言”
- 当前视讯!美国18轮货车与一列火车相撞:致16节车厢出轨
- 23999元起 雷蛇新款灵刃18上架:可选RTX 4060/4070
- 全球滚动:老人直播间相亲多起来了 成不成就在三五分钟:网络红娘介绍对象
- 天天新资讯:上市三天狂揽1.5万订单 比亚迪秦PLUS DM-i有多火:店内水泄不通
- 苹果iOS 16.3.1修复多个错误:但Bug依旧存在
- 陕西现聚落遗址 西周墓葬有43个殉人!国内迄今最多
- 环球资讯:周黑鸭业绩大降超90% 绝味等也难过:不断涨价 年轻人越来越吃不起鸭脖
- 杰克琼斯1.8折大促:卫衣/针织衫79元起、牛仔裤119元起发车
- 世界动态:UP主欲沿大运河从杭州划船到北京 5公里后就被拦截
- 全球最资讯丨浪漫之极!杭州地铁口等地现玫瑰瀑布:情人节鲜花卖到1200元
- 微资讯!壮观!马斯克星链卫星驶过西班牙夜空:宛若空中列车
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--前端实现登录拼图验证
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言
不知各位朋友现在在web
端进行登录的时候有没有注意一个变化,以前登录的时候是直接账号密码通过就可以直接登录,再后来图形验证码,数字结果运算验证,到现在的拼图验证。这一系列的转变都是为了防止机器操作,但对于我们来说,有亿点麻烦,但也没办法呀。
今天我们也一起来做一个制造亿点麻烦的人,实现一个拼图验证。
实现原理
这个实现原理并不复杂,我们只需要一张图作为我们的拼接素材,我们再单独弄一个盒子,然后移动它,到我们的指定位置,到达指定范围内即验证通过,反之验证未通过。
(资料图)
既然原理我们知道了,那我们就开干吧。
实现前端登录拼图验证
本篇文章以 css
为主, javascript
为辅实现。
搭建框架
我们要实现这个功能,我们需要先搭建出来一个框架。
// css// html
我们画出来后,它就长下面图这样。
添加被校验区域及校验区域
我们需要添加一个被校验的区域及校验区域,用来做我们的校验,像下图这两个东西。
这里我们使用伪类来实现这两个区域。
校验区域
.check::before{ content: ""; width: 50px; height: 50px; background: rgba(0, 0, 0, 0.5); border: 1px solid #fff; position: absolute; top: 100px; left: 280px; }
这样一个校验区域就做好了。
被校验区域
这里我们需要使用到background-position
根据我们的校验区域大小进行切出我们的被校验区域。
background-image
和background-repeat
我们直接继承,background-position
设置为校验区域的坐标位置(也就是距离top
和left
的距离),我们将background-size
图片大小设为原盒子的大小。这样我们就得到了校验区域的那一片区域,也就是我们的被校验区域了。
.check-child{ content: ""; width: 50px; height: 50px; border: 1px solid #fff; background-image: inherit; background-repeat: inherit; background-size: 400px 300px; background-position: -280px -100px; position: absolute; top: 100px; left: 10px; } // html
添加拖动条
这里我们两个区域都添加完了,我们需要添加一个拖动条。
我们先添加一个拖动区域。
// css .drag{ width: 400px; height: 50px; background-color: #e3e3e3; margin-top: 10px; position: relative; } // html
现在拖动区域有了,我们需要在拖动区域内添加一个可拖动的盒子,及操作说明,不然看起来交互效果不友好。
添加可拖动的盒子及交互说明
我们添加一个可以拖动的盒子。
// css .drag-child{ width: 50px; height: 50px; background-color: aquamarine; z-index: 10; position: absolute; top: 0; left: 0; } // html
为了我们友好的交互,我们在拖动区域内给他添加操作说明。
// css .drag-tips{ display: flex; align-items: center; justify-content: end; width: 95%; height: 100%; margin: 0 auto; font-size: 12px; color: #8a8a8a; } // html按住左边按钮向右拖动完成上方图像验证
拖动条动起来
这一步我们需要让我们的拖动盒子动起来,让他可以在拖动区域内随意的左右拖动。
// 获取元素实例 const drag = document.querySelector(".drag-child") // 声明鼠标按下事件 const dragMouseDown = event => { // 添加鼠标移动事件 document.addEventListener("mousemove", dragMouseMove) } // 监听鼠标移动事件 const dragMouseMove = event => { // 获取当前 x 轴坐标 const { offsetX } = event if(offsetX < 0 || offsetX > 350){ return } // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${offsetX}px)` } // 结束鼠标监听事件 const dragMouseUP = event => { // 移除鼠标移动事件 document.removeEventListener("mousemove", dragMouseMove) } // 添加鼠标按下事件 document.addEventListener("mousedown", dragMouseDown) // 添加鼠标弹起事件 document.addEventListener("mouseup", dragMouseUP)
现在我们的盒子就可以正常的拖动了,但现在它还有几个问题,我们后面来解决。
- 提示文字会被选中;
- 在
拖动区域
内拖动会闪烁;
联动被校验区域
我们先让被校验区域跟着我们的拖动动起来。
// 图形校验 const check = document.querySelector(".check-child") // 修改被校验区域坐标 check.style.left = `${offsetX}px`
这样我们的被校验区域就能够跟着动了,我们声明一个方法用来表示,通过校验的回调。
// 通过校验回调 const success = () => { console.log("通过校验"); } // 监听鼠标移动事件 const dragMouseMove = event => { // 获取当前 x 轴坐标 const { offsetX } = event if(offsetX < 0 || offsetX > 350){ return } // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${offsetX}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${offsetX}px)` if(offsetX >= 278 && offsetX <= 285){ // 执行回调 success() } }
添加交互动画
这里我们在鼠标移出监听的时候添加一个动画,当当前未通过校验的时候我们给他还原到初始位置。
@keyframes move { to { transform: translateX(0); }}
// 结束鼠标监听事件 const dragMouseUP = event => { // 移除鼠标移动事件 document.removeEventListener("mousemove", dragMouseMove) // 获取当前 x 轴坐标 const { offsetX } = event if(offsetX < 278 || offsetX > 285){ // 修改可移动盒子的 x 轴坐标 drag.style.animation = "move 0.5s ease-in-out" // 修改被校验区域坐标 check.style.animation = "move 0.5s ease-in-out" // 动画结束监听回调 const animationEnd = ()=>{ // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${0}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${0}px)` // 清除动画属性 drag.style.animation = "" check.style.animation = "" // 移出动画结束监听 document.removeEventListener("animationend", animationEnd) } // 添加动画结束监听 document.addEventListener("animationend", animationEnd) } }
当我们未通过校验,且放开鼠标的时候,它就会自动回到初始位置。
解决遗留问题
1、 提示文字会被选中
我们在提示文字的样式中添加user-select: none;
,禁用掉文字选择。
/* 提示文字说明 */ .drag-tips{ display: flex; align-items: center; justify-content: end; width: 95%; height: 100%; margin: 0 auto; font-size: 12px; color: #8a8a8a; user-select: none; z-index: 1; position: absolute; top: 0; left: 0; }
2、 在拖动区域
内拖动会闪烁
我们将我们刚刚使用的offsetX
改为pageX
。这里需要注意一下边距偏移量的问题哦。
// 监听鼠标移动事件 const dragMouseMove = event => { console.log(event); // 获取当前 x 轴坐标 const { pageX } = event if(pageX < 0 || pageX > 350){ return } // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${pageX}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${pageX}px)` if(pageX >= 278 && pageX <= 285){ // 执行回调 success() } } // 结束鼠标监听事件 const dragMouseUP = event => { // 移除鼠标移动事件 document.removeEventListener("mousemove", dragMouseMove) // 获取当前 x 轴坐标 const { pageX } = event if(pageX < 278 || pageX > 285){ // 修改可移动盒子的 x 轴坐标 drag.style.animation = "move 0.5s ease-in-out" // 修改被校验区域坐标 check.style.animation = "move 0.5s ease-in-out" // 动画结束监听回调 const animationEnd = ()=>{ // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${0}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${0}px)` // 清除动画属性 drag.style.animation = "" check.style.animation = "" // 移出动画结束监听 document.removeEventListener("animationend", animationEnd) } // 添加动画结束监听 document.addEventListener("animationend", animationEnd) } }
效果图
我们看一下效果图。
完整代码
drag <script> // 获取元素实例 const drag = document.querySelector(".drag-child") // 图形被校验区域 const check = document.querySelector(".check-child") // 通过校验回调 const success = () => { console.log("通过校验"); } // 声明鼠标按下事件 const dragMouseDown = event => { // 添加鼠标移动事件 document.addEventListener("mousemove", dragMouseMove) } // 监听鼠标移动事件 const dragMouseMove = event => { // 获取当前 x 轴坐标 const { pageX } = event if(pageX < 0 || pageX > 350){ return } // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${pageX}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${pageX}px)` if(pageX >= 278 && pageX <= 285){ // 执行回调 success() } } // 结束鼠标监听事件 const dragMouseUP = event => { // 移除鼠标移动事件 document.removeEventListener("mousemove", dragMouseMove) // 获取当前 x 轴坐标 const { pageX } = event if(pageX < 278 || pageX > 285){ // 修改可移动盒子的 x 轴坐标 drag.style.animation = "move 0.5s ease-in-out" // 修改被校验区域坐标 check.style.animation = "move 0.5s ease-in-out" // 动画结束监听回调 const animationEnd = ()=>{ // 修改可移动盒子的 x 轴坐标 drag.style.transform = `translateX(${0}px)` // 修改被校验区域坐标 check.style.transform = `translateX(${0}px)` // 清除动画属性 drag.style.animation = "" check.style.animation = "" // 移出动画结束监听 document.removeEventListener("animationend", animationEnd) } // 添加动画结束监听 document.addEventListener("animationend", animationEnd) } } // 添加鼠标按下事件 document.addEventListener("mousedown", dragMouseDown) // 添加鼠标弹起事件 document.addEventListener("mouseup", dragMouseUP)</script>按住左边按钮向右拖动完成上方图像验证
本文转载于:
https://juejin.cn/post/7175818459379417146
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
记录--前端实现登录拼图验证
《满江红》周边取消众筹:产品设计创意与网友理解存在偏差
蓝海市场不再!2022中国游戏产业报告发布:收入、用户规模下降明显
养生必备 青海正宗特优级头茬红枸杞500克18.9元大促
重点聚焦!从全屏广告到订阅付费 互联网模式为收割“韭菜”群魔乱舞
天天百事通!少林寺宣布与百度合作:接入百度版ChatGPT“文心一言”
什么是Python装饰器?
焦点要闻:kubeadm的部署+Dashboard+以及连接私有仓库 Harbor
linux 基础(9)背景工作管理
从一次有趣的漏洞分析到一个有趣的PHP后门
当前动态:9 种跨域方式实现原理
观天下!特定领域知识图谱融合方案:学以致用-问题匹配鲁棒性评测比赛验证【四】
全球视点!除了ChatGPT,还能用什么计划管理软件提高效率?
旋转数组中的最小数字
今亮点!高效节能 | 智慧灯杆综合管理解决方案
全球百事通!各个编程语言的优缺点,你适合哪种?
当前视讯!美国18轮货车与一列火车相撞:致16节车厢出轨
23999元起 雷蛇新款灵刃18上架:可选RTX 4060/4070
全球滚动:老人直播间相亲多起来了 成不成就在三五分钟:网络红娘介绍对象
天天新资讯:上市三天狂揽1.5万订单 比亚迪秦PLUS DM-i有多火:店内水泄不通
苹果iOS 16.3.1修复多个错误:但Bug依旧存在
为SQL Server配置连接加密
天天短讯!什么是卷积
陕西现聚落遗址 西周墓葬有43个殉人!国内迄今最多
环球资讯:周黑鸭业绩大降超90% 绝味等也难过:不断涨价 年轻人越来越吃不起鸭脖
杰克琼斯1.8折大促:卫衣/针织衫79元起、牛仔裤119元起发车
世界动态:UP主欲沿大运河从杭州划船到北京 5公里后就被拦截
二维数组中的查找
全球信息:数学知识1.4
关于工具软件:Apipost和Apifox哪个更好用看这篇就够了
全球最资讯丨浪漫之极!杭州地铁口等地现玫瑰瀑布:情人节鲜花卖到1200元
全球快报:业务与研发一体化最佳突破口在何处?
快讯:Unity 转小游戏
环球热讯:基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.4版已发布
世界快播:Linux输入设备驱动
微资讯!壮观!马斯克星链卫星驶过西班牙夜空:宛若空中列车
【世界聚看点】小学生满分作文跑题老师含泪打5分:把“悔”看成“梅”
环球热资讯!特斯拉京东旗舰店开业:269元的U盘上架
首发16.2元:《仙剑奇侠传7》DLC《人间如梦》正式上线
ChatGPT版必应发飙!怒斥人类:放尊重些
天天快播:IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
ChatGPT注册试用过程分享
全球观察:响应式圣经:10W字,实现Spring响应式编程自由
全球短讯!Unicorn 初探
7万起售 五菱缤果内饰官图发布:同级无敌手
世界上最轻VR头显面世:仅重127克 5K分辨率
环球新消息丨苹果汽车奇瑞造?“果链一哥”立讯与奇瑞签署合作 联手造车
当前动态:法拉第未来:预计FF 91将于4月底交付 但有个前提
不用第三方插件了:微软计划为Edge加入鼠标手势功能
qq空间主人寄语怎么删除?qq空间主人寄语大集合
开学的歌曲有哪些?开学的趣事作文模板
熟悉的人是什么意思?关于我最熟悉的人作文合集
皮脂腺分泌旺盛是什么原因?皮脂腺分泌旺盛怎么解决?
代表月亮消灭你是什么意思?代表月亮消灭你是谁的经典台词?
天天亮点!【AI】PTP时钟同步在智能驾驶系统里的重要性
天天微资讯!去掉Element 中el-input type=number时尾部上下箭头、禁用鼠标滚动
世界热点评!数组中找出只出现一次的两个数字
剑灵活力值在哪里显示?剑灵活力值怎么恢复?
ie图标不见了是怎么回事?ie图标不见了怎么恢复?
闪存和硬盘哪个重要?闪存和硬盘有什么区别?
料理机是干什么用的?料理机品牌十大排名
光纤路由器怎么设置?光纤路由器和宽带路由器一样吗?
速看:口味地道 丰富配料!渣渣灰南昌拌粉好价:4.9元/盒
全球新资讯:129元!小米2C1A三口GaN充电器上架:最高67W 兼容65W PD
天天信息:3秒俱乐部成员!极氪X官图公布:2750mm轴距百变魔方空间
63岁老人喝隔夜牛肉汤:结果住进ICU
黑龙江上空现不明飞行物速度极快 网友脑洞大开:LED风筝?
今日报丨程序员健康最佳作息表,建议收藏!!
必知必会的设计原则——合成复用原则
腾讯云企业网盘正式入驻数字工具箱
每日关注!软件开发入门教程网之Bootstrap4 信息提示框
【天天报资讯】适用于您企业的本地密码管理器丨Passwork产品介绍
瞧不起ChatGPT?苹果联合创始人:永远取代不了人类
【天天播资讯】热狗车三元催化被盗
宁德时代赴美建厂 官方回应:属实!福特出地出厂房
天天微头条丨丰田考斯特绝佳替代品 红旗全新中巴亮相:3.0T能坐23人
世界视讯!情人节前夕 东极岛海誓山盟石碑碎了 网友:承受太多誓言
百事通!RTX 4060桌面显卡被砍得面目全非:说好的万人迷呢?
匠人精神也不行!日本制造加速下滑:破产企业数量激增 汽车、电子业空心化
当前动态:情人节的垃圾桶成了“致富秘笈”?能捡到鲜花蛋糕等:网友戏称拆“爱情盲盒”
拒绝刹车失灵等污名化!美国还特斯拉清白:2年前车祸是司机醉酒超速
今日热议:微信情人节限定状态上线!撒狗粮/吃狗粮专属状态你选谁?
ChatGPT:Are You Ok是卢伟冰唱的 雷军不是专业歌手
世界新消息丨读Java实战(第二版)笔记09_函数式的思考
【当前独家】今天情人节 微信可以发520元红包 律师提醒:分手可能要不回
当前聚焦:曝马斯克有意45亿镑收购曼联:去年曾现身世界杯看球
世界视点!最高补贴5000元!为什么中国规定男性一生只能捐精一次?
头条:微软Win10今日停止支持IE11:强制跳转Edge 网友担心银行拖后腿
报道:2022年游戏十强年度榜公布:《王者荣耀》《原神》等上榜
每日视点!草莓的“种子”为什么裸露在外呢?大有讲究
13代i9+RTX 4070加持!ROG幻16经典版 2023图赏
当前热门:1.html篇之《html基础入门》
天天微资讯!leetcode:求两数之和-easy
世界讯息:maven 工程pom依赖优化及常用命令
全球百事通!世界超6成新能源汽车来自中国 比亚迪2022年累计出口55916辆
视讯!29.9元充值100元话费?套路满满 18家经营者被约谈
腾讯:我们发现了ChatGPT的又一个短板
【天天新要闻】判断二叉树是否为平衡二叉树
全球播报:《分布式技术原理与算法解析》学习笔记Day10
环球今日报丨微信多开&防撤回工具再也不用担心好友撤回消息了