如何用JavaScript Canvas实现图片滑块验证码功能?

2026-04-02 23:341阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1028个文字,预计阅读时间需要5分钟。

如何用JavaScript Canvas实现图片滑块验证码功能?

原文示例:本文实例为大家分享了js+canvas实现图片滑动验证的具体代码,供大家参考。js已封装好,拿来即用,兼容pc端和移动端,效果如下:+移动端:+pc端:+原理就不解释了,我之前的一个‘

改写后:本文提供js+canvas实现图片滑动验证的代码示例,方便大家参考。代码已封装,可直接使用,适用于pc端和移动端。具体效果如下:+移动端:+pc端:+原理略,详见之前相关内容。

本文实例为大家分享了js+cavans实现图片滑块验证的具体代码,供大家参考,具体内容如下

js已封装好,拿来即用,兼容pc端和移动端,

效果:

移动端:

pc端:

原理就不解释了,我之前的博客已经说过,只不过这个版本是结合了canvas实现,又兼容了pc端,直接拿代码就能用了。

代码:html

如何用JavaScript Canvas实现图片滑块验证码功能?

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta 鼠标按下时x轴位置 smartCanvasBL: 可移动canvas的left初始值 sliderMaxRange:slider可移动的最大距离 */ //生成canvas图案 function creatCanvas(){ //重置初始值 canvasCoverL=0;startDownX=0;smartCanvasBL=0; slider.style.left = sliderCover.style.width = 0; var l= 40, //滑块的正方形边长,不包括小圆点 r = 10, //小圆点半径 PI = Math.PI, sliderW=l+2*r, //滑块边长 rand=canvasSize(sliderW,r), //获取随机生成的x,y,left值 x = canvasCoverL= rand.x, //占位块x轴 y = rand.y; //占位块y轴 smartCanvasBL=rand.left; //先清空画布 bcxt.clearRect(0, 0, obj.w, obj.h) scxt.clearRect(0, 0, obj.w, obj.h) smartCanvas.width=obj.w; var srcIndex=Math.floor(Math.random()*(obj.imgArr.length-1)); img.src=obj.imgArr[srcIndex]; draw(scxt,x,y,l,r,PI,'clip'); draw(bcxt,x,y,l,r,PI,'fill'); img.onload = function() { //一定要在onload里调用,否则canvas里不能放进图片 bcxt.drawImage(img,0,0,obj.w,obj.h); scxt.drawImage(img,0,0,obj.w,obj.h); //裁剪滑块长度 var ImageData = scxt.getImageData(x, y-2*r, sliderW, sliderW) smartCanvas.width = sliderW; smartCanvas.style.left=rand.left+"px"; scxt.putImageData(ImageData, 0, y-2*r) } obj.refresh && obj.refresh(); } //随机生成canvas滑块和占位块,到左边的距离和到顶部的距离 function canvasSize(cw,r){ // cw为占位块和的宽度,r为绘制圆点的半径 var random =Math.random(); var x=Math.floor(obj.w/2 + random*(obj.w/2 - cw)); //x为占位块x坐标位置,保证占位块始终在画布的右半区域 var y=Math.floor(r*2+random*(obj.h - cw - r*2)); //y为占位块y坐标位置,(值至少为小圆半径的2倍才能完全显示,因为绘制的原点是小正方形的左上角) var left =Math.floor(random*(obj.w/2 - cw)); //canvas滑块的left值,这里的值范围保证它始终在画布的左半区域 return {x:x,y:y,left:left} } //绘制canvas滑块和占位块 function draw(ctx,x,y,l,r,PI,operation) { ctx.beginPath() ctx.moveTo(x, y) ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI) ctx.lineTo(x + l, y) ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI) ctx.lineTo(x + l, y + l) ctx.lineTo(x, y + l) ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true) ctx.lineTo(x, y) ctx.lineWidth = 1 ctx.fillStyle = 'rgba(200, 200, 200, 1)' ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)' ctx.stroke() ctx[operation]() ctx.globalCompositeOperation = 'destination-over' } //滑块被按下 function moveStart(e){ var ev = e || window.event; startDownX = ev.touches!=undefined? ev.touches[0].clientX : ev.clientX; } //滑块移动 function moveProcess(e){ var ev = e || window.event,downX = (ev.touches!=undefined)? ev.touches[0].clientX : (startDownX!=0? ev.clientX : 0),range=downX-startDownX; console.log(downX) var sliderRange= range<=0? 0 : (range<sliderMaxRange ? range : sliderMaxRange); slider.style.left=sliderRange+"px"; sliderCover.style.width=obj.sliderW/2 + sliderRange +"px"; smartCanvas.style.left=smartCanvasBL+sliderRange+"px"; } //停止滑动 function moveEnd(e){ var ev = e || window.event; ev.touches!=undefined? slider.ontouchmove=null : slider.onmousemove=null; var smartCanvasL= parseInt(smartCanvas.style.left); if(Math.abs(canvasCoverL - smartCanvasL) < obj.range){ obj.finish && obj.finish(true); }else{ obj.finish && obj.finish(false); var timer = null,step = 10; var sliderL = parseInt(slider.style.left) timer = setInterval(function () { sliderL -= step; step += 5; if (sliderL <= 0) { clearInterval(timer); sliderL = 0; slider.style.left = sliderCover.style.width = 0; smartCanvas.style.left = smartCanvasBL + "px" } slider.style.left = sliderL + "px"; sliderCover.style.width = sliderL+obj.sliderW/2 +"px"; smartCanvas.style.left = sliderL + smartCanvasBL+ "px"; }, 20) } } //事件调用 creatCanvas(); refreshDom.onclick=refreshDom.ontouchstart=creatCanvas; slider.ontouchstart=function(){ moveStart(); this.ontouchmove=moveProcess; this.ontouchend=moveEnd; }; slider.onmousedown=function(){ moveStart(); this.onmousemove=moveProcess; this.onmouseup=moveEnd; }; } window.$newSlider=slider })()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计1028个文字,预计阅读时间需要5分钟。

