js拖拽效果的原理及实现
作者:翊希 发布时间:2024-04-10 10:43:29
标签:js,拖拽
拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等
拖拽的流程动作
1、鼠标按下 会触发onmousedown事件
2、鼠标移动 会触发onmousemove事件
3、鼠标松开 会触发onmouseup事件
拖拽原理
1.鼠标按下+鼠标移动 = 拖拽-------事件 onmousedown + onmousemove
2.鼠标松开 = 无拖拽--------停止拖拽 onmouseup
3.鼠标偏移 = 拖拽距离
当点击dom的时候,记录当前鼠标的坐标值,也就是x、y值,以及被拖拽的dom的top、left值,而且还要在鼠标按下的回调函数里添加鼠标移动的事件:
document.addEventListener(“mousemove”, moving, false)
和添加鼠标抬起的事件
document.addEventListener(“mouseup”,function() {
document.removeEventListener(“mousemove”, moving, false);
}, false);
这个抬起的事件是为了解除鼠标移动的监听,因为只有在鼠标按下才可以拖拽,抬起就停止不会移动了。
当鼠标按下鼠标移动的时候,记录移动中的x、y值,那么这个被拖拽的dom的top和left值就是:
top=鼠标按下时记录的dom的top值+(移动中的y值 - 鼠标按下时的y值)
left=鼠标按下时记录的dom的left值+(移动中的x值 - 鼠标按下时的x值);
//极简单版
var div=document.querySelector("div");
// 按下时开始监听在文档中鼠标移动的事件
// 开始监听鼠标松开键的事件
// 只有按下时才准备拖拽
div.onmousedown=function(e1){
// 当鼠标在文档移动时,不能再div上移动,因为鼠标可能离开div,造成无法拖拽
div.onmousemove=function(e){
// 当鼠标移动时,将当前鼠标相对视口的坐标赋值给元素的left和top
// 因为我们需要在按下的位置拖拽,因此我们还需要获取按下键鼠标相对div的左上角位置
// 使用当前鼠标位置减去这个相对元素的左上角位置,保证鼠标所按位置拖拽
div.style.left=e.clientX-e1.offsetX+"px";
div.style.top=e.clientY-e1.offsetY+"px";
}
// 当释放鼠标键时,删除鼠标移动事件和删除鼠标释放事件
div.onmouseup=function(){
document.onmousemove=null;
document.onmouseup=null;
}
}
//简单版
var div=document.querySelector("div");
var offsetX,offsetY;
div.addEventListener("mousedown",mouseDownHandler);
function mouseDownHandler(e){
offsetX=e.offsetX
offsetY=e.offsetY
document.addEventListener("mousemove",mousemoveHandler)
document.addEventListener("mouseup",mouseupHandler)
}
function mousemoveHandler(e){
div.style.left=e.clientX-offsetX+"px"
div.style.top=e.clientY-offsetY+"px"
}
function mouseupHandler(e){
document.removeEventListener("mousemove",mousemoveHandler)
document.removeEventListener("mouseup",mouseupHandler)
}
// 简单升级版
var div=document.querySelector("div");
var offsetX,offsetY;
div.addEventListener("mousedown",mouseHandler);
function mouseHandler(e){
if(e.type==="mousedown"){
offsetX=e.offsetX;
offsetY=e.offsetY;
document.addEventListener("mousemove",mouseHandler)
document.addEventListener("mouseup",mouseHandler)
}else if(e.type==="mousemove"){
div.style.left=e.clientX-offsetX+"px"
div.style.top=e.clientY-offsetY+"px"
}else if(e.type==="mouseup"){
document.removeEventListener("mousemove",mouseHandler)
document.removeEventListener("mouseup",mouseHandler)
}
}
注
a、被拖拽的元素的样式要设置成绝对或相对位置才有效果。
b、拖拽加到document,不然内容会脱离
来源:https://blog.csdn.net/qq_44957616/article/details/105347921


猜你喜欢
- AdobeAdobe公司的标识1982年,40多岁的程序员约翰·沃诺克(John Warnock)和查尔斯·杰斯克(Charles Gesc
- apscheduler 模块安装apscheduler 模块pip install apschedulerapscheduler 模块介绍A
- 建议用pycharm,使用比较方便,并且可以直接编辑html文件import timelocatime = time.strftime(&q
- 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是MySQL的默认连接数引起的问题,一查果然,老天,默认
- GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一
- 大纲本文主要介绍一下numpy中的几个常用函数,包括hstack()、vstack()、stack()、concatenate()。1、co
- Window.ShowModalDialog使用手册 基本介绍: showModalDialog() (IE 4+ 支持) sho
- 前言在前一篇的博文中,我们详细讲解了傅里叶变换的原理以及使用Numpy库实现傅里叶变换。但是其实OpenCV有直接实现傅里叶变换的函数。在O
- 前言v-model 可以在组件上使用以实现双向绑定。首先让我们回忆一下 v-model 在原生元素上的用法:<input v-mode
- 使用smtplib模块发送邮件,供大家参考,具体内容如下1)使用smtplib模块发送简单邮件步骤:1.连接SMTP服务器,并使用用户名、密
- Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许多人广泛使用。它的简单和易用性造就了它如此流
- Fraction函数是python中实现分数的一个模块(module),模块是由别人写的,并且可以被拿来直接使用的代码程序,包括类、函数以及
- #!/usr/bin/python # Filename: gen_salt.py impo
- 本文总结了input的各种使用方法,挺全面的1.取消按钮按下时的虚线框在input里添加属性值 hideFocus 或者 HideFocus
- 原始数据如下:['e3cd', 'e547', 'e63d', '0ffd'
- 打开cmder1.移动到D盘输入命令:D:2.创建文件夹λ mkdir myApp3.创建python自带的虚拟环境λ python -m
- web.config第一种方法:<?xml version="1.0" encoding="utf-8&
- 实例如下所示:# -*- coding: utf-8 -*-"""使用通配符,获取所有文件,或进行操作。&qu
- 1、下载pycharmpycharm是一种Python IDE,能够帮助我们在编写代码时提高效率。网上提供的有专业版和教育版之分。专业版是收
- pip search报错在用pip查包名时搜到的都是:pip search xxx。但这样是报错的:查找发现pip search由于一些bu