JS拖拽效果总结

js拖拽步骤

1:按下鼠标,即onmousedown

2: 移动鼠标,即onmousemove

3:松开鼠标,即onmouseup

 

原理:

先获取按下时,鼠标距离元素的左边距:通过按下时的disX = ev.clientX-obj.offsetLeft获取到,Y轴同理,disY = ev.clientX-obj.offsetTop

移动时,元素的左边距即等于鼠标的坐标减去对应的disX和disY

鼠标松开时,清除移动时的函数即可

 

常见问题:

1.鼠标移除元素,既不能继续移动,通过将obj.onmousemove改为document.onmousemove,同时修改onmouseup来解决

2.当有文字被选中或者拖动的是图片时,无法正常拖动,在标准浏览器下通过return false可以得到解决,非标准的情况下通过给拖拽元素添加全局监听obj.setCapture()来解决。

 

案例:

常见的拖拽以及磁性悬浮效果

 

代码演示

 1 /*
 2 拖拽函数
 3 */
 4 function drag(obj){
 5 
 6             obj.onmousedown = function(ev){
 7 
 8             var ev = ev||event;
 9 
10 
11             //计算出按下时,鼠标离div的距离
12             var disX = ev.clientX - this.offsetLeft;
13             var disY = ev.clientY - this.offsetTop;
14 
15             if(obj.setCapture){
16                 obj.setCapture();
17             }
18 
19 
20             document.onmousemove = function(ev){
21 
22                 var ev = ev||event;
23 
24                 //计算出当前距离左边的距离
25                 var L = ev.clientX - disX;
26                 //计算出当前距离顶部的距离
27                 var T = ev.clientY - disY;
28 
29                 //判断是否超出可视区
30 
31                 //磁性悬浮效果只需将L<0改为L<100(可变)即可
32                 if(L<0){
33                     L = 0;
34                 }else if(L>document.documentElement.clientWidth - obj.offsetWidth){
35                     L = document.documentElement.clientWidth - obj.offsetWidth;
36                 }else if(T<0){
37                     T = 0;
38                 }else if(T>document.documentElement.clientHeight - obj.offsetHeight){
39                     T = document.documentElement.clientHeight - obj.offsetHeight;
40                 }
41 
42 
43                 obj.style.left = L + 'px';
44                 obj.style.top =  T + 'px';
45                 
46 
47 
48             }
49 
50             obj.onmouseup = function(){
51                 
52                 document.onmousemove = obj.onmouseup = null;
53 
54                 if(obj.relaseCapture){
55                     obj.relaseCapture();
56                 }
57 
58                 
59             }
60 
61             return false;
62 
63         }

posted on 2014-07-16 22:58  苏宇豪  阅读(697)  评论(0)    收藏  举报

导航