js实现滑动拼图验证效果(附代码)

这次给大家带来js实现滑动拼图验证效果(附代码),js实现滑动拼图验证效果的注意事项有哪些,下面就是实战案例,一起来看一下。

js实现滑动拼图验证效果(附代码) 

上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的。我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图。下面介绍具体步骤。

首先随便找一张图片渲染到canvas上,这里#canvas作为画布,#block作为裁剪出来的小滑块。

var canvas = document.getElementById('canvas') var block = document.getElementById('block') var canvas_ctx = canvas.getContext('2d') var block_ctx = block.getContext('2d') var img = document.createElement('img') img.onload = function() {  canvas_ctx.drawImage(img, 0, 0, 310, 155)  block_ctx.drawImage(img, 0, 0, 310, 155) }; img.src = 'img.jpg'

登录后复制

js实现滑动拼图验证效果(附代码) 

下面考虑如何裁剪出拼图的形状,拼图形状比较复杂,首先我们画一个正方形,接着上边的代码写:

var x = 150, y = 40, w = 42, r = 10, PI = Math.PI  function draw(ctx) {  ctx.beginPath()  ctx.moveTo(x, y)  ctx.lineTo(x + w, y)  ctx.lineTo(x + w, y + w)  ctx.lineTo(x, y + w)  ctx.clip() } draw(canvas_ctx) draw(block_ctx)

登录后复制

x,y为正方形左上角的坐标,现在先随便写后边生成的时候用随机数,w为正方形的边长,r为后边画缺口的圆的半径。我们先把绘图过程用函数封装起来,方便后面同时操作背景和滑块。用clip()方法裁剪图片后生成一个正方形。

js实现滑动拼图验证效果(附代码) 

接下来画正方形上边和右边的圆形:

