html5生成验证码

html5生成验证码

利用Html5的canvas标签生成画布,在画布上利用随机生成的数字画上验证码,背景为随机生成的颜色和杂乱的直线与点点。

进阶:利用表单插件属性绑定验证码数据(json)可以在发送时候或者异步通信进行后台数据获取与检查。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>验证码</title>
<style type="text/css">
#canvas {
cursor: pointer;
}
</style>
</head>

<body>
<canvas id="canvas" width="150px" height="50px"></canvas>
<script>
//生成随机数
function randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
//生成随机颜色RGB分量
function randomColor(min, max) {
var _r = randomNum(min, max);
var _g = randomNum(min, max);
var _b = randomNum(min, max);
return "rgb(" + _r + "," + _g + "," + _b + ")";
}
//先阻止画布默认点击发生的行为再执行drawPic()方法
document.getElementById("canvas").onclick = function(e) {
e.preventDefault();
drawPic();
};

function drawPic() {
//获取到元素canvas
var $canvas = document.getElementById("canvas");
var _str = "0123456789"; //设置随机数库
var _picTxt = ""; //随机数
var _num = 4; //4个随机数字
var _width = $canvas.width;
var _height = $canvas.height;
var ctx = $canvas.getContext("2d"); //获取 context 对象
ctx.textBaseline = "bottom"; //文字上下对齐方式--底部对齐
ctx.fillStyle = randomColor(180, 240); //填充画布颜色
ctx.fillRect(0, 0, _width, _height); //填充矩形--画画
for (var i = 0; i < _num; i++) {
var x = (_width - 10) / _num * i + 10;
var y = randomNum(_height / 2, _height);
var deg = randomNum(-45, 45);
var txt = _str[randomNum(0, _str.length)];
_picTxt += txt; //获取一个随机数
ctx.fillStyle = randomColor(10, 100); //填充随机颜色
ctx.font = randomNum(16, 40) + "px SimHei"; //设置随机数大小,字体为SimHei
ctx.translate(x, y); //将当前xy坐标作为原始坐标
ctx.rotate(deg * Math.PI / 180); //旋转随机角度
ctx.fillText(txt, 0, 0); //绘制填色的文本
ctx.rotate(-deg * Math.PI / 180);
ctx.translate(-x, -y);
}
for (var i = 0; i < _num; i++) {
//定义笔触颜色
ctx.strokeStyle = randomColor(90, 180);
ctx.beginPath();
//随机划线--4条路径
ctx.moveTo(randomNum(0, _width), randomNum(0, _height));
ctx.lineTo(randomNum(0, _width), randomNum(0, _height));
ctx.stroke();
}
for (var i = 0; i < _num * 10; i++) {
ctx.fillStyle = randomColor(0, 255);
ctx.beginPath();
//随机画原,填充颜色
ctx.arc(randomNum(0, _width), randomNum(0, _height), 1, 0, 2 * Math.PI);
ctx.fill();
}
return _picTxt; //返回随机数字符串
}
drawPic();
</script>
</body>

</html>
坚持原创技术分享,您的支持将鼓励我继续创作!