js拖拽效果的原理及實(shí)現(xiàn)
拖拽功能主要是用在讓用戶做一些自定義的動作,比如拖動排序,彈出框拖動移動等等
拖拽的流程動作
1、鼠標(biāo)按下 會觸發(fā)onmousedown事件
2、鼠標(biāo)移動 會觸發(fā)onmousemove事件
3、鼠標(biāo)松開 會觸發(fā)onmouseup事件
拖拽原理
1.鼠標(biāo)按下+鼠標(biāo)移動 = 拖拽-------事件 onmousedown + onmousemove
2.鼠標(biāo)松開 = 無拖拽--------停止拖拽 onmouseup
3.鼠標(biāo)偏移 = 拖拽距離
當(dāng)點(diǎn)擊dom的時(shí)候,記錄當(dāng)前鼠標(biāo)的坐標(biāo)值,也就是x、y值,以及被拖拽的dom的top、left值,而且還要在鼠標(biāo)按下的回調(diào)函數(shù)里添加鼠標(biāo)移動的事件:
document.addEventListener(“mousemove”, moving, false)
和添加鼠標(biāo)抬起的事件
document.addEventListener(“mouseup”,function() {
document.removeEventListener(“mousemove”, moving, false);
}, false);
這個(gè)抬起的事件是為了解除鼠標(biāo)移動的監(jiān)聽,因?yàn)橹挥性谑髽?biāo)按下才可以拖拽,抬起就停止不會移動了。
當(dāng)鼠標(biāo)按下鼠標(biāo)移動的時(shí)候,記錄移動中的x、y值,那么這個(gè)被拖拽的dom的top和left值就是:
top=鼠標(biāo)按下時(shí)記錄的dom的top值+(移動中的y值 - 鼠標(biāo)按下時(shí)的y值)
left=鼠標(biāo)按下時(shí)記錄的dom的left值+(移動中的x值 - 鼠標(biāo)按下時(shí)的x值);
//極簡單版
var div=document.querySelector("div");
// 按下時(shí)開始監(jiān)聽在文檔中鼠標(biāo)移動的事件
// 開始監(jiān)聽鼠標(biāo)松開鍵的事件
// 只有按下時(shí)才準(zhǔn)備拖拽
div.onmousedown=function(e1){
// 當(dāng)鼠標(biāo)在文檔移動時(shí),不能再div上移動,因?yàn)槭髽?biāo)可能離開div,造成無法拖拽
div.onmousemove=function(e){
// 當(dāng)鼠標(biāo)移動時(shí),將當(dāng)前鼠標(biāo)相對視口的坐標(biāo)賦值給元素的left和top
// 因?yàn)槲覀冃枰诎聪碌奈恢猛献?,因此我們還需要獲取按下鍵鼠標(biāo)相對div的左上角位置
// 使用當(dāng)前鼠標(biāo)位置減去這個(gè)相對元素的左上角位置,保證鼠標(biāo)所按位置拖拽
div.style.left=e.clientX-e1.offsetX+"px";
div.style.top=e.clientY-e1.offsetY+"px";
}
// 當(dāng)釋放鼠標(biāo)鍵時(shí),刪除鼠標(biāo)移動事件和刪除鼠標(biāo)釋放事件
div.onmouseup=function(){
document.onmousemove=null;
document.onmouseup=null;
}
}
//簡單版
var div=document.querySelector("div");
var offsetX,offsetY;
div.addEventListener("mousedown",mouseDownHandler);
function mouseDownHandler(e){
offsetX=e.offsetX
offsetY=e.offsetY
document.addEventListener("mousemove",mousemoveHandler)
document.addEventListener("mouseup",mouseupHandler)
}
function mousemoveHandler(e){
div.style.left=e.clientX-offsetX+"px"
div.style.top=e.clientY-offsetY+"px"
}
function mouseupHandler(e){
document.removeEventListener("mousemove",mousemoveHandler)
document.removeEventListener("mouseup",mouseupHandler)
}
// 簡單升級版
var div=document.querySelector("div");
var offsetX,offsetY;
div.addEventListener("mousedown",mouseHandler);
function mouseHandler(e){
if(e.type==="mousedown"){
offsetX=e.offsetX;
offsetY=e.offsetY;
document.addEventListener("mousemove",mouseHandler)
document.addEventListener("mouseup",mouseHandler)
}else if(e.type==="mousemove"){
div.style.left=e.clientX-offsetX+"px"
div.style.top=e.clientY-offsetY+"px"
}else if(e.type==="mouseup"){
document.removeEventListener("mousemove",mouseHandler)
document.removeEventListener("mouseup",mouseHandler)
}
}
注
a、被拖拽的元素的樣式要設(shè)置成絕對或相對位置才有效果。
b、拖拽加到document,不然內(nèi)容會脫離
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JQuery Dialog(JS 模態(tài)窗口,可拖拽的DIV)
- Sortable.js拖拽排序使用方法解析
- js實(shí)現(xiàn)拖拽效果
- javascript實(shí)現(xiàn)移動端上的觸屏拖拽功能
- 使用js實(shí)現(xiàn)的簡單拖拽效果
- JS實(shí)現(xiàn)漂亮的窗口拖拽效果(可改變大小、最大化、最小化、關(guān)閉)
- JS實(shí)現(xiàn)的文件拖拽上傳功能示例
- 使用javaScript實(shí)現(xiàn)鼠標(biāo)拖拽事件
- JS組件Bootstrap Table表格行拖拽效果實(shí)現(xiàn)代碼
- JavaScript實(shí)現(xiàn)水平進(jìn)度條拖拽效果
相關(guān)文章
JS實(shí)現(xiàn)頭條新聞的經(jīng)典輪播圖效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)頭條新聞的經(jīng)典輪播圖效果,涉及javascript圖片輪播切換相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-01-01
原生js實(shí)現(xiàn)寬度計(jì)數(shù)器
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)寬度計(jì)數(shù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
javascript定時(shí)器的簡單應(yīng)用示例【控制方塊移動】
這篇文章主要介紹了javascript定時(shí)器的簡單應(yīng)用,結(jié)合javascript事件觸發(fā)控制方塊移動操作分析了javascript定時(shí)器使用相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
js實(shí)現(xiàn)文件上傳功能 后臺使用MultipartFile
這篇文章主要為大家詳細(xì)介紹了純js實(shí)現(xiàn)最簡單的文件上傳功能,后臺使用MultipartFile,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09

