js实现拖拽功能Drag(并用Vue封装成自定义指令v-drag)

  1. 首先是三个事件,分别是mousedown,mousemove,mouseup。
  2. 当鼠标点击按下的时候,需要一个tag标识此时已经按下,可以执行mousemove里面的具体方法。
  3. clientX,clientY标识的是鼠标的坐标,分别标识横坐标和纵坐标,并且我们用offsetLeft和offsetTop来表示元素的元素的初始坐标。
  4. 也就是说定位信息为: 鼠标移动时候的坐标 - 鼠标按下去时候的坐标 + 元素初始情况下的坐标(元素.offetLeft/offetTop)。
  5. 总结为:鼠标移动时候的坐标 - 鼠标相对于元素的坐标(在mousedown中就要定义)
  6. 还有一点也是原理性的东西,也就是拖拽的同时是绝对定位,我们改变的是绝对定位条件下的left以及top等等值。
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script type="text/javascript" src='../Vuedemo/vue.js'></script>
	<title>鼠标拖拽元素实现</title>
	<style type="text/css">
		*{
			margin: 0px;
		}
		#demo {
			width: 100px;
			height: 100px;
			position: absolute;
			background: red;
			}
	</style>
</head>
<body>
	<div id="app" >
		<div id="demo" v-drag></div>
	</div>
	<script type="text/javascript">
		var vm = new Vue({
			el:'#app',
			data:{},
			methods:{},
			directives:{
				drag(el,binding){
					var isDrag = false;
					//鼠标事件1 - 鼠标点击的时候(标记元素为可拖动)
					el.addEventListener('mousedown', function(e) {
						var e = e || window.event;
						mouseOffsetX = e.offsetX;  //鼠标相对于被触发元素的位置
						mouseOffsetY = e.offsetY;  
						isDrag = true;
					})
					//鼠标事件3 - 鼠标松开的时候(标记元素为不可拖动)
					document.onmouseup = function(e) {
						isDrag = false;
					}
					//鼠标事件2 - 鼠标移动时(要检测,元素是否标记为移动)
					document.onmousemove = function(e) {
						var e = e || window.event;
						var mouseX = e.clientX; //鼠标当前的位置
						var mouseY = e.clientY;
						if (isDrag) {
						//获取页面宽度高度
							var pageWidth = window.innerWidth;
							var pageHeight = window.innerHeight;
						//获取元素的宽高
							var elWidth = el.offsetWidth; 
							var elHeight = el.offsetHeight;
						//最大能够移动的距离
							var maxX = pageWidth-elWidth; 
							var maxY = pageHeight-elHeight;
						// 鼠标移动的距离
							var moveX = mouseX- mouseOffsetX;
							var moveY = mouseY - mouseOffsetY;
						//给元素设置移动限制
							var moveX = Math.min(maxX, Math.max(0, moveX));
							var moveY = Math.min(maxY, Math.max(0, moveY));
						// 给元素的宽高赋值
							el.style.left = moveX + 'px';
							el.style.top = moveY + 'px';
							
						}
					};
				}
			}
		})
	</script>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值