1. 程式人生 > >js實現滑鼠拖拽功能基本思路

js實現滑鼠拖拽功能基本思路

如果要設定物體拖拽,那麼必須使用三個事件,並且這三個事件的使用順序不能顛倒。

  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. <divclass="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.     var drag = document.getElementById('drag');  
  4.     //點選某物體時,用drag物件即可,move和up是全域性區域,也就是整個文件通用,應該使用document物件而不是drag物件(否則,採用drag物件時物體只能往右方或下方移動)  
  5.     drag.onmousedown = function(e) {  
  6.         var e = e || window.event; //相容ie瀏覽器  
  7.         var diffX = e.clientX - drag.offsetLeft; //滑鼠點選物體那一刻相對於物體左側邊框的距離=點選時的位置相對於瀏覽器最左邊的距離-物體左邊框相對於瀏覽器最左邊的距離  
  8.         var diffY = e.clientY - drag.offsetTop;  
  9.         /*低版本ie bug:物體被拖出瀏覽器可是視窗外部時,還會出現滾動條,  
  10.             解決方法是採用ie瀏覽器獨有的2個方法setCapture()\releaseCapture(),這兩個方法,  
  11.             可以讓滑鼠滑動到瀏覽器外部也可以捕獲到事件,而我們的bug就是當滑鼠移出瀏覽器的時候,  
  12.             限制超過的功能就失效了。用這個方法,即可解決這個問題。注:這兩個方法用於onmousedown和onmouseup中*/  
  13.             if(typeof drag.setCapture!='undefined'){  
  14.                 drag.setCapture();  
  15.             }  
  16.         document.onmousemove = function(e) {  
  17.             var e = e || window.event; //相容ie瀏覽器  
  18.             var left=e.clientX-diffX;  
  19.             var top=e.clientY-diffY;  
  20.             //控制拖拽物體的範圍只能在瀏覽器視窗內,不允許出現滾動條  
  21.             if(left<0){  
  22.                 left=0;  
  23.             }else if(left >window.innerWidth-drag.offsetWidth){  
  24.                 left = window.innerWidth-drag.offsetWidth;  
  25.             }  
  26.             if(top<0){  
  27.                 top=0;  
  28.             }else if(top >window.innerHeight-drag.offsetHeight){  
  29.                 top = window.innerHeight-drag.offsetHeight;  
  30.             }  
  31.             //移動時重新得到物體的距離,解決拖動時出現晃動的現象  
  32.             drag.style.left = left+ 'px';  
  33.             drag.style.top = top + 'px';  
  34.         };  
  35.         document.onmouseup = function(e) { //當滑鼠彈起來的時候不再移動  
  36.             this.onmousemove = null;  
  37.             this.onmouseup = null; //預防滑鼠彈起來後還會迴圈(即預防滑鼠放上去的時候還會移動)  
  38.             //修復低版本ie bug  
  39.             if(typeof drag.releaseCapture!='undefined'){  
  40.                 drag.releaseCapture();  
  41.             }  
  42.         };  
  43.     };  
  44. };

原始碼:

<!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>