如何用JavaScript Canvas实现图片滑块验证码功能?

原文示例:本文实例为大家分享了js+canvas实现图片滑动验证的具体代码,供大家参考。js已封装好,拿来即用,兼容pc端和移动端,效果如下:+移动端:+pc端:+原理就不解释了,我之前的一个‘

改写后:本文提供js+canvas实现图片滑动验证的代码示例,方便大家参考。代码已封装,可直接使用,适用于pc端和移动端。具体效果如下:+移动端:+pc端:+原理略,详见之前相关内容。

本文实例为大家分享了js+cavans实现图片滑块验证的具体代码,供大家参考,具体内容如下

js已封装好,拿来即用,兼容pc端和移动端,

效果:

移动端:

pc端:

原理就不解释了,我之前的博客已经说过,只不过这个版本是结合了canvas实现,又兼容了pc端,直接拿代码就能用了。

代码:html

如何用JavaScript Canvas实现图片滑块验证码功能?

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta 鼠标按下时x轴位置 smartCanvasBL: 可移动canvas的left初始值 sliderMaxRange:slider可移动的最大距离 */ //生成canvas图案 function creatCanvas(){ //重置初始值 canvasCoverL=0;startDownX=0;smartCanvasBL=0; slider.style.left = sliderCover.style.width = 0; var l= 40, //滑块的正方形边长,不包括小圆点 r = 10, //小圆点半径 PI = Math.PI, sliderW=l+2*r, //滑块边长 rand=canvasSize(sliderW,r), //获取随机生成的x,y,left值 x = canvasCoverL= rand.x, //占位块x轴 y = rand.y; //占位块y轴 smartCanvasBL=rand.left; //先清空画布 bcxt.clearRect(0, 0, obj.w, obj.h) scxt.clearRect(0, 0, obj.w, obj.h) smartCanvas.width=obj.w; var srcIndex=Math.floor(Math.random()*(obj.imgArr.length-1)); img.src=obj.imgArr[srcIndex]; draw(scxt,x,y,l,r,PI,'clip'); draw(bcxt,x,y,l,r,PI,'fill'); img.onload = function() { //一定要在onload里调用,否则canvas里不能放进图片 bcxt.drawImage(img,0,0,obj.w,obj.h); scxt.drawImage(img,0,0,obj.w,obj.h); //裁剪滑块长度 var ImageData = scxt.getImageData(x, y-2*r, sliderW, sliderW) smartCanvas.width = sliderW; smartCanvas.style.left=rand.left+"px"; scxt.putImageData(ImageData, 0, y-2*r) } obj.refresh && obj.refresh(); } //随机生成canvas滑块和占位块,到左边的距离和到顶部的距离 function canvasSize(cw,r){ // cw为占位块和的宽度,r为绘制圆点的半径 var random =Math.random(); var x=Math.floor(obj.w/2 + random*(obj.w/2 - cw)); //x为占位块x坐标位置,保证占位块始终在画布的右半区域 var y=Math.floor(r*2+random*(obj.h - cw - r*2)); //y为占位块y坐标位置,(值至少为小圆半径的2倍才能完全显示,因为绘制的原点是小正方形的左上角) var left =Math.floor(random*(obj.w/2 - cw)); //canvas滑块的left值,这里的值范围保证它始终在画布的左半区域 return {x:x,y:y,left:left} } //绘制canvas滑块和占位块 function draw(ctx,x,y,l,r,PI,operation) { ctx.beginPath() ctx.moveTo(x, y) ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI) ctx.lineTo(x + l, y) ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI) ctx.lineTo(x + l, y + l) ctx.lineTo(x, y + l) ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true) ctx.lineTo(x, y) ctx.lineWidth = 1 ctx.fillStyle = 'rgba(200, 200, 200, 1)' ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)' ctx.stroke() ctx[operation]() ctx.globalCompositeOperation = 'destination-over' } //滑块被按下 function moveStart(e){ var ev = e || window.event; startDownX = ev.touches!=undefined? ev.touches[0].clientX : ev.clientX; } //滑块移动 function moveProcess(e){ var ev = e || window.event,downX = (ev.touches!=undefined)? ev.touches[0].clientX : (startDownX!=0? ev.clientX : 0),range=downX-startDownX; console.log(downX) var sliderRange= range<=0? 0 : (range<sliderMaxRange ? range : sliderMaxRange); slider.style.left=sliderRange+"px"; sliderCover.style.width=obj.sliderW/2 + sliderRange +"px"; smartCanvas.style.left=smartCanvasBL+sliderRange+"px"; } //停止滑动 function moveEnd(e){ var ev = e || window.event; ev.touches!=undefined? slider.ontouchmove=null : slider.onmousemove=null; var smartCanvasL= parseInt(smartCanvas.style.left); if(Math.abs(canvasCoverL - smartCanvasL) < obj.range){ obj.finish && obj.finish(true); }else{ obj.finish && obj.finish(false); var timer = null,step = 10; var sliderL = parseInt(slider.style.left) timer = setInterval(function () { sliderL -= step; step += 5; if (sliderL <= 0) { clearInterval(timer); sliderL = 0; slider.style.left = sliderCover.style.width = 0; smartCanvas.style.left = smartCanvasBL + "px" } slider.style.left = sliderL + "px"; sliderCover.style.width = sliderL+obj.sliderW/2 +"px"; smartCanvas.style.left = sliderL + smartCanvasBL+ "px"; }, 20) } } //事件调用 creatCanvas(); refreshDom.onclick=refreshDom.ontouchstart=creatCanvas; slider.ontouchstart=function(){ moveStart(); this.ontouchmove=moveProcess; this.ontouchend=moveEnd; }; slider.onmousedown=function(){ moveStart(); this.onmousemove=moveProcess; this.onmouseup=moveEnd; }; } window.$newSlider=slider })()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。