canvas生成随机(颜色位置)验证码

一、什么是canvas?

1.HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成。

2.<canvas> 标签只是图形容器,您必须使用脚本来绘制图形。

3.你可以通过多种方法使用 canvas 绘制路径,盒、圆、字符以及添加图像。

4.canvasc初始宽高300,150

二.功能实现

canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成。

①功能需求:

1.需要的内容:字母数字组合(长度随机5-7,颜色随机,位置随机,大小随机);出现一些干扰信息(线条,圆)。

2.简单实现一下验证。

②代码部分:

1.html+css代码

    <div class="yzm">验证码:</div>
    <canvas width="100" height="50"></canvas>
    <input type="text">
    <button>验证</button>
    <div class="trun1">验证成功</div>
    <div class="false1">验证失败</div>
  canvas {
            background-color: #eee;
            position: relative;
            top: 20px;
            left: 300px;
            border: 1px solid;
        }

        input {
            width: 180px;
            height: 35px;
            font-size: 20px;
        }

        button {
            position: absolute;
            top: 29px;
            left: 416px;
            width: 80px;
            height: 50px;
            font-size: 20px;
        }

        .yzm {
            position: absolute;
            top: 35px;
            left: 30px;
            font-size: 26px;
        }
        .trun1{
          background-color:aqua;
          width: 189px;
          height: 20px;
          text-align: center;
          position: absolute;
          left: 115px;
          display: none;
        }
        .false1{
            background-color:red;
          width: 189px;
          height: 20px;
          text-align: center;
          position: absolute;
          left: 115px;
          display: none;
        }

2.js代码

var mixin = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNIPQRSTUVWXYZ"
        // 获取画布
        var canvas = document.getElementsByTagName('canvas')[0];
        //获取画笔
        var ctx = canvas.getContext('2d');
        //用来存储验证码
        var verify=""
        //随机验证码的个数
        var random = parseInt(getRandom(5, 5));
        // 用来控制验证码出现的位置
        var offx = 0;
        for (var i = 0; i < random; i++) {
            //入栈,保存之前画布的设置
            ctx.save()
            var text = texts();
            //随机字体的大小
            ctx.font = `${getRandom(15, 30)}px 楷体`
            // 随机字体的颜色
            ctx.fillStyle = `${getRandomColor()}`
            // ctx.rotate(Math.PI/180*30);
            //基线
            //控制文字的倾斜
            if(i%2){
                ctx.rotate(Math.PI/180*10)
            }else{
                ctx.rotate(-Math.PI/180*10)
            }
            //文字的对齐方式:top文本基线在文本块的顶部。
            ctx.textBaseline = 'top';
            // 对文本进行渲染
            ctx.fillText(text, offx, getRandom(0, 20))
            //文本文字进行递增
            offx += 20
            //存储验证码,方便验证
            verify+=text;
            //出栈恢复为画笔入栈时的状态
            ctx.restore();
        }
        //干扰线
        //线的起点
        ctx.moveTo(getRandom(0, 20), getRandom(0, 50));
        //线的终点
        ctx.lineTo(getRandom(80, 100), getRandom(0, 50));
        //对线进行连接
        ctx.closePath();
        //进行渲染 默认黑色
        ctx.stroke();

        ctx.moveTo(getRandom(0, 100), getRandom(0, 10));
        ctx.lineTo(getRandom(0, 100), getRandom(40, 50));
        ctx.closePath();
        ctx.stroke();


        //干扰圆
        //创建一个新的路径
        ctx.beginPath();
        ctx.arc(getRandom(25, 75), getRandom(10, 40), getRandom(4, 25), 0, Math.PI * 2);
        ctx.stroke();
        
        // console.log(verify);
        //验证
        var ipt = document.getElementsByTagName('input')[0];
        var btn = document.getElementsByTagName('button')[0];
        var trun1 =document.getElementsByClassName('trun1')[0];
        var false1 =document.getElementsByClassName('false1')[0];
        console.log(trun1);
        
        btn.onclick = function(){
            var value = ipt.value;
            value =value.toLowerCase();
            verify = verify.toLowerCase();
            console.log(verify);
            // console.log(verify);
            // console.log(value);
            if(verify == value){
            // console.log("32222");
            trun1.style.display = 'block'
            false1.style.display = 'none'
        }else{
            false1.style.display = 'block'
            trun1.style.display = 'none'
        }
        }
       

        //封装一个获取随机的验证码
        function texts() {
            var index = Math.floor(Math.random() * (mixin.length - 1));
            return mixin[index];
        }
        //封装一个随机数
        function getRandom(min, max) {
            return Math.random() * (max - min) + min;
        }
        //封装一个随机颜色
        function getRandomColor() {
            return `rgb(${getRandom(0, 255)},${getRandom(0, 255)},${getRandom(0, 255)})`
        }

三、canvas方法总结

1.线条  开始moveTo() 结束 lineTo()

2.矩形 1.rect(x.y,w,h)2.fillRect()3.strokeRect()

3.圆弧arc(x,y,r,起始弧度,结束弧度,方向)方向1逆时针2顺时针 默认顺时针

4.文本 strokeText()fillText() 文本基线:textBaseline

5.阴影效果shadowColor shadowBlur shadowOffsetX shadowOffsetY

6.圆角矩形 arcTo(x1, y1, x2, y2, radius)

7.画笔样式   fillStyle = '颜色' 设置填充填充样式; strokeStyle = '颜色' 描边颜色;lineWidth = '10' 描边线条的宽度;font = '20px 宋体'; stroke() 进行描边渲染;fill() 进行填充渲染;beginPath() 重新开启一个路径;closePath() 闭合当前路径。

8.保存和恢复  save() 保存当前画布的属性的状态,存入栈中;restore() 从栈中出栈,将画布的状态进行恢复;

9.绘制图片 drawImage(img,x,y,w,h)    

10.清画布 clearRect(x, y, width, height);、

最后,欢迎大家指正补充

猜你喜欢

转载自blog.csdn.net/A20201130/article/details/123440688
今日推荐