原生js實現拖拽功能

若是要設置物體拖拽,必須使用三個事件,分別是:瀏覽器

一、onmousedown:鼠標按下事件spa

二、onmousemove:鼠標移動事件code

三、onmouseup:鼠標擡開事件對象

拖拽的原理:根據鼠標的移動來移動被拖拽的元素。鼠標的移動就是鼠標x、y座標的變化,元素的移動就是position的top和left的變化。blog

固然並非任什麼時候候移動鼠標都要使元素移動,應該判斷鼠標左鍵是否被按下,以及是否在可拖拽元素上按下的。事件

基本思路:ip

拖拽狀態 = 0鼠標在元素上按下的時候{   
    拖拽狀態 = 1   
    記錄下鼠標的x和y座標   
    記錄下元素的x和y座標   
  }  
 鼠標在元素上移動的時候{   
    若是拖拽狀態是0就什麼也不作。   
    若是拖拽狀態是1,那麼   
    元素y = 如今鼠標y - 原來鼠標y + 原來元素y   
    元素x = 如今鼠標x - 原來鼠標x + 原來元素x   
  }    
 鼠標在任什麼時候候放開的時候{   
    拖拽狀態 = 0   
}

三個事件分別綁定的對象是什麼?文檔

(1)onmousedown:綁定到被拖拽元素上字符串

(2)onmousemove:綁定到document上,主要是爲了防止鼠標移動過快,鼠標超出元素範圍get

(3)onmouseup:綁定到document上,主要是爲了防止鼠標移動過快,被移除目標元素,因此沒法處理鼠標鬆開事件

onmousemove、onmouseup是全局區域,也就是整個文檔通用,應該使用document對象而不是目標對象,不然目標對象只能往右方或者下方移動

 

考慮邊界

代碼實現:

window.onload=function(){
    var dragObj=document.getElementById('box');
    dragObj.style.left='0px';
    dragObj.style.top='0px';
                
    var mouseX,mouseY,objX,objY;
    var dragging=false;
    var diffX,diffY;

    dragObj.onmousedown=function(event){
        var event=event||window.event;        
        dragging=true;
                    
        mouseX=event.clientX;//初始位置時鼠標的座標
        mouseY=event.clientY;
        objX=dragObj.offsetLeft;//元素的初始位置
        objY=dragObj.offsetTop;
                    
        diffX=mouseX-objX;//至關於鼠標距物體左邊的距離
        diffY=mouseY-objY;
     }       
    document.onmousemove=function(event){
        var event=event||window.event;
        if(dragging){
            //元素左邊距等於鼠標移動的寬度加上元素自己的位置
            dragObj.style.left=event.clientX-mouseX+objX+"px";
            dragObj.style.top=event.clientY-mouseY+objY+"px";
                
             //設置邊界
            if((event.clientX-diffX)<0){//鼠標到瀏覽器左邊距小於鼠標到obj的左邊距
                dragObj.style.left=0+"px";
            }
            //window.innerWidth瀏覽器顯示區域的寬度,dragObj.offsetWidth物體寬度
            else if((event.clientX-diffX)>(window.innerWidth-dragObj.offsetWidth)){
                dragObj.style.left=window.innerWidth-dragObj.offsetWidth+"px";
            }
            if((event.clientY-diffY)<0){
                dragObj.style.top=0+"px";
            }
            else if((event.clientY-diffY)>(window.innerHeight-dragObj.offsetHeight)){
                dragObj.style.top=window.innerHeight-dragObj.offsetHeight+"px";
            }
        } 
    }
    document.onmouseup=function(){
        dragging=false;
    }
}
</script>    

 

obj.offsetLeft與obj.style.left的區別:

(1)offsetLeft:獲取當前對象左側距離父對象左側的值

  style.left:獲取相對於具備定位屬性的父對象的左邊距。

(2)若是父對象的position定義爲relative,子對象的position定義爲absolute,那麼子對象的style.left的值是相對於父對象的值,等同於offsetLeft的值.

(3)offsetLeft返回的是數值,而style.left返回的是數字字符串,在使用時須要parseInt(style.left);

(4)style.left能夠設置或更改,而offsetLeft只能獲取不能更改

相關文章
相關標籤/搜索