用JavaScript實現div的鼠標拖拽效果


實現原理鼠標按下時根據onmousemove事件來動態獲取鼠標坐標位置以此來更新div的位置,實現的前提時div要有一個定位效果,不然的話是移動不了它的。

HTML

<div class="box"></div>

CSS樣式

.box {
    position: absolute;
    width: 200px;
    height: 200px;
    background: red;    
    }

 首先先分析一下需求,這個需求就是點擊時鼠標按下你才能移動並改變div在頁面中的位置。鼠標松開你就不能在移動了。所以這里鼠標的狀態有三個,分別是點擊時鼠標按下(mousedown事件)、移動時(mousemove事件)、松開時(mouseup事件),

所以js部分有三個事件。

JS部分

var box = document.getElementsByClassName("box")[0];//獲取元素
var x, y;//存儲div的坐標
var isDrop = false;//移動狀態的判斷鼠標按下才能移動

鼠標按下時

box.onmousedown = function(e) {
                var e = e || window.event;//要用event這個對象來獲取鼠標的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true;//設為true表示可以移動
            }
e.clientX鼠標x軸的位置,e.clientY鼠標Y軸的位置,box.offsetLeft獲取div距離左邊的距離,box.offsetTop獲取div距離上邊的距離。
如下圖所示 e.clientX - box.offsetLeft我們可以得到坐標點x與 box.offsetLeft之間的偏差值,我們要再用坐標點x減去這個偏差值才是div真實相對於左邊移動的距離e.clientY - box.offsetTop同理得到的是距離上邊偏移的距離。

鼠標移動時
為了防止鼠標移動過快時間無法正確處理所以事件綁定到document上
            document.onmousemove = function(e) {
         //是否為可移動狀態
         if(isDrop) {     
var e = e || window.event;    var moveX = e.clientX - x;//得到距離左邊移動距離    var moveY = e.clientY - y;//得到距離上邊移動距離    box.style.left = moveX + "px";   box.style.top = moveY + "px";           }else{
return ;
          }
}
 e.clientX - x 鼠標點坐標減去偏差得到div距離左邊的距離,e.clientY - y 鼠標點坐標減去偏差得到div距離上邊的距離。給div的left,top重新賦值

鼠標松開時

為了放置鼠標移動過快時間無法正確處理所以事件綁定到document上
document.onmouseup = function() {
                isDrop = false;//設置為false不可移動
            }
 
        

現在div已經可以拖拽了,目前還需要添加一個范圍限定,不然div會拖到頁面外面去,這樣不行的所以得添加范圍限定。div最大移動寬度為頁面寬減去div的寬,最小為零,最大高為頁面高減去div的高,最小為零。所以范圍限定要這樣寫

 

            document.onmousemove = function(e) {
                var e = e || window.event;
                if(is) {
                    var moveX = e.clientX - x;
                    var moveY = e.clientY - y;
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;//X軸可移動最大距離
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;//Y軸可移動最大距離
                    

                    //范圍限定  最小時取最大  最大時取最小
                    if(moveX < 0) {
                        moveX=0
                     }else if(moveX>maxX){
                        moveX=maxX;
                    }
                    
                    if(moveY < 0) {
                        moveY=0;
                    }else if(moveY>maxY){
                        moveY=maxY; 
                    }

                    box.style.left = moveX + "px";
                    box.style.top = moveY + "px";

                } else {
                    return;
                }

            }

這樣效果就完美實現了,但是范圍限定我們還可以這樣做。

可以這樣表示范圍限定
 //范圍限定  最小取最大  最大取最小
     if(moveX < 0) {
           moveX= Math.max(0,moveX)//0
     }else if(moveX>maxX){
           moveX=Math.min(moveX,maxX);//maxX
     }
                    
      if(moveY < 0) {
          moveY= Math.max(0,moveY) //0
      }else if(moveY>maxY){
           moveY=Math.min(moveY,maxY); //maxY
      }
 
        

所以我們可以這樣寫

 
        
moveX=Math.min(maxX, Math.max(0,moveX));
moveY=Math.min(maxY, Math.max(0,moveY));
 
        

然后完整代碼

 
        
<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .box {
                position: absolute;
                width: 200px;
                height: 200px;
                background: red;
            }
        </style>
    </head>

    <body>
        <div class="box"></div>
        <script>
            var box = document.getElementsByClassName("box")[0]; //獲取元素
            var x, y; //鼠標相對與div左邊,上邊的偏移
            var isDrop = false; //移動狀態的判斷鼠標按下才能移動
            box.onmousedown = function(e) {
                var e = e || window.event; //要用event這個對象來獲取鼠標的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true; //設為true表示可以移動
            }

            document.onmousemove = function(e) {
                //是否為可移動狀態                                   
                if(isDrop) {    
                    var e = e || window.event;                      
                    var moveX = e.clientX - x; //得到距離左邊移動距離                      
                    var moveY = e.clientY - y; //得到距離上邊移動距離
                    //可移動最大距離
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;

                    //范圍限定  當移動的距離最小時取最大  移動的距離最大時取最小
                    //范圍限定方法一
                    /*if(moveX < 0) {
                        moveX = 0
                    } else if(moveX > maxX) {
                        moveX = maxX;
                    }

                    if(moveY < 0) {
                        moveY = 0;
                    } else if(moveY > maxY) {
                        moveY = maxY;
                    } */
                    //范圍限定方法二 
                    moveX=Math.min(maxX, Math.max(0,moveX));
                    
                    moveY=Math.min(maxY, Math.max(0,moveY));
                    box.style.left = moveX + "px";  
                    box.style.top = moveY + "px";          
                } else {
                    return;          
                }

            }

            document.onmouseup = function() {
                isDrop = false; //設置為false不可移動
            }
        </script>
    </body>

</html>
 
        

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM