利用canvas实现滑动验证功能

HTML


        

        
            
                
            
            滑动验证         

CSS

    * {
                margin: 0;
                padding: 0;
            }

            body {
                background-color: #E8E8E8;
            }

            #canva {
                background: indianred;
            }


            #block {
                position: absolute;
                left: 0px;
            }

            .verSliderBlock {
                height: 40px;
                width: 40px;
                background-color: #fff;
                box-shadow: 0 0 3px rgba(0, 0, 0, .3);
                cursor: pointer;
                position: absolute;
                text-align: center;
                line-height: 40px;
                color: #45494c;
                font-size: 25px;
                font-weight: 400;

            }

            .bar {

                position: relative;
                text-align: center;
                width: 310px;
                height: 40px;
                line-height: 40px;
                margin-top: 15px;
                background: #f7f9fa;
                color: #45494c;
                border: 1px solid #e4e7eb;
                display: block;
            }

            #bar-mask {
                position: absolute;
                left: 0;
                top: 0;
                height: 40px;
                border: 0 solid #1991fa;
                background: #d1e9fe;
            }

 

JS


            
            
            //绘制滑块
            var canvas_ctx = document.getElementById('canva');
            var block_ctx = document.getElementById('block');
            var canvas_ctx = canvas.getContext('2d')
            var block_ctx = block.getContext('2d')
            var img = document.createElement('img')
            img.onload = function() {
                canvas_ctx.drawImage(img, 0, 0, 310, 155)
                block_ctx.drawImage(img, 0, 0, 310, 155)
                var blockWidth = w + r * 2
                var _y = y - r * 2 + 2 // 滑块实际的y坐标
                var ImageData = block_ctx.getImageData(x, _y, blockWidth, blockWidth)
                block.width = blockWidth
                block_ctx.putImageData(ImageData, 0, _y)
            };
            img.src = 'cbd.jpg';
            var x = Math.round(Math.random() * 200) + 10,
                y = Math.round(Math.random() * 100) + 10,

                w = 42,
                l = 42,
                r = 10,
                PI = Math.PI

            function draw(ctx, operation) {
                ctx.beginPath()
                ctx.moveTo(x, y)
                ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI)
                ctx.lineTo(x + l, y)
                ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI)
                ctx.lineTo(x + l, y + l)
                ctx.lineTo(x, y + l)
                ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true)
                ctx.lineTo(x, y)
                ctx.lineWidth = 2
                ctx.fillStyle = 'rgba(255, 255, 255, 0.7)'
                ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)'
                ctx.stroke()
                ctx[operation]()
                ctx.globalCompositeOperation = 'overlay'
            }

            draw(canvas_ctx, 'fill')
            draw(block_ctx, 'clip')

           //添加移动事件
            var block_slider = document.querySelector("#block");
            var slider = document.querySelector(".verSliderBlock");
            var slider_mark = document.querySelector("#bar-mask");
            //用于判断当前是否是在按住滑块的情况下
            var yd = false
            var moveX = 0
            var downX = 0
            
            //鼠标按下
            slider.onmousedown = function(e) {
                downX = e.clientX;
                yd = true

            }

            //鼠标移动事件
            function hadleMousemove(e) {
                if (yd) {
                    moveX = e.clientX - downX;

                    if (moveX >= 310) {
                        moveX = 310 - 40
                    }

                    if (moveX > -2) {
                        slider.style.backgroundColor = "#1991FA";
                        slider_mark.style.borderWidth = "1px"
                        slider_mark.style.borderColor = "#1991fa"
                        slider_mark.style.width = moveX + 40 + "px";

                        block_slider.style.left = (310 - 40 - 20) / (310 - 40) * moveX + "px";
                        slider.style.left = moveX + "px";

                    }
                }

            }
            
            //鼠标抬起事件
            function hadleMouseup(e) {
                if (yd) {
                    slider.onmousemove = null;

                    block_slider.style.left = (310 - 40 - 20) / (310 - 40) * moveX + "px";
                    slider.style.left = moveX + "px";
                    if (Math.abs((310 - 40 - 20) / (310 - 40) * moveX - x) < 15) {
                        setTimeout(() => {
                            rest();

                        }, 1000)
                    } else {
                        slider_mark.style.backgroundColor = "#fce1e1"
                        slider_mark.style.borderWidth = "1px"
                        slider_mark.style.borderColor = "#f57a7a"

                        slider.style.backgroundColor = "#f57a7a"
                        setTimeout(() => {
                            rest();

                        }, 1000)
                    }

                    yd = false
                }
            }

           //鼠标在按住滑块下移动
            slider.onmousemove = function(e) {
                hadleMousemove(e)
            }
            //鼠标在滑块下抬起
            slider.onmouseup = function(e) {
                hadleMouseup(e)
            }
            
            //设置全局的移动事件,当鼠标按下滑块后,移动过程中鼠标可能会移出滑块,这是滑块也会监听鼠标的移动进行相应的移动
            document.addEventListener('mousemove', function(e) {
                hadleMousemove(e)
            })
            document.addEventListener('mouseup', function(e) {
                hadleMouseup(e)
            })


            function rest() {
                slider.style.backgroundColor = "#fff";
                slider.style.left = "0px"
                block_slider.style.left = "0px"

                slider_mark.style.width = "0px"
                slider_mark.style.backgroundColor = "#d1e9fe"
                slider_mark.style.borderWidth = "0px"
                slider_mark.style.borderColor = "#d1e9fe"
            }

 

效果如图:

利用canvas实现滑动验证功能_第1张图片

源码地址: https://download.csdn.net/download/y5492853/11954766

你可能感兴趣的:(杂项)