效果图如下:
<!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>验证码</title> </head> <body> <canvas id="canvas"></canvas> </body> </html> <script> class IdentifyCode { constructor(canvasId, width, height) { this.canvas = document.querySelector(`#${canvasId}`); this.ctx = this.canvas.getContext("2d"); this.canvas.width = width; this.canvas.height = height; this.arrRange = []; this.code = ""; this.range(); this.buildCode(); this.drawBakcGround(); this.drawInterferingline(); this.drawInterferencePoint(); this.drawWord(); } //生成一个随机数 randomNum(min, max) { return parseInt(Math.random() * (max - min) + min); } //生成随机颜色 randomColor(min, max) { var r = this.randomNum(min, max); var g = this.randomNum(min, max); var b = this.randomNum(min, max); return `rgb(${r},${g},${b})` } //生成字母和数字 range() { this.arrRange = []; //0-9 for (let i = "0".charCodeAt(0); i <= "9".charCodeAt(0); i++) { this.arrRange.push(String.fromCharCode(i)) } //A-Z for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { this.arrRange.push(String.fromCharCode(i)); } //a-z for (let i = "a".charCodeAt(0); i < "z".charCodeAt(0); i++) { this.arrRange.push(String.fromCharCode(i)) } } //生成四位随机码 buildCode() { var code = ""; for (let i = 0; i < 4; i++) { code += this.arrRange[Math.floor(Math.random() * this.arrRange.length)] } this.code = code; } //画背景 drawBakcGround() { this.ctx.fillStyle = this.randomColor(180, 230); this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); this.ctx.fill() } //写字 drawWord() { var bothSide = 15;//两边间距 var letterSpace = (this.canvas.width - 2 * bothSide) / 4; for (var i = 0; i < 4; i++) { this.ctx.font = `${this.randomNum(this.canvas.width / 4, this.canvas.width / 2)}px 黑体`; this.ctx.fillStyle = this.randomColor(80, 150); this.ctx.save(); this.ctx.translate(bothSide + letterSpace * i, this.canvas.height / 2) this.ctx.rotate(Math.random() * (Math.PI / 6) * (-1) ** (Math.round(Math.random()))); this.ctx.textBaseline = "middle"; this.ctx.fillText(this.code[i], 0, 0); this.ctx.restore(); } } //画干扰线 drawInterferingline() { for (var i = 0; i < 6; i++) { this.ctx.beginPath(); this.ctx.moveTo(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height)); this.ctx.lineTo(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height)); this.ctx.closePath(); this.ctx.strokeStyle = this.randomColor(180, 230); this.ctx.lineWidth = Math.ceil(Math.random() * 2); this.ctx.stroke(); } } //画干扰点 drawInterferencePoint() { var r = 1; var num = 40; for (var i = 0; i < Math.floor(num); i++) { this.ctx.beginPath(); this.ctx.fillStyle = this.randomColor(150, 200); console.log(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height), r, 0, 2 * Math.PI, true) this.ctx.arc(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height), r, 0, 2 * Math.PI, true) this.ctx.fill(); this.ctx.closePath(); } } //更换验证码 update() { this.clear(); this.range(); this.buildCode(); this.drawBakcGround(); this.drawInterferingline(); this.drawInterferencePoint(); this.drawWord(); } //清除 clear() { this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) } } var identifyCode = new IdentifyCode("canvas", 100, 40); document.querySelector("#canvas").onclick = function () { identifyCode.update() } </script>