canvas验证码 - 滑块拼图

滑块拼图型的验证方式已经流行起来,多数的实现方式是直接加载两张分割好的图片。现在用canvas去自动修剪图片,节省修图工作量和http请求:
- 加载一张整图,用canvas切割缺口,缺口位置在固定范围内随机
- 点击刷新按钮重新加载和切割
- 滑块响应拖动,实时更新缺口位置
- 拖动结束时计算位置是否匹配,允许一定误差
DOM结构如下:
<div class="verification">
<div class="verPicture">
<!-- 图片未加载时显示提示 -->
<div class="verLoading">正在加载 ...</div>
<!-- 刷新按钮 -->
<div class="verRefresh" title="刷新"></div>
<!-- 存放图片元素 -->
<canvas id="verCanvas" width="285" height="145"></canvas>
</div>
<div class="verSlider">
<p>向右滑动滑块填充拼图</p>
<!-- 滑块 -->
<div class="verSliderBlock"></div>
</div>
</div>
图片和canvas大一统一,此例以285*145为准,缺口切成正方形:
var imgs = ["verify.png", "verify1.png", "verify2.png", "verify3.png", "verify4.png"] // 备用的验证图片
var imgSrc = imgs[parseInt(Math.random() * 5)]; //随机一个图片地址
var slider = $(".verSliderBlock")[0];
var canvas = $("#verCanvas")[0];
var context = canvas.getContext("2d");
var img = document.createElement('img');
var rightDistance; //记录正确的移动距离
var topDistance; //记录缺口离顶部的距离
var slideFlag = false; //标记滑块是否处于移动状态
var origin = 0; //标记移动起始位置的x坐标 // distance标记移动的距离,值改变时触发滑块移动和canvas重绘
Object.defineProperty(window, "distance", {
set: function(distance) {
this.value = distance;
if (distance > 0 && distance < 246) {
$(slider).css("left", distance);
draw(distance);
} else if (distance <= 0) {
$(slider).css("left", 0);
draw(0);
} else {
$(slider).css("left", 247);
draw(247);
}
},
get: function() {
return this.value;
}
});
initCanvas(imgSrc); // 刷新事件
function verRefresh() {
unbindSlide();
imgSrc = imgs[parseInt(Math.random() * 5)];
slideFlag = false;
distance = 0;
origin = 0;
$(".verSlider p").html("向右滑动滑块填充拼图").removeClass();
initCanvas(imgSrc);
}
$(".verRefresh").click(verRefresh); // 判断位置是否正确,用于滑动结束时
function judgeDistance() {
if (distance > rightDistance - 3 && distance < rightDistance + 3) {
$(slider).css("left", 247);
$(".verSlider p").html("验证成功").removeClass("hide").addClass("success");
setTimeout(function() {
console.log("success")
}, 1000)
} else {
distance = 0;
$(".verSlider p").html("验证失败").removeClass("hide").addClass("fail");
setTimeout(verRefresh, 1000)
}
} /**** 滑动监听 ****/ function onmousedown(e) {
slideFlag = true;
$(slider).addClass("active");
origin = e.x;
} function onmousemove(e) {
if (slideFlag) {
// 隐藏滑动提示文字
$(".verSlider p").addClass("hide");
//计算位置
distance = e.x - origin;
}
} function onmouseup(e) {
if (slideFlag) {
slideFlag = false;
distance = e.x - origin;
$(slider).removeClass("active");
judgeDistance()
}
} function bindSlide() {
slider.addEventListener("mousedown", onmousedown);
document.addEventListener("mousemove", onmousemove, true);
document.addEventListener("mouseup", onmouseup, true);
} function unbindSlide() {
slider.removeEventListener("mousedown", onmousedown);
document.removeEventListener("mousemove", onmousemove, true);
document.removeEventListener("mouseup", onmouseup, true);
} /**** canvas对象 ****/
function initCanvas(img_src) {
$(".verLoading").show();
img.src = img_src;
img.onload = function() {
$(".verLoading").hide();
bindSlide(slider);
// 获取随机位置
rightDistance = parseInt(Math.random() * 100 + 145);
topDistance = parseInt(Math.random() * 80 + 10);
draw();
};
} function draw(left) {
context.clearRect(0, 0, canvas.width, canvas.height)
// 绘制整图和半透明缺口
context.drawImage(img, 0, 0, canvas.width, canvas.height);
context.globalAlpha = 0.9;
context.fillStyle = "#fff";
context.fillRect(rightDistance, topDistance, 35, 35);
context.globalAlpha = 0.5;
context.strokeStyle = "#000";
context.lineWidth = 1;
context.strokeRect(rightDistance, topDistance, 35, 35);
// 绘制脱离的缺口
context.globalAlpha = 1;
context.shadowBlur = 10;
context.shadowColor = "#fff";
context.strokeStyle = "#fff";
context.strokeRect(left || 2, topDistance, 35, 35);
context.drawImage(img, rightDistance, topDistance, 35, 35, left || 2, topDistance, 35, 35);
}
canvas验证码 - 滑块拼图的更多相关文章
- python3 使用OpenCV计算滑块拼图验证码缺口位置
前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip insta ...
- iOS 滑块拼图游戏(Puzzle8)
代码地址如下:http://www.demodashi.com/demo/11505.html 一.准备工作 先了解一个定义和定理 定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺 ...
- 原生js+canvas实现滑动拼图验证码
上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图.下面介绍具体步骤. 首先随便找一张图片渲染到c ...
- 原生javascript 制作canvas 验证码
<canvas id="></canvas> <a href="#" id="changeImg">看不清,换一张 ...
- Javascript Canvas验证码
用Canvas画的验证码,效果图如下 1.验证码的JS代码,保存到一个名称是validatedCode.js的文件内,代码如下: (function(window,document){ functio ...
- 用Canvas做视频拼图
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canva ...
- canvas验证码 - 随机字母数字
基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...
- canvas验证码实现
1 <!DOCTYPE html> <html> <!-- head --> <head> <meta charset="utf-8&q ...
- 【vue】canvas验证码组件--数字/数字加字母
基于canvas的数字/数字+字符验证码 SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...
随机推荐
- 02--STL算法(函数对象和谓词)
一:函数对象(仿函数):实现状态记录等其他操作<相对于普通函数> 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象. 即是重载了“ ...
- 使用openssh-clients的scp命令来传输文件
了解openssh-client是请参阅:https://blog.csdn.net/u010215256/article/details/53239905 了解scp命令来传输文件请参阅:https ...
- 【树】Binary Tree Right Side View
题目: Given a binary tree, imagine yourself standing on the right side of it, return the values of the ...
- javascript字符串拼接
var c='../Project/SelectPerson.aspx?personList='+'"'+personListValue+'"' X('Window2').x_sh ...
- 09 - JavaSE之线程
线程 线程的基本概念 线程是一个程序里面不同的执行路径. 进程与线程的区别 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换开销大. 线程可以看作轻量级的进程,同一类线程共享代码和数据空间 ...
- 关系型数据库MySQL主从同步-读写分离
1.环境准备 我的数据库版本是MySQL 5.6 MySQL主机至少两个实例,可以是多实例,可以是多台主机 关闭selinux,关闭防火墙等基础优化 2.安装 yum -y install make ...
- jqGrid随窗口大小变化自适应大小-转
第一种: jqGrid随窗口大小变化自适应宽度 $(function(){ $(window).resize(function(){ $("#listId").setGridWid ...
- android开发学习笔记系列(1)-android起航
前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...
- 【起】ACM类下为过往所做过的部分算法题目
[起]ACM类下为过往所做过的部分算法题目 几百道题,日后细细品味.
- HTTP协议以及HTTP请求中8种请求方法
HTTP协议以及HTTP请求中8种请求方法 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准. 什么是http协议? http协议,是互联网中最常见的网络通信标准. http ...