拖拽是一个非常实用的页面效果

1.拖拽的一些应用场景:

1.1. 浏览器标签顺序的切换

      1.2. 页面上小组件的拖拽

      1.3. 弹出层的拖拽

2 .基本原理

2.1  拖拽的基本原理是:

             鼠标在元素上按下的时候,获取鼠标在页面上的位置,计算鼠标相对元素的定位:disX,disY;  

             鼠标移动的时候,元素跟着鼠标移动,但鼠标相对于元素是不动的,因此,可以根据disX,disY计算元素的位置;

             鼠标松开的时候,元素停止移动;

             最重要的一点是:需要拖动的那个元素position要设置成absolute或relative,这样才可以移动。

      2.2 事件:上述前三个步骤对应三个事件

在用户按下了任意鼠标按钮时触发

当鼠标指针在元素内部移动时重复地触发

在用户释放鼠标按钮时触发

3. 举个例子

HTML代码:

<div id="box"></div>

CSS代码:

1 html,
 2 body{
 3     width: 100%;
 4     height: 100%;
 5 }
 6 #box{
 7     width: 100px;
 8     height: 100px;
 9     background-color: pink;
10     position: absolute;
11 }

JS代码:

1 var box = document.getElementById('box');
 2 box.onmousedown = function(){
 3     var event = event ? event : window.event; 
 4 
 5     //获取鼠标相对元素的位置
 6     var disX = event.clientX - box.offsetLeft;
 7     var disY = event.clientY - box.offsetTop;
 8 
 9     //当鼠标移动的时候,获取元素的位置
10     document.onmousemove = function(){
11         var event = event ? event : window.event; 
12         var iL = event.clientX - disX;
13         var iT = event.clientY - disY;
14         box.style.left = iL +'px';
15         box.style.top = iT +'px';
16     }
17 
18     //当鼠标松开的是,元素随着鼠标停止
19     document.onmouseup = function(){
20         document.onmousemove = null;
21         document.onmouseup = null;
22     }
23 
24 }

增加磁性吸附效果,js代码改为:

1 var box = document.getElementById('box');
 2 box.onmousedown = function(){
 3     var event = event ? event : window.event; 
 4 
 5     //获取鼠标相对元素的位置
 6     var disX = event.clientX - box.offsetLeft;
 7     var disY = event.clientY - box.offsetTop;
 8 
 9     //当鼠标移动的时候,获取元素的位置
10     document.onmousemove = function(){
11         var event = event ? event : window.event; 
12         var iL = event.clientX - disX;
13         var iT = event.clientY - disY;
14 
15         //磁性吸附
16         if(iL<=50){
17             iL = 0;
18         }else if(iL>=document.documentElement.offsetWidth - box.offsetWidth - 50){
19             iL = document.documentElement.offsetWidth- box.offsetWidth;
20         }
21         if(iT<=50){
22             iT = 0;
23         }else if(iT>=document.documentElement.offsetHeight - box.offsetHeight - 50){
24             iT = document.documentElement.offsetHeight- box.offsetHeight;
25         }
26         box.style.left = iL +'px';
27         box.style.top = iT +'px';
28     }
29 
30     //当鼠标松开的是,元素随着鼠标停止
31     document.onmouseup = function(){
32         document.onmousemove = null;
33         document.onmouseup = null;
34     }
35 }