vue2滑块验证

纯 Vue 2 实现的滑块拖动验证组件

效果说明

  • 拖动滑块到最右侧判定为验证成功

  • 支持自定义宽度、高度、颜色、提示文字

  • 可扩展轨迹分析或后端验证逻辑

Vue 2 滑块验证组件代码

SliderVerify.vue

注意:icon图标使用的是Element ui图标

<template><div class="slider-container" :style="{ width: width + 'px', height: height + 'px' }"><div class="slider-track" :style="{ backgroundColor: trackColor, width: trackWidth + 'px' }"></div><divclass="slider-button":style="{ left: buttonLeft + 'px', backgroundColor: buttonColor }"@mousedown="startDrag"><span v-if="!isPassed"> <i class="el-icon-d-arrow-right"></i></span><span v-else><i class="el-icon-check"></i></span></div><div class="slider-text">{{ isPassed ? successText : text }}</div></div>
</template><script>
export default {name: 'SliderVerify',props: {width: { type: Number, default: 300 },height: { type: Number, default: 40 },text: { type: String, default: '请将滑块拖动到右侧' },successText: { type: String, default: '验证成功' },trackColor: { type: String, default: '#4caf50' },buttonColor: { type: String, default: '#fff' }},data() {return {isDragging: false,startX: 0,buttonLeft: 0,trackWidth: 0,isPassed: false}},methods: {startDrag(e) {if (this.isPassed) returnthis.isDragging = truethis.startX = e.clientX - this.buttonLeftdocument.addEventListener('mousemove', this.onDrag)document.addEventListener('mouseup', this.endDrag)},onDrag(e) {if (!this.isDragging) returnlet moveX = e.clientX - this.startXconst maxX = this.width - this.heightmoveX = Math.max(0, Math.min(moveX, maxX))this.buttonLeft = moveXthis.trackWidth = moveX + this.height},endDrag() {this.isDragging = falsedocument.removeEventListener('mousemove', this.onDrag)document.removeEventListener('mouseup', this.endDrag)const maxX = this.width - this.heightif (this.buttonLeft >= maxX - 5) {this.isPassed = truethis.$emit('pass')} else {this.buttonLeft = 0this.trackWidth = 0}}}
}
</script><style scoped>
.slider-container {position: relative;background: #d3d3d3;border-radius: 4px;user-select: none;
}
.slider-track {position: absolute;top: 0;left: 0;height: 100%;transition: width 0.2s;border-radius: 4px;
}
.slider-button {position: absolute;top: 0;width: 40px;height: 100%;text-align: center;line-height: 40px;font-size: 18px;cursor: pointer;border-radius: 4px;box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);z-index: 2;
}
.slider-text {position: absolute;top: 0;left: 0;width: 100%;height: 100%;line-height: 40px;text-align: center;font-size: 14px;color: #666;z-index: 1;
}
</style>

使用方式

在父组件中:

