验证码一样平常用PHP和java等后端措辞编写。

但是在前端,用canva或者SVG也可以绘制验证码。

绘制验证码不能是大略的随机字符串,而该当在绘制界面有一些滋扰项:

php模板绑定swipervueswiper的应用教程 HTML

如:滋扰线段、滋扰圆点、背景等等。

这里的这个demo的canvas验证码滋扰项比较大略。

可以在图示中看到本例中的滋扰项。

canvas验证码展示效果:

点击实现改变(重绘)验证码:

在掌握台运行函数输出返回值(验证码):

源码 :

<!DOCTYPE html><html lang=\"大众en\"大众> <head> <meta charset=\公众UTF-8\"大众> <meta name=\"大众viewport\公众 content=\"大众width=device-width, initial-scale=1.0\"大众> <meta http-equiv=\"大众X-UA-Compatible\公众 content=\"大众ie=edge\"大众> <title>canvas验证码</title></head> <body> <canvas width=\公众200\"大众 height=\"大众60\"大众 id=\"大众check\公众 style=\"大众border:1px solid #000;\"大众>您的浏览器不支持canvas标签!
</canvas> <script> var ctx = document.getElementById(\"大众check\"大众).getContext(\公众2d\公众); var ctxW = document.getElementById(\"大众check\"大众).clientWidth; var ctxH = document.getElementById(\"大众check\"大众).clientHeight; / 产生一个随机数 可设置随机数区间 @param {[Number]} min [随机数区间下限] @param {[Number]} max [随机数区间上限] @return {[Number]} [返回一个在此区间的随机数] / function ranNum(min, max) { return Math.random() (max - min) + min; // 前端全栈开拓学习互换圈:866109386 }//面向1-3年履历前端职员 //帮助打破技能瓶颈,提升思维能力 / 返回一个随机颜色 可设置颜色区间 @param {[Number]} min [颜色下限] @param {[Number]} max [颜色上限] @return {[String]} [随机颜色] / function ranColor(min, max) { var r = ranNum(min, max); var g = ranNum(min, max); var b = ranNum(min, max); // return \公众rgb(\"大众 + r + \"大众,\公众 + g + \"大众,\公众 + b + \"大众)\"大众; return `rgb(${r},${g},${b})`; } / 随机字符串数组 @return {[Array]} [随机数组] / function ranStr() { var str = \"大众QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789\"大众; return str.split(\公众\"大众).sort(function () { return Math.random() - 0.5 }); } / 绘制文本字符串 @param {[String]} canvasId [canvas的id] @param {[Number]} canvasW [canvas的width] @param {[Number]} canvasH [canvas的height] @param {[Number]} num [绘制验证码的字数] @param {[Number]} fsMin [字体大小下限] @param {[Number]} fsMax [字体大小上限] @param {[Number]} frMin [字体旋转偏移下限] @param {[Number]} frMax [字体旋转偏移上限] @param {[Number]} min [颜色下限] @param {[Number]} max [颜色上限] @return {[String]} [随机字符串] / function drawText(canvasId, canvasW, canvasH, num, fsMin, fsMax, frMin, frMax, min, max) { var str = \公众\"大众; for (var i = 0; i < num; i++) { var char = ranStr()[Math.floor(0, ranStr().length)]; var fs = ranNum(fsMin, fsMax); canvasId.font = fs + \公众px Verdana\"大众; canvasId.fillStyle = ranColor(min, max); // 保存绘制的状态 canvasId.save(); // context.translate(x,y); // x 添加到水平坐标(x)上的值 // y 添加到垂直坐标(y)上的值 // 偏移 canvasId.translate(canvasW / num i + canvasW / 20, 0); // 变换角度 canvasId.rotate(ranNum(frMin, frMax) Math.PI / 180); // context.fillText(text,x,y,maxWidth); // text 规定在画布上输出的文本。
// x 开始绘制文本的 x 坐标位置(相对付画布)。
// y 开始绘制文本的 y 坐标位置(相对付画布)。
// maxWidth 可选。
许可的最大文本宽度,以像素计。
canvasId.fillText(char, 0, (canvasH + fs) / 2.5, canvasW / num); // 返回之前保存过的路径状态和属性 ctx.restore(); str += char; } // console.log(str); return str; } / 绘制背景 @param {[String]} canvasId [canvas的id] @param {[Number]} canvasW [canvas的width] @param {[Number]} canvasH [canvas的height] @param {[Number]} min [下限] @param {[Number]} max [上限] / function drawBg(canvasId, canvasW, canvasH, min, max) { // 绘制canvas背景 canvasId.fillStyle = ranColor(min, max); // 添补颜色 canvasId.fillRect(0, 0, canvasW, canvasH); } / 绘制滋扰 圆点 @param {[String]} canvasId [canvas的id] @param {[Number]} canvasW [canvas的width] @param {[Number]} canvasH [canvas的height] @param {[Number]} num [绘制的数量] @param {[Number]} r [圆点半径] @param {[Number]} min [下限] @param {[Number]} max [上线] / function drawCircle(canvasId, canvasW, canvasH, num, r, min, max) { for (var i = 0; i < num; i++) { // 开始绘制 (拿起笔) canvasId.beginPath(); // context.arc(x,y,r,sAngle,eAngle,counterclockwise); (绘制) // x 圆的中央的 x 坐标。
// y 圆的中央的 y 坐标。
// r 圆的半径。
// sAngle 起始角,以弧度计。
(弧的圆形的三点钟位置是 0 度)。
// eAngle 结束角,以弧度计。
// counterclockwise 可选。
规定该当逆时针还是顺时针绘图。
False = 顺时针,true = 逆时针。
canvasId.arc(ranNum(0, canvasW), ranNum(0, canvasH), r, 0, 2 Math.PI); // 添补颜色 canvasId.fillStyle = ranColor(min, max); // 添补 canvasId.fill(); // 闭合绘制 (放开笔) canvasId.closePath(); } } / 绘制滋扰 线段 @param {[String]} canvasId [canvas的id] @param {[Number]} canvasW [canvas的width] @param {[Number]} canvasH [canvas的height] @param {[Number]} num [绘制的数量] @param {[Number]} min [下限] @param {[Number]} max [上线] / function drawLine(canvasId, canvasW, canvasH, num, min, max) { for (var i = 0; i < num; i++) { // 开始绘制 (拿起笔) canvasId.beginPath(); // 绘制开始点 canvasId.moveTo(ranNum(0, canvasW), ranNum(0, canvasH)); // 绘制结束点 canvasId.lineTo(ranNum(0, canvasW), ranNum(0, canvasH)); canvasId.strokeStyle = ranColor(min, max); canvasId.stroke(); canvasId.closePath(); } } // 绘制验证码 function drawCanvas() { // 清空canvas ctx.clearRect(0, 0, 200, 60); // 绘制背景 drawBg(ctx, ctxW, ctxH, 200, 255); // 绘制滋扰圆点 drawCircle(ctx, ctxW, ctxH, 20, 5, 200, 255); // 绘制滋扰线段 drawLine(ctx, ctxW, ctxH, 20, 0, 255); // 绘制验证码 var str = drawText(ctx, ctxW, ctxH, 4, 10, 50, -30, 30, 0, 100); return str; } drawCanvas(); document.getElementById('check').onclick = drawCanvas; </script></body> </html>

对前真个技能,架构技能感兴趣的同学关注我的头条号,并在后台私信发送关键字:“前端”即可获取免费的架构师学习资料

知识体系已整理好,欢迎免费领取。
还有口试视频分享可以免费获取。
关注我,可以得到没有的架构履历哦!