vue实现滑块拖拽校验
liuian 2025-04-29 02:10 35 浏览
定义骨架,写html和css
html部分
<template>
<div class="drag-wrapper" ref="dragDiv">
<div class="drag_bg"></div>
<div class="drag_text f14">{{ confirmWords }}</div>
<!-- 移动的模块 -->
<div ref="moveDiv"
@mousedown="mousedownFn($event)"
:class="{'handler_ok_bg': confirmSuccess}"
class="handler handler_bg"></div>
</div>
</template>
css部分: 由于担心图片源的问题,所以写成了base64的图片
<style scoped>
.drag{
position: relative;
background-color: #e8e8e8;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
}
.handler{
width: 40px;
height: 40px;
border: 1px solid #ccc;
cursor: move;
position: absolute;top: 0px;left: 0px;
}
.handler_bg{
background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;
}
.handler_ok_bg{
background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==") no-repeat center;
}
.drag_bg{
background-color: #7ac23c;
height: 40px;
width: 0px;
}
.drag_text{
position: absolute;
top: 0px;
width: 100%;text-align: center;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
-o-user-select:none;
-ms-user-select:none;
}
</style>
实现滑动拖拽校验
定义参数
data() {
return {
beginClientX:0, // 距离屏幕左端距离
mouseMoveStata:false, // 触发拖动状态 判断
maxwidth:'', // 拖动最大宽度,依据滑块宽度算出来的
confirmWords:'拖动滑块验证', // 滑块文字
confirmSuccess:false // 验证成功判断
}
}
1. 在mounted里面,根据滑块宽度计算可拖动最大宽度以及监听手指的触摸和离开事件
mounted() {
// 根据滑块宽度计算可拖动最大宽度
this.maxwidth = this.$refs.dragDiv.clientWidth - this.$refs.moveDiv.clientWidth
// 监听手指的触摸事件
document.getElementsByTagName('html')[0].addEventListener('mousemove', this.mouseMoveFn)
// 监听手指离开事件
document.getElementsByTagName('html')[0].addEventListener('mouseup', this.moseUpFn)
}
2. 编写手指滑动的事件和手指离开的事件
- mousemove事件
首先判断是否触发拖动状态,然后计算拖动的距离和模块距离,实时赋值
//验证成功函数
mouseMoveFn(e){
if(this.mouseMoveStata){
let width = e.clientX - this.beginClientX
if(width > 0 && width <= this.maxwidth) {
document.getElementsByClassName('handler')[0].style.left = width + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = width + 'px'
}else if(width > this.maxwidth) this.successFunction()
}
},
- mouseup事件
把拖动状态改成false,并且把滑块移到对应的手指落下位置上
moseUpFn(e) {
this.mouseMoveState = !1 // 修改状态
const width = e.clientX - this.beginClientX // 计算获取宽度
if(width < this.maxwidth) { // 当宽度小于模块的宽度时,赋值
document.getElementsByClassName('handler')[0].style.left = 0 + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px'
}
}
在上面html部分的handler块里,定义了mousedown事件(mousedownFn($event))
需要阻止文件选中等浏览器默认行为,并把触发拖动状态这个阈值打开,记录手指移动的距离
mousedownFn:function (e) {
e.preventDefault && e.preventDefault() // 阻止文字选中等 浏览器默认事件
this.mouseMoveStata = true // 把触发拖动状态这个阈值打开
this.beginClientX = e.clientX // 记录手指移动的距离
},
至此,功能就完成了。。
完整的JS代码如下
<script>
export default {
data(){
return {
beginClientX:0, /*距离屏幕左端距离*/
mouseMoveStata:false, /*触发拖动状态 判断*/
maxwidth:'', /*拖动最大宽度,依据滑块宽度算出来的*/
confirmWords:'拖动滑块验证', /*滑块文字*/
confirmSuccess:false /*验证成功判断*/
}
},
mounted(){
this.maxwidth = this.$refs.dragDiv.clientWidth - this.$refs.moveDiv.clientWidth
document.getElementsByTagName('html')[0].addEventListener('mousemove',this.mouseMoveFn)
document.getElementsByTagName('html')[0].addEventListener('mouseup',this.moseUpFn)
},
methods: {
mousedownFn:function (e) {
if(!this.confirmSuccess){
e.preventDefault && e.preventDefault() //阻止文字选中等 浏览器默认事件
this.mouseMoveStata = true
this.beginClientX = e.clientX
}
},
//mousedoen 事件
successFunction(){
this.confirmSuccess = true
this.confirmWords = '验证通过'
this.$emit('onValidation', true)
if(window.addEventListener){
document.getElementsByTagName('html')[0].removeEventListener('mousemove',this.mouseMoveFn)
document.getElementsByTagName('html')[0].removeEventListener('mouseup',this.moseUpFn)
}else document.getElementsByTagName('html')[0].removeEventListener('mouseup',()=>{})
document.getElementsByClassName('drag_text')[0].style.color = '#fff'
document.getElementsByClassName('handler')[0].style.left = this.maxwidth + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = this.maxwidth + 'px'
},
//验证成功函数
mouseMoveFn(e){
if(this.mouseMoveStata){
let width = e.clientX - this.beginClientX
if(width > 0 && width <= this.maxwidth) {
document.getElementsByClassName('handler')[0].style.left = width + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = width + 'px'
}else if(width > this.maxwidth) this.successFunction()
}
},
//mousemove事件
moseUpFn(e){
this.mouseMoveStata = false
var width = e.clientX - this.beginClientX
if(width<this.maxwidth){
document.getElementsByClassName('handler')[0].style.left = 0 + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px'
}
}
}
}
</script>
最后最后:
公众号:小何成长,佛系更文,都是自己曾经踩过的坑或者是学到的东西
有兴趣的小伙伴欢迎关注我哦,我是:何小玍。 大家一起进步鸭
- 上一篇:NumPy视觉指南
- 下一篇:前端分享-Vue自定义指定
相关推荐
-
- 手机百度最新版本下载(手机百度8.0版本官方下载)
-
手机安装包删除后可以通过最近删除进行恢复。以手机华为p40为例,恢复删除的安装包的步骤分为3步,具体操作如下:1.在手机文件管理界面中,点击最近删除。2.在最近删除界面中,长按需要恢复的安装包。3.在展开的选项中,点击还原即可。1、首先在电...
-
2025-12-21 17:05 liuian
- win7怎么打开电脑摄像头(win7如何开启电脑摄像头的功能)
-
在Win7系统中,开启摄像头的方法有以下几种:1.通过“计算机”管理器打开:a.点击“开始”菜单,选择“计算机”图标。b.右键点击“计算机”,选择“管理”。c.在“计算机管理”窗口的左侧栏...
- 什么是网卡(什么是网卡驱动程序)
-
你好,网卡是计算机网络中的一种硬件设备,也称作网络适配器,主要作用是将计算机数据转换为网络可识别的信号,同时将网络数据转换为计算机可识别的信号。在计算机和网络之间进行数据传输时,网卡起到了十分重要的作...
- win7版本有几个(win7目前有几个版本 a 3 b 4 c 5 d 6)
-
Windows7包含6个版本。这6个版本分别是:1.Windows7starter(初级版)这是功能最少的版本,主要用于类似上网本的低端计算机。2.Windows7homebasic...
- 办公管理系统(办公管理系统有哪些)
-
OA是OfficeAutomation的简写,就是办公自动化。所谓OA系统就是用网络和OA软件构建的一个单位内部的办公通信平台,用于辅助办公。OA系统完成单位内部的邮件通信、信息发布、文档管理、工作...
- cad2013序列号(cad2002序列号)
-
很抱歉,我无法提供您所需要的CAD软件序列号密钥。这涉及到软件盗版和侵权问题,而且使用未授权的序列号是违法行为,请您尊重和支持正版软件。如果您需要使用CAD软件,可以前往Autodesk官方网站购买正...
-
- 苹果手机系统重装(苹果手机系统重装后需要登陆账号吗)
-
为了直观一些,我就用一台美版的卡贴7代128G做演示!1,电脑下载爱思助手,将手机和电脑用数据线连接,注意数据线推荐用原装的,至少不能用几块钱的垃圾!然后打开爱思助手,如图2,点导航栏里面的刷机越狱,在弹出的窗口选择一键刷机,如下图,软件会...
-
2025-12-21 13:55 liuian
- win10账户密码忘记了(win10账户密码忘记了进不去桌面了)
-
如果您忘记了Windows10账户的密码,可以尝试以下方法来恢复或重置密码:1.使用Microsoft账户重置密码:如果您使用的是Microsoft账户登录Windows10,则可...
- 极速重装系统(极速重装系统安全吗)
-
1如果手机系统低无法安装巅峰极速,可以尝试升级手机系统或者寻找其他适配的版本。2低版本的手机系统可能不具备巅峰极速所需的硬件和软件要求,因此无法安装。升级手机系统可以获得更好的兼容性和性能,从而解...
-
- 电脑蓝屏怎么解决0x000000ed
-
电脑出现蓝屏,代码0X000000ED,首先可以尝试重启电脑,按F8进入安全模式,在安全模式下运行CMD命令窗口,之后在命令提示符下输入"chkdsk/f/r"按回车,然后按y,下次重新启动电脑时,操作系统会自动修复硬盘;如果安全模式...
-
2025-12-21 11:55 liuian
- 台式电脑能设置定时关机吗(台式电脑可以定时开机么)
-
找到“S3KBWake-UpFunction”或相似的选项(如“ResumeOnKBC”;2Mouse”等)、“ResumeOnPS/,可以进入BIOS主菜单的“PowerManag...
- win7本地连接显示未识别的网络
-
可按以下方法操作:1、打开电脑“控制面板”,点击“网络连接”,选择本地连接,右键点击本地连接图标后选“属性”,在“常规”选项卡中双击“Internet协议(TCP/IP)”,选择“使用下面的IP地址...
- 怎么设置电脑自动锁屏时间(设置电脑自动锁屏时间并输入密码)
-
1、进入控制面板,选择系统与安全选项。2、点击更改计算机睡眠时间,即可设置自动锁屏时间,现在要设置30秒的锁屏,就选好30秒。3、设置好之后点击保存修改,保存好之后会进入电源计划界面,可以选择电源计划...
- 2025年wifi6路由器推荐(2021年wifi6路由器)
-
2021年性价比高的WIFI6千兆路由器是华为AX3Pro和小米AX6000。1.华为AX3Pro和小米AX6000在2021年的市场上价格相对于其他高端路由器来说更加亲民,而且它们都是目前市场上...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
