拖动滑块验证

简介: 拖动滑块验证

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

效果:

源码:

<!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>



相关文章
|
Web App开发 移动开发 JavaScript
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
787 0
|
5月前
|
人工智能 JavaScript 安全
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
本文针对学员关于“鸿蒙主推开发语言是ArkTS,为何课程使用仓颉语言”的疑问进行解答。文章回顾了鸿蒙编程语言的发展历程:从早期支持JS和C/C++,到HarmonyOS 2引入Java,再到HarmonyOS 3推出ArkTS,直至HarmonyOS 5(NEXT)引入仓颉语言。仓颉作为华为自研的现代编程语言,具备高效编程、安全可靠、轻松并发和卓越性能等特性,适用于高性能高并发场景及未来AI原生应用开发。文章还探讨了仓颉与ArkTS的关系、应用场景以及是否需要重写现有应用等问题,为开发者选择编程语言提供了参考依据。
345 13
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
|
存储 安全 搜索推荐
虚拟云桌面中RDS、VDI技术比较
下面,就来看看两种主流的云桌面。 1、RDS(Remote Desktop Services,远程桌面服务),俗称共享云桌面 2、VDI(Virtual Desktop Infrastucture,虚拟桌面架构),俗称虚拟云桌面
3165 1
|
12月前
|
存储 数据采集 监控
大数据技术:开启智能决策与创新服务的新纪元
【10月更文挑战第5天】大数据技术:开启智能决策与创新服务的新纪元
|
JavaScript 前端开发 数据安全/隐私保护
如何使用request-promise在发送请求时使用代理?
以上方法演示了如何在发送请求时使用 `request-promise`结合代理服务,适用于需要通过代理访问网络资源的场景。
195 0
|
C++ Windows
vs2019 This application failed to start because it could not find or load the QT platform plugin
这篇文章介绍了在VS2019中解决QT程序运行时出现的“无法找到或加载QT平台插件”错误的步骤,通过将必要的DLL文件和插件目录复制到项目解决方案中解决了问题。
|
Web App开发 数据采集 JavaScript
我们来看一个基本的`pyppeteer`使用示例,包括`launch()`和`newPage()`方法。
我们来看一个基本的`pyppeteer`使用示例,包括`launch()`和`newPage()`方法。
|
JavaScript 前端开发
CMD和UMD,ES Module的差别
CMD和UMD,ES Module的差别
|
关系型数据库 MySQL API
微服务框架 go-zero 快速实战
微服务框架 go-zero 快速实战
626 1
|
数据安全/隐私保护
URI 和URL 的区别是什么?
URI 和URL 的区别是什么?
1535 0