JS鼠標的拖拽原理


拖拽功能主要是用在讓用戶做一些自定義的動作,比如拖動排序,彈出框拖動移動等等,效果還是蠻不錯的。下面講解一下拖拽的原理,希望可以幫助到有需要的朋友!

一、拖拽的流程動作
①鼠標按下
②鼠標移動
③鼠標松開

二、拖拽流程中對應的JS事件
①鼠標按下會觸發onmousedown事件

[javascript]  view plain  copy
 
  1. obj.onmousedown = function(e) {  
  2.       //..........  
  3. }  

②鼠標移動會觸發onmousemove事件

[javascript]  view plain  copy
 
  1. obj.onmousemove = function(e) {  
  2.     //......  
  3. }  

③鼠標松開會觸發onmouseup事件

[javascript]  view plain  copy
 
  1. obj.onmouseup = function() {  
  2.      //......  
  3. }  


三、實現的原理講解
拖拽其實是通過獲取鼠標移動的距離來實現的,即計算移動前的位置的坐標(x,y)與移動中的位置的坐標(x,y)差值。
當鼠標按下或鼠標移動時,都可以獲取到當前鼠標的位置,即移動前的位置與移動中的位置。
那么上面①與②的代碼就應該變成這樣

[javascript]  view plain  copy
 
  1. var mouseDownX,mouseDownY  // 因在移動中需計算鼠標的偏移需要用到鼠標按下時的坐標,固聲明稱全局變量  
  2. obj.onmousedown = function(e) {  
  3.     mouseDownX = e.pageX;  
  4.     mouseDownY = e.pageY;  
  5. }  
  6.   
  7. obj.onmousemove = function(e) {  
  8.     var mouseMoveX = e.pageX,mouseMoveY = e.pageY;  
  9. }  

移動前與移動后坐標有了,那么計算偏移,先看下圖

 

很明顯移動后元素的X坐標為  鼠標移動后的X坐標 - 鼠標按下的X坐標 + 元素的初始X坐標
Y坐標為  鼠標移動后的Y坐標 - 鼠標按下的Y坐標 + 元素的初始Y坐標
把新的 X,Y 替換元素的 X,Y 就搞定了。
那么代碼就應該更換為:

[javascript]  view plain  copy
 
  1. var mouseDownX,mouseDownY,initX,initY,flag = false;  
  2. obj.onmousedown = function(e) {  
  3.     //鼠標按下時的鼠標所在的X,Y坐標  
  4.     mouseDownX = e.pageX;  
  5.     mouseDownY = e.pageY;  
  6.   
  7.     //初始位置的X,Y 坐標  
  8.     initX = obj.offsetLeft;  
  9.     initY = obj.offsetTop;  
  10.   
  11.     //表示鼠標已按下  
  12.     flag = true;  
  13. }  
  14. obj.onmousemove = function(e) {  
  15.     // 確保鼠標已按下  
  16.     if(flag) {  
  17.         var mouseMoveX = e.pageX,mouseMoveY = e.pageY;  
  18.         this.style.left = parseInt(mouseMoveX) - parseInt(mouseDownX) + parseInt(initX) + "px";  
  19.         this.style.top = parseInt(mouseMoveY) - parseInt(mouseDownY) + parseInt(initY) + "px";  
  20.     }  
  21.       
  22. }  
  23. obj.onmouseup = function() {  
  24.     //標識已松開鼠標  
  25.     flag = false;  
  26. }  

需要注意的事,如果用jquery庫來寫的話三個事件為mousedown、mousemove、mouseup,名稱稍微有點差別。

 

還有一點,被拖拽的元素的樣式要設置成絕對或相對位置才有效果。

至此,最簡單的元素拖拽功能就講完了~~~~

如有不正確之處歡迎大家指正!

 


免責聲明!

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



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