您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用JavaScript實現(xiàn)div的鼠標拖拽效果”,在日常操作中,相信很多人在怎么用JavaScript實現(xiàn)div的鼠標拖拽效果問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用JavaScript實現(xiàn)div的鼠標拖拽效果”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
實現(xiàn)原理鼠標按下時根據(jù)onmousemove事件來動態(tài)獲取鼠標坐標位置以此來更新div的位置,實現(xiàn)的前提時div要有一個定位效果,不然的話是移動不了它的。
HTML
<div class="box"></div>
CSS樣式
.box { position: absolute; width: 200px; height: 200px; background: red; }
首先先分析一下需求,這個需求就是點擊時鼠標按下你才能移動并改變div在頁面中的位置。鼠標松開你就不能在移動了。所以這里鼠標的狀態(tài)有三個,分別是點擊時鼠標按下(mousedown事件)、移動時(mousemove事件)、松開時(mouseup事件)
所以js部分有三個事件。
JS部分
var box = document.getElementsByClassName("box")[0];//獲取元素 var x, y;//存儲div的坐標 var isDrop = false;//移動狀態(tài)的判斷鼠標按下才能移動
鼠標按下時
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) { //是否為可移動狀態(tài) 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不可移動 }
現(xiàn)在div已經(jīng)可以拖拽了,目前還需要添加一個范圍限定,不然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; } }
這樣效果就完美實現(xiàn)了,但是范圍限定我們還可以這樣做。
可以這樣表示范圍限定
//范圍限定 最小取最大 最大取最小 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; //移動狀態(tài)的判斷鼠標按下才能移動 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) { //是否為可移動狀態(tài) 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>
到此,關于“怎么用JavaScript實現(xiàn)div的鼠標拖拽效果”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。