<SliderVerify @pass="handleVerifySuccess" />
<script>
import SliderVerify from "@/components/Login/SliderVerify.vue";
export default {components: {SliderVerify},data() {return {};},methods: {handleVerifySuccess() {console.log('验证通过!')// 可执行登录、提交等操作}},
};
</script>

可扩展方向(以下内容仅提供思路)

  • ✅ 加入拖动轨迹分析(防机器人)

  • ✅ 拖动完成后调用后端接口验证

  • ✅ 添加“重置”按钮或自动重置逻辑

  • ✅ 支持移动端触摸事件(touchstart, touchmove, touchend

1. 加入拖动轨迹分析(防机器人)

目的:判断用户是否是人类,通过拖动轨迹的“自然性”来识别。

实现思路:
  • onDrag 方法中记录每一次拖动的时间戳和位置:

    data() {return {dragTrace: [] // [{x: 123, time: 123456789}]}
    },
    methods: {onDrag(e) {const now = Date.now()this.dragTrace.push({ x: e.clientX, time: now })// 原有拖动逻辑...}
    }
    
  • 拖动完成后分析轨迹:

    endDrag() {// 轨迹分析:速度是否过快、是否有停顿、是否线性过于完美const isHumanLike = this.analyzeTrace(this.dragTrace)if (!isHumanLike) {alert('行为异常,请重试')this.resetSlider()return}// 原有验证逻辑...
    },
    analyzeTrace(trace) {if (trace.length < 5) return falseconst speeds = []for (let i = 1; i < trace.length; i++) {const dx = Math.abs(trace[i].x - trace[i - 1].x)const dt = trace[i].time - trace[i - 1].timespeeds.push(dx / dt)}const avgSpeed = speeds.reduce((a, b) => a + b, 0) / speeds.lengthreturn avgSpeed < 2 && speeds.some(s => s < 0.5) // 有停顿、有波动
    }
    

2. 拖动完成后调用后端接口验证

目的:让后端参与验证,提升安全性。

实现方式:
  • endDrag 中加入 API 请求:
    async endDrag() {const maxX = this.width - this.heightif (this.buttonLeft >= maxX - 5) {try {const res = await fetch('/api/verify-slider', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ trace: this.dragTrace })})const result = await res.json()if (result.success) {this.isPassed = truethis.$emit('pass')} else {alert('验证失败,请重试')this.resetSlider()}} catch (err) {console.error('验证接口异常', err)this.resetSlider()}} else {this.resetSlider()}
    }
    

3. 添加“重置”按钮或自动重置逻辑

目的:用户拖错了可以重新尝试。

实现方式:
  • 添加按钮:

    <button v-if="!isPassed" @click="resetSlider" class="reset-btn">重置</button>
    
  • 方法定义:

    methods: {resetSlider() {this.buttonLeft = 0this.trackWidth = 0this.dragTrace = []this.isPassed = false}
    }
    
  • 自动重置(比如 3 秒后):

    if (!this.isPassed) {setTimeout(() => this.resetSlider(), 3000)
    }
    

4. 支持移动端触摸事件(touchstart, touchmove, touchend

目的:让组件在手机上也能正常使用。

实现方式:
  • 添加事件监听:

    <divclass="slider-button"@mousedown="startDrag"@touchstart="startTouch"@touchmove="onTouchMove"@touchend="endTouch"
    >
    
  • 方法定义:

    methods: {startTouch(e) {this.isDragging = truethis.startX = e.touches[0].clientX - this.buttonLeft},onTouchMove(e) {if (!this.isDragging) returnconst moveX = e.touches[0].clientX - this.startXconst maxX = this.width - this.heightthis.buttonLeft = Math.max(0, Math.min(moveX, maxX))this.trackWidth = this.buttonLeft + this.heightthis.dragTrace.push({ x: e.touches[0].clientX, time: Date.now() })},endTouch() {this.isDragging = falsethis.endDrag() // 复用原有逻辑}
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95552.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

74、在昇腾服务器 800I A2上迁移伏羲1.0/2.0大模型,并对比cpu和npu的精度

基本思想&#xff1a;在昇腾服务器上迁移github公开链接的的伏羲1.0/2.0大模型&#xff0c;但是由于伏羲2.0模型没有权重&#xff0c;这里使用自己造的的权重进行推理模型测试&#xff0c;在之前迁移过这个网站问海大模型和问天大模型人工智能天气预报模型示范计划AIM-FDP支撑平…

如何高效比对不同合同版本差异,避免法律风险?

智能文档比对系统通过自动化、高精度的差异比对与结构化报告&#xff0c;锁定合同修改、防止核心条款误删并实现版本清晰追溯&#xff0c;解决证券基金公司在合同范本管理中的操作风险、审核效率与归档难题。 如何防止业务人员误改或误删合同条款&#xff1f; 这是一个典型的操…

快手Keye-VL 1.5开源128K上下文+0.1秒级视频定位+跨模态推理,引领视频理解新标杆

人工智能和多模态学习领域&#xff0c;视频理解技术的突破为各类应用提供了强大的支持。快手近期开源了其创新性的大型多模态推理模型——Keye-VL 1.5&#xff0c;该模型具备超长的上下文窗口、0.1秒级的视频时序定位能力&#xff0c;并支持视频与文本之间的跨模态推理。这一技…

【前端教程】JavaScript 实现图片鼠标悬停切换效果与==和=的区别

图片鼠标悬停切换效果 功能说明 页面展示4张默认图片&#xff0c;当鼠标移动到任意一张图片上时&#xff0c;该图片会切换为对应的特定图片&#xff08;诗、书、画、唱&#xff09;&#xff1b;当鼠标移出时&#xff0c;图片恢复为默认图片。 和的区别 在讲解案例前&#xff0c…

ss 原理

SSR&#xff08;服务端渲染&#xff09;技术文档 一、SSR 概述 SSR&#xff08;Server-Side Rendering&#xff0c;服务端渲染&#xff09;是一种在服务端生成完整 HTML 页面&#xff0c;再发送给客户端渲染的前端渲染模式。与 CSR&#xff08;客户端渲染&#xff0c;如 React/…

chrome 浏览器开发者工具技巧

$0 我们在开发者工具里面选中了哪个元素&#xff0c;他后面都会跟一个$0 ,则表示 $0 就是选择这个标签元素 如图&#xff1a;

GJOI 9.4 题解

1.CF1801B Buy Gifts / 洛谷 P13532 买礼物 题意 n≤2105n\le 2\times 10^5n≤2105。 思路 神秘卡常题&#xff0c;如果等待提交记录久一点就能知道自己 A 掉…… 题目问 A 的最大值&#xff0c;减去 B 的最大值&#xff0c;求差值最小值。但是怎么选到两个最大值呢&#x…

Git 工具的「安装」及「基础命令使用」

- 第 119 篇 - Date: 2025 - 09 - 05 Author: 郑龙浩&#xff08;仟墨&#xff09; Git 工具的「安装」及「基础命令使用」 学习课程&#xff1a;https://www.bilibili.com/video/BV1MU4y1Y7h5?spm_id_from333.788.player.switch&vd_source2683707f584c21c57616cc6ce8454e…

2025高教社数学建模国赛A题 - 烟幕干扰弹的投放策略(完整参考论文)

基于模拟遗传退火的烟幕弹投递方式的研究 摘要 烟幕干扰弹作为一种具有成本低、效费比高等优点的典型防御手段,主要通过化学燃烧或爆炸分散形成气溶胶云团,在目标前方特定空域形成有效遮蔽,从而干扰敌方导弹攻击路径。随着精确投放技术的发展,现可利用无人机实现烟幕干扰…

[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精

文章目录[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 中文专精一. 部署实战&#xff1a;单卡环境的极速落地1.1 &#x1f5a5;️ 环境配置の手把手教程 &#x1f4dd;部署准备&#xff1a;硬件与镜像依赖安装&#xff1a;一行代码搞定1.2 &#x1f680; 模型启动…

开发微服务的9个最佳实践

微服务架构是一种演进的模式&#xff0c;从根本上改变了服务器端代码的开发和管理方式。这种架构模式涉及将应用程序设计和开发为松散耦合服务的集合&#xff0c;这些服务通过定义良好的轻量级 API 进行交互以满足业务需求。它旨在通过促进持续交付和开发来帮助软件开发公司加速…

Karmada v1.15 版本发布

Karmada 是开放的多云多集群容器编排引擎&#xff0c;旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力&#xff0c;Karmada 可以平滑迁移单集群工作负载&#xff0c;并且仍可保持与 Kubernetes 周边生态工具链协同。 Karmada v1.15 版本现已…

[GYCTF2020]Ezsqli

文章目录测试过滤找注入点布尔盲注无列名盲注总结测试过滤 xor for distinct information handler binary floor having join pg_sleep bp测试出来禁用了这些。 找注入点 查询回显推断1Nu1Labool(false)1’bool(false)1’#bool(false)不是单引号包裹1"#bool(false)没有引…

Agno 多 Agent 协作框架 - 手把手从零开始教程

本教程将带你从零开始&#xff0c;一步步构建一个完整的多 Agent 协作系统。每一步都有详细的代码示例和解释&#xff0c;让你真正理解 Agno 框架的工作原理。第一步&#xff1a;创建你的第一个 Agent 让我们从最简单的开始 - 创建一个能回答问题的 Agent。 1.1 创建基础文件 首…

数据库查询优化

这篇文章适合刚刚入手项目的小伙伴&#xff0c;为大家如何提高数据库查询效率提供一些建议。1.添加索引1.1 索引是什么对于索引基础薄弱的同学&#xff0c;我们可以从 “索引是什么” 简单类比&#xff1a;索引就像书籍的目录&#xff0c;能帮数据库快速定位到需要的数据&#…

安徽大学概率论期末试卷及答案解析

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;安徽大学的概率论课程围绕随机现象的规律性&#xff0c;覆盖了多个核心概念&#xff0c;如随机事件的概率、条件概率、独立事件、概率分布、期望值、方差、大数定律和中心极限定理。本资源包含期末试卷及答案&a…

HarmonyOS应用开发之界面列表不刷新问题Bug排查记:从现象到解决完整记录

Bug排查在软件开发过程中扮演着至关重要的角色&#xff0c;本文采用日记形式记录了Bug排查的全过程&#xff0c;通过这种方式可以更加真实、详细地记录问题&#xff0c;便于后续追溯和经验沉淀。 Bug背景 在使用HarmonyOS的ArkUI框架开发一个卡片管理应用时&#xff0c;遇到了…

FastVLM-0.5B 模型解析

模型介绍 FastVLM&#xff08;Fast Vision-Language Model&#xff09;是苹果团队于2025年在CVPR会议上提出的高效视觉语言模型&#xff0c;专为移动设备&#xff08;如iPhone、iPad、Mac&#xff09;优化&#xff0c;核心创新在于通过全新设计的 FastViTHD混合视觉编码器 解决…

集成学习 | MATLAB基于CNN-LSTM-Adaboost多输入单输出回归预测

集成学习 | MATLAB基于CNN-LSTM-Adaboost多输入单输出回归预测 一、主要功能 该代码使用 CNN 提取特征,LSTM 捕捉时序依赖,并通过 AdaBoost 集成多个弱学习器(每个弱学习器是一个 CNN-LSTM 网络),最终组合成一个强预测器,用于回归预测任务。代码完成了从数据预处理、模型…

关于Homebrew:Mac快速安装Homebrew

关于macOS 安装HomebrewHomebrewHomebrew介绍Homebrew 官网地址Homebrew 能安装什么&#xff1f;Mac上安装Homebrew主要步骤&#xff1a;打开终端&#xff0c;执行官网安装脚本注意遇到问题①&#xff1a;脚本在克隆 Homebrew 核心仓库时&#xff0c;​​无法连接 GitHub​​&a…