滑块验证码 纯js

效果

 注意:

图片文件夹命名为:imgs

图片命名为:imgs + 数字 + .jpg 格式
点击切换图片时可看着 F12 控制面板  如果没有这张图片,没有效果,

图片是随机的,可能会提示找不到图片,正常现象

(亲,也可以自己改变图片路径,在代码的最下面 refreshImg 函数里面)

我是在桌面新建了一个imgs文件夹和html文件,imgs里面放的imgs0.jpg,imgs1.jpg,imgs2.jpg,imgs3.jpg,因为没有imgs4.jpg所以没效果且报错

如果报$问题,请网上搜索 在线jquery,并修改。

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box {
             300px;
            padding: 20px;
            background-color: #fff;
            box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.4);
            }

            .imgBox {
            position: relative;
             300px;
            overflow: hidden;
            box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.4);
            }

            .imgBox img {
             100%;
            height: 250px;
            }

            .imgBox div {
            display: none;
            }

            .handle {
            display: flex;
            align-items: center;
            position: relative;
            height: 30px;
            border-radius: 20px;
            margin: 20px 0;
            padding: 4px 0 4px 70px;
            box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2) inset;
            background: #f5f5f5;
            user-select: none;
            }

            .text {
            opacity: 1;
            transition: opacity 0.5s ease-in-out;
            color: #aaa;
            }

            .swiper {
            position: absolute;
            top: -10px;
            left: 0px;
             58px;
            height: 58px;
            border-radius: 50%;
            background-color: pink;
            box-shadow: 2px 2px 6px 0 rgba(0, 0, 0, 0.2);
            }

            .verify {
            position: absolute;
            left: 10px;
             38px;
            height: 38px;
            border-radius: 5px;
            background-repeat: no-repeat;
            background-attachment: scroll;
            background-size: 300px;
            box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4), 0 0 10px 0 rgba(90, 90, 90, 0.4);
            z-index: 10;
            }

            .verified {
            position: absolute;
             38px;
            height: 38px;
            border-radius: 5px;
            background-color: rgba(0, 0, 0, 0.1);
            box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4) inset;
            }

            .refreshBox {
            border-top: 1px solid #ccc;
            padding: 15px 0 0 5px;
            }

            .refresh {
            color: #fff;
            cursor: pointer;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
            padding: 8px 20px;
            border-radius: 20px;
            background-color: #555;
            box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4);
            transition: all 0.5s ease-in-out;
            }
            .refresh.click {
            box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4) inset;
            }
    </style>
</head>

<body>
    <div class="box">
        <div class="imgBox">
            <div class="verify"></div>
            <div class="verified"></div>
        </div>
        <div class="handle">
            <span class="swiper"></span>
            <span class="text">拖动滑块</span>
        </div>
        <div class="refreshBox">
            <span class="refresh">点击切换图片</span>
        </div>
    </div>
</body>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script>
        var box = $('.box'),
            imgBox = $('.imgBox'),
            handle = $('.handle'),
            swiper = $('.swiper'),
            text = $('.text'),
            verify = $('.verify'),
            verified = $('.verified'),
            refresh = $('.refresh')

        // 图片集合
        var imgs = []
        for (let i = 1; i < 17; i++) {
            imgs.push('' + i + i)
        }

        $(function () {
            // 随机添加背景图
            refreshImg()

            refresh.click(function () {
                e = event || window.event
                e.stopPropagation()

                refreshImg()
                start()
            })

            refresh.mousedown(function () {
                $(this).addClass('click')
            })
            refresh.mouseup(function () {
                $(this).removeClass('click')
            })

            window.onload = start()
        })

        function start() {
            var verImg = document.getElementsByClassName('verImg')[0]

            if (verImg) {
                verImg.onload = function () {
                    // 获取图片高度
                    var imgH = this.clientHeight
                    // 随机生成坐标(图片框固定宽度为300px,高度不定)
                    var verX = 150 * (1 + Math.random()) - 38,
                        verY = imgH / 4 + Math.random() * imgH / 2

                    // 用户移动滑块函数
                    fnDown(verX, verY)
                }
            }
        }

        function fnDown(verX, verY) {
            swiper.mousedown(function () {
                e = event || window.event
                e.stopPropagation()

                // 30为模块宽度
                verify.css({
                    display: 'block',
                    top: `${verY}px`,
                    'background-position': `-${verX}px -${verY}px`
                })
                verified.css({ display: 'block', left: `${verX}px`, top: `${verY}px` })
                // 获取鼠标到按钮的距离
                var disX = e.clientX - $(this).offset().left,
                    disY = e.clientY - $(this).offset().top
                text.css('opacity', '0')

                // 防止重复绑定触发多次
                box.unbind('mousemove')
                box.unbind('mouseup')

                // 移动
                box.bind('mousemove', function () {
                    e = event || window.event
                    fnMove(e, disX, disY)
                })

                // 释放
                box.bind('mouseup', function () {
                    var stopL = verify.offset().left - 28
                    // 误差在2px以内则算做成功
                    if (Math.abs(stopL - verX) > 2) {
                        alert('验证失败')
                    } else {
                        alert('验证成功')
                    }
                    // 解除绑定,并将滑动模块归位
                    box.unbind('mousemove')
                    swiper.css('left', '0px')
                    verify.css('left', '10px')
                    text.css('opacity', '1')
                    box.unbind('mouseup')
                })
            })
        }

        function fnMove(e, posX, posY) {
            // 这里的e是以鼠标为参考
            var l = e.clientX - posX - $(handle).offset().left,
                winW = $(handle).width() + 29
            // 限制拖动范围只能在handle中
            if (l < 0) {
                l = 0
            } else if (l > winW) {
                l = winW
            }

            swiper.css('left', `${l}px`)
            verify.css('left', `${l + 10}px`)
        }

        function refreshImg() {
            // 随机生成下标
            var index = Math.round(Math.random() * 15)
            var imgH = 0

            verify.hide()
            verified.hide()

            var verImg = $('.verImg')
            if (verImg.length) {
                verImg.attr('src', `./imgs/imgs${[index]}.jpg`) //imgs文件夹存放图片
            } else {
                imgBox.prepend(`<img class='verImg' src="./imgs/imgs${[index]}.jpg" />`)
            }
            verify.css('background-image', `url('./imgs/imgs${[index]}.jpg')`)
        }
</script>
</html>
原文地址:https://www.cnblogs.com/queenDream/p/12760165.html