js drag & drop实现拖拽

JavaScript012

js drag & drop实现拖拽,第1张

1.先在元素上添加属性 <div draggable="true"></div>,定义了这个属性后就可以注册拖动的事件了

2.拖动事件:

开始拖动时dragstart

进行拖动时drag

结束拖动时dragend

3.拖拽区域触发事件:

拖拽元素进入区域时触发dragenter

拖拽元素进入区域后悬停触发dragover

拖拽元素离开区域时触发dragleave

拖拽元素放置时触发drop

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>拖拽</title>

<style type="text/css">

*{

margin: 0

padding: 0

}

#box{

width: 500px

height: 500px

border: 1px solid black

}

#block{

width: 50px

height: 50px

background: red

position: absolute

left: 100px

top:100px

}

</style>

</head>

<body>

<div id="box">

<div id="block"></div>

</div>

<script type="text/javascript">

//获得元素

var box=document.getElementById('box')

var block=document.getElementById('block')

function getCss(elmen,css){

return parseInt(window.getComputedStyle ? window.getComputedStyle(elmen,null)[css] : obj.currentStyle[css])

}

block.onmousedown=function(event){

event=window.event || event

var self=this

var x=event.clientX-self.offsetLeft

var y=event.clientY-self.offsetTop

box.onmousemove=function(event){

var moveX=event.clientX-x

var moveY=event.clientY-y

var boxSize=getCss(box,'width')

var blockSize=getCss(block,'width')

if(moveX>=(boxSize-blockSize)){moveX=boxSize-blockSize}

if(moveX<=0){moveX=0}

if(moveY<0){moveY=0}

if(moveY>=(boxSize-blockSize)){moveY=boxSize-blockSize}

block.style.left=moveX+'px'

block.style.top=moveY+'px'

}

}

block.onmouseup=function(){

box.onmousemove=null

}

</script>

</body>

</html>

因为需要计算元素的位置变化,所以需要掌握几个关于位置的api

点击需要拖动元素时,获取该元素的初始位置。

鼠标移动期间 获取元素当前的位置信息

计算

进行事件监听

拖拽的实现原理:通过事件mousedown(事件的触发) →mousemove(事件的控制) →mouseup(事件的清除),拖拽的过程就是mousemove阶段;

问题产生的原因:因为mousemove 的间隔性触发,当两次mousemove事件触发的间隔中,鼠标移动距离出了element的范围,就会产生鼠标脱离element范围,拖拽就停止,

解决方法: 将mousemove事件挂在docment,而不是对应的element,此时鼠标滑动只要不出docment范围就不会触发上述情况。

拖动事件完成的动作时是:mousedown(事件的触发) →mousemove(事件的控制) →mouseup(事件的清除) 但是mouseup的时候 同时会触发 点击事件(如果元素上面有点击事件的话)

处理办法:记录mousedown(记录开始时间) →mousemove→mouseup(记录结束时间) 的时间 根据时间长短判断是进行了点击事件还是进行了拖拽事件。

正常需求的话 就希望拖拽元素只在屏幕的可视范围内进行拖拽,不能跑出去。

在onmousemove 中添加边缘控制就好,具体范围可以根据具体需求更改。