如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

  1. onmousedown:鼠标按下事件
  2. onmousemove:鼠标移动事件
  3. onmouseup:鼠标抬起事件

  拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的 top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

基本思路如下:

1. 拖拽状态 = 0鼠标在元素上按下的时候{      
2.     拖拽状态 = 1      
3.     记录下鼠标的x和y坐标      
4.     记录下元素的x和y坐标      
5.    }   
6.  鼠标在元素上移动的时候{      
7.     如果拖拽状态是0就什么也不做。      
8.     如果拖拽状态是1,那么      
9. y = 现在鼠标y - 原来鼠标y + 原来元素y      
10. x = 现在鼠标x - 原来鼠标x + 原来元素x      
11.     }       
12.  鼠标在任何时候放开的时候{      
13.     拖拽状态 = 0      
14. }



部分实例代码:


HTML部分



1. <div class="calculator" id="drag">**********</div>

CSS部分


    1. .calculator {  
    2.     position: absolute; /*设置绝对定位,脱离文档流,便于拖拽*/  
    3.     display: block;  
    4.     width: 218px;  
    5.     height: 280px;  
    6.     cursor: move;   /*鼠标呈拖拽状*/  
    7. }


    js部分


      1. window.onload = function() {  
      2.     //拖拽功能(主要是触发三个事件:onmousedown\onmousemove\onmouseup)  
      3. drag = document.getElementById('drag');  
      4.   
      5.     //点击某物体时,用drag对象即可,move和up是全局区域,也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动)  
      6. drag.onmousedown = function(e) {  
      7. e = e || window.event; //兼容ie浏览器  
      8. diffX = e.clientX - drag.offsetLeft; //鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离  
      9. diffY = e.clientY - drag.offsetTop;  
      10.   
      11.         /*低版本ie bug:物体被拖出浏览器可是窗口外部时,还会出现滚动条,  
      12.             解决方法是采用ie浏览器独有的2个方法setCapture()\releaseCapture(),这两个方法,  
      13.             可以让鼠标滑动到浏览器外部也可以捕获到事件,而我们的bug就是当鼠标移出浏览器的时候,  
      14.             限制超过的功能就失效了。用这个方法,即可解决这个问题。注:这两个方法用于onmousedown和onmouseup中*/  
      15.             if(typeof drag.setCapture!='undefined'){  
      16.                 drag.setCapture();  
      17.             }  
      18.   
      19. document.onmousemove = function(e) {  
      20. e = e || window.event; //兼容ie浏览器  
      21. left=e.clientX-diffX;  
      22. top=e.clientY-diffY;  
      23.   
      24.             //控制拖拽物体的范围只能在浏览器视窗内,不允许出现滚动条  
      25. <0){  
      26. left=0;  
      27. >window.innerWidth-drag.offsetWidth){  
      28. left = window.innerWidth-drag.offsetWidth;  
      29.             }  
      30. <0){  
      31. top=0;  
      32. >window.innerHeight-drag.offsetHeight){  
      33. top = window.innerHeight-drag.offsetHeight;  
      34.             }  
      35.   
      36.             //移动时重新得到物体的距离,解决拖动时出现晃动的现象  
      37. drag.style.left = left+ 'px';  
      38. drag.style.top = top + 'px';  
      39.         };  
      40. document.onmouseup = function(e) { //当鼠标弹起来的时候不再移动  
      41. this.onmousemove = null;  
      42. this.onmouseup = null; //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)  
      43.   
      44.             //修复低版本ie bug  
      45.             if(typeof drag.releaseCapture!='undefined'){  
      46.                 drag.releaseCapture();  
      47.             }  
      48.         };  
      49.     };  
      50. };

      源码:

      <!DOCTYPE html>
      <html>
      <head lang="en">
          <meta charset="UTF-8">
          <title></title>
          <style>
              .calculator {
                  position: absolute; /*设置绝对定位,脱离文档流,便于拖拽*/
                  display: block;
                  width: 218px;
                  height: 280px;
                  cursor: move;   /*鼠标呈拖拽状*/
              }
          </style>
      </head>
      <body>
      <div class="calculator" id="drag">**********</div>
      </body>
      </html>
      
              <script>
                  window.onload = function() {
                      //拖拽功能(主要是触发三个事件:onmousedown\onmousemove\onmouseup)
                      var drag = document.getElementById('drag');
      
                      //点击某物体时,用drag对象即可,move和up是全局区域,也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动)
                      drag.onmousedown = function(e) {
                          var e = e || window.event; //兼容ie浏览器
                          var diffX = e.clientX - drag.offsetLeft; //鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离
                          var diffY = e.clientY - drag.offsetTop;
      
                          /*低版本ie bug:物体被拖出浏览器可是窗口外部时,还会出现滚动条,
                           解决方法是采用ie浏览器独有的2个方法setCapture()\releaseCapture(),这两个方法,
                           可以让鼠标滑动到浏览器外部也可以捕获到事件,而我们的bug就是当鼠标移出浏览器的时候,
                           限制超过的功能就失效了。用这个方法,即可解决这个问题。注:这两个方法用于onmousedown和onmouseup中*/
                          if(typeof drag.setCapture!='undefined'){
                              drag.setCapture();
                          }
                          document.onmousemove = function(e) {
                              var e = e || window.event; //兼容ie浏览器
                              var left=e.clientX-diffX;
                              var top=e.clientY-diffY;
      
                              //控制拖拽物体的范围只能在浏览器视窗内,不允许出现滚动条
                              if(left<0){
                                  //left=0;
                              }else if(left >window.innerWidth-drag.offsetWidth){
                                  left = window.innerWidth-drag.offsetWidth;
                                  //left = window.innerWidth;
                              }
                              if(top<0){
                                  //top=0;
                              }else if(top >window.innerHeight-drag.offsetHeight){
                                  top = window.innerHeight-drag.offsetHeight;
                                  //top = window.innerHeight;
                              }
      
                              //移动时重新得到物体的距离,解决拖动时出现晃动的现象
                              drag.style.left = left+ 'px';
                              drag.style.top = top + 'px';
                          };
                          document.onmouseup = function(e) { //当鼠标弹起来的时候不再移动
                              this.onmousemove = null;
                              this.onmouseup = null; //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)
      
                              //修复低版本ie bug
                              if(typeof drag.releaseCapture!='undefined'){
                                  drag.releaseCapture();
                              }
                          };
                      };
                  };
              </script>