function draw(ctx) {  ctx.beginPath()  ctx.moveTo(x,y)+  ctx.lineTo(x+w/2,y)+  ctx.arc(x+w/2,y-r+2, r,0,2*PI) //+  ctx.lineTo(x+w/2,y)  ctx.lineTo(x+w,y)+  ctx.lineTo(x+w,y+w/2)+  ctx.arc(x+w+r-2,y+w/2,r,0,2*PI) //+  ctx.lineTo(x+w,y+w/2)  ctx.lineTo(x+w,y+w)  ctx.lineTo(x,y+w)  ctx.lineTo(x,y)  ctx.clip() }

登录后复制

js实现滑动拼图验证效果(附代码) 

两处注释的位置将圆心往内偏移了2px,实现缺口的样式。然后是左边空心的部分,由于clip是裁剪路径内的部分,因此直接像上面画圆是不行的,我们开启一条新的路径,然后画圆将这个正方形“遮盖”出一个缺口,这里会用到 globalCompositeOperation 属性,’xor’顾名思义。代码接上边:

function draw(ctx) {  ctx.beginPath()  ...  ctx.lineTo(x,y)  ctx.clip()+  ctx.beginPath()+  ctx.arc(x,y+w/2, r,1.5*PI,0.5*PI) // 只需要画正方形内的半圆就行,方便背景图片的裁剪+  ctx.globalCompositeOperation = "xor"+  ctx.fill()}

登录后复制

js实现滑动拼图验证效果(附代码) 

现在一个基本的拼图形状有了,我们调整#block的大小,并将裁剪出来的滑块放入#block中:

img.onload = function() {  ctx.drawImage(img, 0, 0, 310, 155)  block_ctx.drawImage(img, 0, 0, 310, 155)+  var blockWidth = w + r * 2+  var _y = y - r * 2 + 2 // 滑块实际的y坐标+  var ImageData = block_ctx.getImageData(x, _y, blockWidth, blockWidth)+  block.width = blockWidth+  block_ctx.putImageData(ImageData, 0, _y) }

登录后复制

js实现滑动拼图验证效果(附代码) 

现在我们需要把左边画布展示原来的图片,并且抠掉中间滑块的部分,这里画路径的过程都是一样的,唯一不同只是clip()那里改成fill()即可实现效果,我们前面已经把画路径的过程封装成函数了,稍作改动即可:

- function draw(ctx) {+ function draw(ctx, operation) {  ...- ctx.clip()+ ctx.fillStyle = '#fff'+ ctx[operation]()  ...}+ draw(canvas_ctx, 'fill')+ draw(block_ctx, 'clip')

登录后复制

js实现滑动拼图验证效果(附代码) 

接下来就是写样式了,略过:

js实现滑动拼图验证效果(附代码) 

然后就是写拖动事件,我们可以在鼠标按下时记录鼠标位置,然后在拖动时给滑块设置left值。最后在松开鼠标时,判断滑块此时的left值和最开始裁剪滑块时的x值,如果在一定范围内就算验证通过,否则验证失败。

最后再加上随机图片和随机剪切位置,基本就ok了。另外可以判断下鼠标移动时y轴的变化,以判断是否是“人”在操作,当然web安全这块神魔乱舞的,我就不班门弄斧了,只是做个简单判断就行。

由于没有给切片边缘加上边框或者阴影,导致某些图片的滑块可识别度不高,需要后边完善下(其实是我还没折腾出来- -),希望懂这块的大神帮我完善下//

js实现滑动拼图验证效果(附代码) 

后边代码比较杂乱,就不贴上来了, 查看完整代码点这里 演示地址 点这里

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

axios怎样操作数据请求方式及跨域处理

js获取ModelAndView后如何使用

以上就是js实现滑动拼图验证效果(附代码)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2765019.html

(0)
上一篇 2025年3月8日 10:39:39
下一篇 2025年3月5日 16:19:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • jQuery+Cookie实现切换皮肤效果实现(附代码)

    这次给大家带来jQuery+Cookie实现切换皮肤效果实现(附代码),jQuery+Cookie实现切换皮的注意事项有哪些,下面就是实战案例,一起来看一下。 1)关键代码 jQuery Cookie切换皮肤 $(function () {…

    编程技术 2025年3月8日
    200
  • JS实现鼠标触发悬浮层效果

    这次给大家带来JS实现鼠标触发悬浮层效果,JS实现鼠标触发悬浮层效果的注意事项有哪些,下面就是实战案例,一起来看一下。 在人人,CSDN等一些网站,当鼠标在某个东西上悬浮时,会弹出一个悬浮层,鼠标移开悬浮层消失。 比如说CSDN的通知(应该…

    2025年3月8日
    200
  • vue中如何使用jointjs属性

    这次给大家带来vue中如何使用jointjs属性,vue中使用jointjs属性的注意事项有哪些,下面就是实战案例,一起来看一下。 在vue中引入joint.js的问题,之前在网上搜了很多,都没有给出一个确切的答案,捣鼓了两天终于弄明白了,…

    编程技术 2025年3月8日
    200
  • Node.js注册邮箱激活有哪些方法

    这次给大家带来Node.js注册邮箱激活有哪些方法,Node.js实现注册邮箱激活的注意事项有哪些,下面就是实战案例,一起来看一下。 在做自己的node项目极客教程时,需要开发一个注册邮箱激活的功能,这个功能非常常见,当我们注册一个账号时,…

    2025年3月8日
    200
  • JS常用函数总结归纳

    这次给大家带来JS常用函数总结归纳,使用JS常用函数的注意事项有哪些,下面就是实战案例,一起来看一下。 数组扁平化 数组扁平化有很多方法,但最终最好的方法就是递归,实现一个指定深度的扁平化方法,这样基本的套路都会了解。 function f…

    编程技术 2025年3月8日
    200
  • JS原始值与引用值有哪些储存方式

    这次给大家带来JS原始值与引用值有哪些储存方式,使用JS原始值与引用值储存方式的注意事项有哪些,下面就是实战案例,一起来看一下。 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number、Stirng、Boolean、Null…

    2025年3月8日
    200
  • JS动画定时器使用详解

    这次给大家带来JS动画定时器使用详解,JS动画定时器使用的注意事项有哪些,下面就是实战案例,一起来看一下。 广义说:一切通过js改变的视觉呈现都叫动画;例如,按钮,链接等元素交互反馈。 狭义说:通过定时器连续调用js函数进行元素属性改变产生…

    2025年3月8日
    200
  • 毕达哥拉斯树怎样用JS实现

    这次给大家带来毕达哥拉斯树怎样用JS实现,毕达哥拉斯树用JS实现的注意事项有哪些,下面就是实战案例,一起来看一下。 效果如下: 主要方法 translate() rotate() rect() push() pop() map() 主要思想…

    2025年3月8日
    200
  • js-cookie使用步骤详解

    这次给大家带来js-cookie使用步骤详解,js-cookie使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Cookie是网站设计者放置在客户端的小文本文件,一般后台语言使用的比较多,可以实现用户个性化的一些需求。js-cook…

    编程技术 2025年3月8日
    200
  • beforeEach实现路由跳转验证功能

    这次给大家带来beforeEach实现路由跳转验证功能,beforeEach实现路由跳转验证的注意事项有哪些,下面就是实战案例,一起来看一下。 路由跳转前做一些验证,比如登录验证(未登录去登录页),是网站中的普遍需求。对此,vue-rout…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论