JavaScript實(shí)現(xiàn)div的鼠標(biāo)拖拽效果
本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)div鼠標(biāo)拖拽效果的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)原理鼠標(biāo)按下時(shí)根據(jù)onmousemove事件來(lái)動(dòng)態(tài)獲取鼠標(biāo)坐標(biāo)位置以此來(lái)更新div的位置,實(shí)現(xiàn)的前提時(shí)div要有一個(gè)定位效果,不然的話是移動(dòng)不了它的。
HTML
<div class="box"></div>
CSS樣式
.box {
position: absolute;
width: 200px;
height: 200px;
background: red;
}
首先先分析一下需求,這個(gè)需求就是點(diǎn)擊時(shí)鼠標(biāo)按下你才能移動(dòng)并改變div在頁(yè)面中的位置。鼠標(biāo)松開(kāi)你就不能在移動(dòng)了。所以這里鼠標(biāo)的狀態(tài)有三個(gè),分別是點(diǎn)擊時(shí)鼠標(biāo)按下(mousedown事件)、移動(dòng)時(shí)(mousemove事件)、松開(kāi)時(shí)(mouseup事件)
所以js部分有三個(gè)事件。
JS部分
var box = document.getElementsByClassName("box")[0];//獲取元素
var x, y;//存儲(chǔ)div的坐標(biāo)
var isDrop = false;//移動(dòng)狀態(tài)的判斷鼠標(biāo)按下才能移動(dòng)
鼠標(biāo)按下時(shí)
box.onmousedown = function(e) {
var e = e || window.event;//要用event這個(gè)對(duì)象來(lái)獲取鼠標(biāo)的位置
x = e.clientX - box.offsetLeft;
y = e.clientY - box.offsetTop;
isDrop = true;//設(shè)為true表示可以移動(dòng)
}
e.clientX鼠標(biāo)x軸的位置,e.clientY鼠標(biāo)Y軸的位置,box.offsetLeft獲取div距離左邊的距離,box.offsetTop獲取div距離上邊的距離。
如下圖所示 e.clientX - box.offsetLeft我們可以得到坐標(biāo)點(diǎn)x與 box.offsetLeft之間的偏差值,我們要再用坐標(biāo)點(diǎn)x減去這個(gè)偏差值才是div真實(shí)相對(duì)于左邊移動(dòng)的距離,e.clientY - box.offsetTop同理得到的是距離上邊偏移的距離。

鼠標(biāo)移動(dòng)時(shí)
為了防止鼠標(biāo)移動(dòng)過(guò)快事件無(wú)法正確處理所以事件綁定到document上
document.onmousemove = function(e) {
//是否為可移動(dòng)狀態(tài)
if(isDrop) {
var e = e || window.event;
var moveX = e.clientX - x;//得到距離左邊移動(dòng)距離
var moveY = e.clientY - y;//得到距離上邊移動(dòng)距離
box.style.left = moveX + "px";
box.style.top = moveY + "px";
}else{
return ;
}
}
e.clientX - x 鼠標(biāo)點(diǎn)坐標(biāo)減去偏差得到div距離左邊的距離,e.clientY - y 鼠標(biāo)點(diǎn)坐標(biāo)減去偏差得到div距離上邊的距離。給div的left,top重新賦值
鼠標(biāo)松開(kāi)時(shí)
為了放置鼠標(biāo)移動(dòng)過(guò)快時(shí)間無(wú)法正確處理所以事件綁定到document上
document.onmouseup = function() {
isDrop = false;//設(shè)置為false不可移動(dòng)
}
現(xiàn)在div已經(jīng)可以拖拽了,目前還需要添加一個(gè)范圍限定,不然div會(huì)拖到頁(yè)面外面去,這樣不行的所以得添加范圍限定。div最大移動(dòng)寬度為頁(yè)面寬減去div的寬,最小為零,最大高為頁(yè)面高減去div的高,最小為零。所以范圍限定要這樣寫(xiě)
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軸可移動(dòng)最大距離
var maxY = document.documentElement.clientHeight - box.offsetHeight;//Y軸可移動(dòng)最大距離
//范圍限定 最小時(shí)取最大 最大時(shí)取最小
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;
}
}
這樣效果就完美實(shí)現(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
}
所以我們可以這樣寫(xiě)
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; //鼠標(biāo)相對(duì)與div左邊,上邊的偏移
var isDrop = false; //移動(dòng)狀態(tài)的判斷鼠標(biāo)按下才能移動(dòng)
box.onmousedown = function(e) {
var e = e || window.event; //要用event這個(gè)對(duì)象來(lái)獲取鼠標(biāo)的位置
x = e.clientX - box.offsetLeft;
y = e.clientY - box.offsetTop;
isDrop = true; //設(shè)為true表示可以移動(dòng)
}
document.onmousemove = function(e) {
//是否為可移動(dòng)狀態(tài)
if(isDrop) {
var e = e || window.event;
var moveX = e.clientX - x; //得到距離左邊移動(dòng)距離
var moveY = e.clientY - y; //得到距離上邊移動(dòng)距離
//可移動(dòng)最大距離
var maxX = document.documentElement.clientWidth - box.offsetWidth;
var maxY = document.documentElement.clientHeight - box.offsetHeight;
//范圍限定 當(dāng)移動(dòng)的距離最小時(shí)取最大 移動(dòng)的距離最大時(shí)取最小
//范圍限定方法一
/*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; //設(shè)置為false不可移動(dòng)
}
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Javascript實(shí)現(xiàn)倒計(jì)時(shí)(防頁(yè)面刷新)實(shí)例
本文分享了Javascript實(shí)現(xiàn)倒計(jì)時(shí)并且頁(yè)面不刷新的實(shí)例,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12
swiper.js插件實(shí)現(xiàn)pc端文本上下滑動(dòng)功能示例
這篇文章主要介紹了swiper.js插件實(shí)現(xiàn)pc端文本上下滑動(dòng)功能,結(jié)合實(shí)例形式分析了swiper.js插件的具體引用與相關(guān)使用技巧,需要的朋友可以參考下2018-12-12

