滑块拼图型的验证方式已经流行起来,多数的实现方式是直接加载两张分割好的图片。现在用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验证码 - 滑块拼图的更多相关文章

  1. python3 使用OpenCV计算滑块拼图验证码缺口位置

    前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip insta ...

  2. iOS 滑块拼图游戏(Puzzle8)

    代码地址如下:http://www.demodashi.com/demo/11505.html 一.准备工作 先了解一个定义和定理 定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺 ...

  3. 原生js+canvas实现滑动拼图验证码

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

  4. 原生javascript 制作canvas 验证码

    <canvas id="></canvas> <a href="#" id="changeImg">看不清,换一张 ...

  5. Javascript Canvas验证码

    用Canvas画的验证码,效果图如下 1.验证码的JS代码,保存到一个名称是validatedCode.js的文件内,代码如下: (function(window,document){ functio ...

  6. 用Canvas做视频拼图

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canva ...

  7. canvas验证码 - 随机字母数字

    基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...

  8. canvas验证码实现

    1 <!DOCTYPE html> <html> <!-- head --> <head> <meta charset="utf-8&q ...

  9. 【vue】canvas验证码组件--数字/数字加字母

    基于canvas的数字/数字+字符验证码   SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...

随机推荐

  1. RabbitMq qos prefetch 消息堵塞问题

    mq是实现代码扩展的有利手段,个人喜欢用概念来学习新知识,介绍堵塞问题的之前,先来段概念的学习. ConnectionFactory:创建connection的工厂类 Connection: 简单理解 ...

  2. C# 连接Paradox DB

    Paradox数据库是一个成名于15年前的数据库,那时候Borland公司还存在.最近客户提出需求,要在一套用了12年+的应用程序上作些功能更改.这套应用程序使用Delphi+Paradox数据库. ...

  3. Mac下使用zsh不执行/etc/profile文件

    Mac下使用了zsh会不执行/etc/profile文件,当然,如果用原始的是会执行. 转而执行的是这两个文件,每次登陆都会执行: ~/.zshrc与/etc/zshenv与/etc/zshrc 所以 ...

  4. Netty核心概念(10)之内存管理

    1.前言 之前的章节已经将启动demo中能看见的内容都分析完了,Netty的一个整体样貌都在第8节线程模型最后给的图画出来了.这些内容解释了Netty为什么是一个异步事件驱动的程序,也解释了Netty ...

  5. linux安装unzip及使用

    安装完linux ,发现没有UNZIP,没办法,重新安装. 1.获取unzip源码 sudo wget http://downloads.sourceforge.net/infozip/unzip55 ...

  6. 【转】JVM参数设置、分析

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中 ...

  7. 复刻smartbits的国产网络测试工具minismb-如何测试ip限速

    复刻smartbits的网路性能测试工具MiniSMB,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和最 ...

  8. Markdown编辑器-图形化

    SELECT * from yffee_favourable_detail yfd LEFT JOIN yffee_favourable yf on yfd.minor_id = yf.major_i ...

  9. button按钮被输入法顶起来,遮盖了input输入框

    在做手机端的表单提交的时候,在chrome浏览器调试的时候,忘记输入法会引起布局的问题.在webApp里input输入框,会自动调起输入法,但是输入法会改变浏览器的可视区域的大小.就是会把浏览器可视区 ...

  10. Golang 并发Groutine实例解读(二)

    go提供了sync包和channel机制来解决协程间的同步与通信. 一.sync.WaitGroup sync包中的WaitGroup实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就 ...