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 }
浙公网安备 33010602011771号