拖动滑块验证

简介: 拖动滑块验证

有事情是要说出来的,不要等着对方去领悟,因为对方不是你,不知道你想要什么,等到最后只能是伤心和失望。尤其是感情。——《麦兜》

效果:

源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>drag</title>
    <style>
        /* 外部放置滑动区域 */
        .container {
            width: 100%;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        /* 滑动区域 */
        .drag-verify-band {
            background: #f4f7f8;
            width: 300px;
            height: 40px;
            border-radius: 12px;
            position: relative;
            box-shadow: 0 10px 20px -10px #ccc;
            transform: translateY(-3px);
        }
        /* 滑块 */
        .verify-btn {
            transition: background-color 0.2s;
            user-select: none;
            cursor: all-scroll;
            background-color: #1a5cff;
            color: #fff;
            border-radius: 12px;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            position: absolute;
            font-size: 12px;
        }
        /* 滑块内容文本 */
        .verify-btn-text {
            margin: 0 10px;
            white-space: nowrap;
        }
</style>
</head>
<body>
    <div class="container">
        <!-- 滑动区域 -->
        <div class="drag-verify-band">
            <!-- 滑块 -->
            <div class="verify-btn">
                <!-- 滑块内文本 -->
                <div class="verify-btn-text">向右滑动解锁👉</div>
            </div>
        </div>
    </div>
    <script>
        // 获取可滑动区域
        const verifyBand = document.querySelector(".drag-verify-band")
        // 获取滑块区域宽度、偏移位置
        const { offsetWidth: bandWidth, offsetLeft: bandLeft } = verifyBand
        // 获取滑块
        const verifyBtn = document.querySelector(".verify-btn");
        // 获取滑块宽度
        const { offsetWidth: btnWidtn } = verifyBtn
        // 给滑块绑定鼠标按下事件
        verifyBtn.addEventListener('mousedown', function (btnMouseDownEvent) {
            // 获取当前鼠标点击时相对于父节点x坐标,点击滑块越右,偏移量越大
            let { layerX: mouseOffsetX } = btnMouseDownEvent
            // 定义是否滑动到最右的标识
            let isMostRight = false
            // 定义移动函数
            function mousemove(e) {
                // 获取当前鼠标移动时,相对于视窗最左侧的x坐标
                const { clientX } = e
                // 鼠标相对视窗最左侧的x坐标,需要减去 滑块外部滑动区域的x坐标,再减去 鼠标按下的x偏移量,得到当前需要移动的距离
                let safeX = clientX - bandLeft - mouseOffsetX
                // 移动距离不能小于0(不能超出最左边)
                safeX = Math.max(safeX, 0)
                // 移动距离不能大于 滑块的宽度减去按钮的宽度(不能超出最右边)
                const maxOffsetX = bandWidth - btnWidtn
                safeX = Math.min(safeX, maxOffsetX);
                // 记录一下是否滑动到了最右边
                isMostRight = safeX === maxOffsetX
                // 日志一下
                // console.log({ safeX });
                // 将滑块样式的left设置为当前移动的距离
                verifyBtn.style.left = `${safeX}px`;
            }
            // 抬起鼠标事件
            function mouseup(e) {
                // 判断当前滑块是否滑到最右边
                console.log({ isMostRight });
                if (isMostRight) {
                    // 成功验证逻辑
                    // 此处可以改为你自定义逻辑
                    console.log('验证成功');
                    // 这里首先替换了按钮内的文本
                    verifyBtn.innerHTML = `<div class="verify-btn-text">验证成功☕</div>`
                    // 将坐标位置设为最右边
                    verifyBtn.style.left = 'initial';
                    verifyBtn.style.right = 0;
                    // 按钮背景颜色更改
                    verifyBtn.style.backgroundColor = '#46c93a';
                    // 2s后重置一下
                    setTimeout(() => {
                        verifyBtn.innerHTML = `<div class="verify-btn-text">向右滑动解锁👉</div>`
                        verifyBtn.style.backgroundColor = '#1a5cff';
                        verifyBtn.style.right = 'initial';
                        verifyBtn.style.left = 0
                    }, 2000)
                } else {
                    // 失败逻辑,重置滑块位置
                    verifyBtn.style.left = 0;
                }
                // 销毁事件监听
                document.removeEventListener('mousemove', mousemove);
                document.removeEventListener('mouseup', mouseup);
            }
            // 给全局dom节点绑定鼠标移动事件
            document.addEventListener('mousemove', mousemove)
            // 给全局dom节点绑定鼠标抬起事件
            document.addEventListener('mouseup', mouseup)
        })
</script>
</body>
</html>



相关文章
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
4天前
|
JavaScript
vue中轻松搞掂鼠标气泡框提示框tip跟随
vue中轻松搞掂鼠标气泡框提示框tip跟随
|
4天前
【推荐】实现跟随鼠标移动的浮动提示框、气泡框、Tip效果
【推荐】实现跟随鼠标移动的浮动提示框、气泡框、Tip效果
|
4天前
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
|
5月前
|
API
移动端拖动滑块验证
移动端拖动滑块验证
69 0
|
8月前
在RPA中实现拼图滑块
在RPA中实现拼图滑块
65 2
|
10月前
AvaloniaUI 取消标题栏,无边框无最大最小化,
AvaloniaUI 取消标题栏,无边框无最大最小化,
236 0
AvaloniaUI 取消标题栏,无边框无最大最小化,
|
10月前
Avalonia 实现平滑拖动指定控件
Avalonia 实现平滑拖动指定控件
121 0
|
开发工具
滑动拼图验证码滑动框样式设置
之前在某官网登录的时候有一个滑动拼图验证码,很好奇怎么去实现。然后就想着自己弄一个。同时我在想有没有办法可以修改滑动拼图的滑动框样式呢?然后让我找到了 KgCaptcha,下面我就简单介绍一下吧!
滑动拼图验证码滑动框样式设置
C#创建无边框可拖动窗口
C#创建无边框可拖动窗口
173 0