js 实现拖拽元素

JavaScript014

js 实现拖拽元素,第1张

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

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

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

计算

进行事件监听

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

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

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

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

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

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>鼠标拖动</title>

<meta http-equiv="Content-Type" content="text/htmlcharset=gb2312" />

<script language="JavaScript" type="text/javascript">

var drag_=false

var D=new Function('obj','return document.getElementById(obj)')

var oevent=new Function('e','if (!e) e = window.eventreturn e')

function Move_obj(obj){

var x,y

D(obj).onmousedown=function(e){

drag_=true

with(this){

style.position="absolute"var temp1=offsetLeftvar temp2=offsetTop

x=oevent(e).clientXy=oevent(e).clientY

document.onmousemove=function(e){

if(!drag_)return false

with(this){

style.left=temp1+oevent(e).clientX-x+"px"

style.top=temp2+oevent(e).clientY-y+"px"

}

}

}

document.onmouseup=new Function("drag_=false")

}

}

</script>

<body>

<div id="drag" style="background-color:#0066CCwidth:280pxheight:160pxpadding:20pxborder:1px #003399 solidfont-size:10.5ptcolor:white" onmouseover='Move_obj("drag")'>

<p>这个层是可以拖动的,而且还可以吸附鼠标,试试看!</p>

<p>/</p>

</div>

</body>

</html>

在HTML5的pc上面实现了相当多的功能,工作中也用到了拖拉上传,特地记录下该功能

在拖动目标上触发事件 (源元素):

ondragstart - 用户开始拖动元素时触发

ondrag - 元素正在拖动时触发

ondragend - 用户完成元素拖动后触发

释放目标时触发的事件:

ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件

ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件

ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件

ondrop - 在一个拖动过程中,释放鼠标键时触发此事件