js拖拽元素

273 阅读2分钟

使用JavaScript的方法实现按住鼠标时元素跟着鼠标移动。

css样式

<style>        
div{            
width: 50px;            
height: 50px;            
background-color: red;            
position: absolute;        
}    
</style>

JavaScript

<body>    
<div></div>    
<script>        
var div0=document.querySelector("div")        
//按下时开始监听在文档中鼠标移动的事件        
//开始监听鼠标松开键的事件        
//只有按下时才准备拖拽        
div0.onmousedown=function(e1){            
//当鼠标在文档移动时,不能再div上移动,因为鼠标可能离开div,造成无法拖拽            
document.onmousemove=function(e){            
//当鼠标移动时,将当前鼠标相对视口的坐标赋值给元素的1eft和top            
//因为我们需要在按下的位置拖拽,因此我们还需要获取按下键鼠标相对div的左上角位置            
//使用当前鼠标位置减去这个相对元素的左上角位置,保证鼠标所按位置拖拽                
div0.style.left=e.clientX-e1.offsetX+"px"                
div0.style.top=e.clientY-e1.offsetY+"px"            }            
//当释放鼠标键时,删除鼠标移动事件和删除鼠标释放事件            
document.onmouseup=function(){                
document.onmousemove=null;                
document.onmouseup=null;            
}        
}    
</script>
</body>

原理解析

1.首先创建一个div并且添加css样式,必须添加宽高

2.给div加一个点击事件mousedown

点击实际上是由mouseup和mousedown两件事组成
mouseup和mousedown还可以针对鼠标的左中右键
click只能针对左键
div0.addEventListener("mousedown",clickHandler)
div0.addEventListener("mousemove",clickHandler)
div0.addEventListener("mouseup",clickHandler)

3.再给document添加mousemove和mouseup事件

为了能让div在可视窗口内移动,所以必须给document添加mousemove和mouseup事件,这是因为之前是在div添加mousedown,只要鼠标移出div的范围就不能再触发侦听的事件,所以为了能让div在整个页面上移动,需要给document添加mousemove和mouseup。

4.通过获取document的宽高clientX,clientY给div的位置赋值

4.最后再松开鼠标时删除事件mousemove和mouseup,否则由于mousemove一直触发,div会一直跟着鼠标移动。


升级版

使多个div实现拖拽

<div></div>    
<div></div>    
<div></div>    
<div></div>   
<div></div>    
<div></div>    
<div></div>    
<div></div>

var divs=document.querySelectorAll("div")            
for(var i=0;i<divs.length;i++){                
divs[i].addEventListener("mousedown",mouseHandler);            
}            
function mouseHandler(e){                                
if(e.type==="mousedown"){                
document.div=this                
document.offset={X:e.offsetX,Y:e.offsetY}                
document.addEventListener("mousemove",mouseHandler);                
document.addEventListener("mouseup",mouseHandler);             
}             
else if(e.type==="mousemove"){                 
this.div.style.left=e.clientX-document.offset.X+"px"                 
this.div.style.top=e.clientY-document.offset.Y+"px"             
}             
else{                  
document.removeEventListener("mousemove",mouseHandler);                  
document.removeEventListener("mouseup",mouseHandler);             
}            
}