h5特性可以拖动元素都任何位置的demo

方案一: 

1.设置draggable="true"

2.通过dragstart,记录到点击时鼠标到移动框左边和上边的距离(offsetX,offsetY)

3.通过dragover,取消冒泡 ,不取消则不能触发 drop事件

4.通过drop事件设置元素left,top属性,e.pageX - x,e.pageY- y ,并阻止冒泡

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8"> 
<title>菜鸟教程(runoob.com)</title>
<style type="text/css">
	.divblok { 
	    background-color:rgba(172,16,172,0.5);
	    width:200px;
	    height:100px;
	    position:absolute;
	    left:20px;
	     top:20px;
	 }
</style>

</head>
<body>
 <div style="width:600px;height:400px;border:1px solid red;"></div>
<div id="dragdiv" draggable="true" class="divblok">我要移动 </div>
<script>
	var dragdiv = document.querySelector('#dragdiv');
	    var x, y;  //记录到点击时鼠标到移动框左边和上边的距离
	
	    dragdiv.addEventListener('dragstart', function (e) {
	        e.dataTransfer.effectAllowed = "move";  //移动效果
	        e.dataTransfer.setData("text", '');  //附加数据, 没有这一项,firefox中无法移动
	        x = e.offsetX || e.layerX;
	        y = e.offsetY || e.layerY;
	        return true;
	    }, false);
	
	    document.addEventListener('dragover', function (e) {//取消冒泡 ,不取消则不能触发 drop事件
	        e.preventDefault()|| e.stopPropagation();
	    }, false);
	
	    document.addEventListener('drop', function (e) {
	        dragdiv.style.left = (e.pageX - x) + 'px';
	        dragdiv.style.top = (e.pageY - y) + 'px';
	        e.preventDefault() || e.stopPropagation();  //不取消,firefox中会触发网页跳转到查找setData中的内容
	    }, false);
</script>
</body>
</html>

方案二:

  • 给拖拽元素添加mousedown事件监听器,在该事件处理函数中记录下鼠标点击的位置和拖拽元素的初始位置。

  • 给document对象添加mousemove事件监听器,在该事件处理函数中计算出鼠标移动的距离,更新拖拽元素的位置。

  • 给document对象添加mouseup事件监听器,在该事件处理函数中取消mousemove事件监听器,并在拖拽结束时进行一些处理(如触发回调函数、更新数据状态等 

<div id="dragdiv" draggable="true" class="divblok">我要移动 </div>

window.onload = function() {
    //获取drag元素
	let drag = document.getElementById("drag")
	//当鼠标按下时
	drag.onmousedown = function(e) {
	    //做到浏览器兼容
		e = e || window.event
		let diffX = e.clientX - drag.offsetLeft
		let diffY = e.clientY - drag.offsetTop
		//当拉着box移动时
		document.onmousemove = function(e) {
			// 浏览器兼容
			e = e || window.event
			let left = e.clientX - diffX
			let top = e.clientY - diffY
            if (left < 0) {
				left = 0
			} else if (left > window.innerWidth - drag.offsetWidth) {
				left = window.innerWidth - drag.offsetWidth
			}
			if (top < 0) {
				top = 0
			} else if (top > window.innerHeight - drag.offsetHeight) {
				top = window.innerHeight - drag.offsetHeight
			}
			drag.style.left = left + 'px'
			drag.style.top = top + 'px'
			}
			// 当鼠标抬起时
			document.onmouseup = function(e) {
				this.onmousemove = null
				this.onmouseup = null
			}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值