拖拽原理以及代码实现

拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等;挺好玩儿。下面分享一下拖拽的原理,和码友们一起学习!

拖拽流程:

1)事件:onmousedown;onmousemove;onmouseup;

2)实现原理分析:

拖拽是通过获取鼠标移动的距离来实现的,即计算移动前的位置的坐标(x,y)与移动中的位置的坐标(x,y)差值。
当onmousedown或onmousemove时,都可以获取到当前鼠标的位置,即移动前的坐标值与移动中的坐标值。
参考如下图:

如上图所示:

在onmousemove中元素的left值为 : 鼠标移动后的left值 - 鼠标按下的left值 + 元素的初始left值;
       top值为 : 鼠标移动后的top值 - 鼠标按下的top值 + 元素的初始top值;

需要注意:onmousemove;onmouseup事件要在onmousedown事件内;

代码如下:

 1  drag:function(id,fan){
 2  var _this=this;
 3  if (fan==void(0))fan=document;
 4  _this.obox=document.getElementById(id);
 5  _this.obox.onmousedown=function(e){
 6  _this.fndown(e,this,fan);
 7  //兼容IE事件捕获点下之后进行获取事件;setcapture事件捕获和releaseCapture释放事件捕获要成对出现使用;用于解决IE不能阻止默认事件问题;
 8  //当进行拖拽的时候图片也会有默认事件;用同样的方法进行阻止默认事件;
 9  if (this.setcapture) {
10  this.setcapture()
11  }
12  return false;
13
14
15  }
16  },
17
18  /*******************************
19  当鼠标按下后obj的left和top值设置为鼠标的X轴和Y轴;
20  当进行拖动时设置元素的left值和top值实现拖拽
21
22  ************************************************/
23  fndown:function(e,obj,fan){
24  if(fan!=document) fan=document.getElementById(fan);
25  var e=e||window.event;
26  this.ledt=e.clientX-obj.offsetLeft;
27  this.ledr=e.clientY-obj.offsetTop;
28  fan.onmousemove=function(e){
29  var fanwei=fan==document?document.documentElement.clientWidth:fan.offsetWidth;
30  var fanhei=    fan==document?document.documentElement.clientHeight:fan.offsetHeight
31  var e=e||window.event;
32  var ollL=e.clientX-this.ledt;
33  var ollR=e.clientY-this.ledt;
34  if(ollL<0)ollL=0;
35  if(ollL> fanwei-obj.offsetWidth){
36  ollL=parseInt(fanwei-obj.offsetWidth);
37  }
38 if(ollR<0)ollR=0;
39  if(ollR>fanhei-obj.offsetHeight){
40  ollR=parseInt(fanhei-obj.offsetHeight);
41  }
42  obj.style.left=ollL+‘px‘;
43  obj.style.top=ollR+‘px‘;
44  }.bind(this);
45  fan.onmouseup=function(){
46  this.onmousemove=this.onmouseup=null;
47
48  //当鼠标抬起之后释放事件捕获
49  if (obj.releaseCapture) {
50  obj.releaseCapture()
51  }
52
53 };
54  }
时间: 2024-10-01 05:26:14

拖拽原理以及代码实现的相关文章

android ListView和GridView拖拽移位实现代码

关于ListView拖拽移动位置,想必大家并不陌生,比较不错的软件都用到如此功能了.如:搜狐,网易,百度等,但是相比来说还是百度的用户体验较好,不偏心了,下面看几个示例:             首先说一下:拖拽ListView的item就不应该可以任意移动,只应该在ListView所在的范围内,而网易的你看看我都可以移动到状态栏了,虽然你做了处理,但是用户体验我个人感觉不好,在看看百度的,不仅控制了移动范围,更不错的百度的移动起来会时时的换位,看起来相当的形象,所以我认为这样相当的棒.说明一点

JavaScript拖拽原理的实现

实现拖拽的基本思路 拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素.鼠标的移动也就是x.y坐标的变化:元素的移动就是style.position的top和left的改变.当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的. 根据以上的基本原理,我写出了下面的基本思路.感觉代码还是比较短的, view plaincopy to clipboardprint 拖拽状态 = 0鼠标在元素上按下的时候{ 拖拽状态 = 1 记录下鼠标的

js拖拽原理和碰撞原理

拖拽的原理onmousedown 选择元素onmousemove 移动元素onmouseup 释放元素 1:如果拖拽的时候有文字:被选中,会产生问题原因:当鼠标按下的时如果页面中有文字或者图片被选中的时候,则会发生文字默认可以被拖动,因此标准 :e.preventDefalut(); 阻止他的默认行为 非标准的阻止默认行为 非标准:window.event.returnValue=false; 2:给某元素设置全局捕获,当我们给一个元素设置全局捕获,那么这个元素会监听后续发生的所有事件,当有事件

Jquery拖拽原理

/* onmousedown : 选择元素 onmousemove : 移动元素 onmouseup : 释放元素 */ 查看Demo:拖拽图片 function drag(obj) { obj.onmousedown = function(ev) { var ev = ev || event; var disX = ev.clientX - this.offsetLeft; var disY = ev.clientY - this.offsetTop; if ( obj.setCapture

Android4.0 Launcher拖拽原理分析1

在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的. 1.基本流程: 相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象.当前位置.拖拽源.待拖拽对象等信息传给DragController的startDrag方法启动拖拽. 接下来,DragLayer的onInterceptTouchEvent拦截触屏事件,将其转到DragController的onTouchEvent方法. 在Drag

拖拽原理

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script src="http://457375608.github.io/liujin/scripts/jquery-1.8.3.min.js"></script> <style> #div{width:30

JS拖拽效果,代码精干,通俗易懂!

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div{ margin-top: 10px; width: 200px; height: 150px; background: #dadada; position: absolute; cursor:move; } </style> <

Javascript 事件对象进阶(一)拖拽的原理

拖拽原理 鼠标和Div的相对距离不变 三大事件 把拖拽加到document上 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 {width: 100px; height

Android自定义控件:类QQ未读消息拖拽效果

QQ的未读消息,算是一个比较好玩的效果,趁着最近时间比较多,参考了网上的一些资料之后,本次实现一个仿照QQ未读消息的拖拽小红点,最终完成效果如下: 首先我们从最基本的原理开始分析,看一张图: 这个图该怎么绘制呢?实际上我们这里是先绘制两个圆,然后将两个圆的切点通过贝塞尔曲线连接起来就达到这个效果了.至于贝塞尔曲线的概念,这里就不多做解释了,百度一下就知道了. 切点怎么算呢,这里我们稍微复习一些初中的数学知识.看了这个图之后,求出四个切点应该是轻而易举了. 现在思路已经很清晰了,按照我们的思路,开