元素拖拽及原理(举例讲解)

  首先定义一个我们想要拖拽的元素

//这里我以一个盒子为例
<div id="div"></div>

  给这个想要拖拽的元素一个CSS样式

 <style>
 	/* 清除浏览器默认样式 */
  	* {
  		margin: 0;
        padding: 0;
      }
	/* 给盒子定义一些属性 */
    #div{
        width: 100px;
        height: 100px;
        background: red;
        position: absolute;
        left: 0px;
         top: 0px;
       }
    </style>

  之后,我们需要对拖拽进行分析。拖拽就是当我们按住鼠标左键的时候,需要拖拽的元素会跟着鼠标一起移动,当我们松开鼠标的时候,需要拖拽的元素会随之停止。

onmousedown = function(){
	onmousemove = function(){
	}
	onmouseup =function(){
		//当我们松开鼠标的时候,盒子需要停止
		onmousemove = null;
	}
}

  之后我们需要知道,当我们拖拽元素的时候,改变的是元素的lefttop。所以我们需要对lefttop进行操作。

    div.style.left = event.clientX + 'px';
    div.style.top = event.clientY + 'px';

  但是此时有一个问题,鼠标拖拽的时候,无论点元素的哪个位置,拖拽的时候元素的左上角都会移动到鼠标位置再开始移动,所以我们需要让鼠标无论在元素的哪个位置都可以实现拖拽。

	//这里的event.client是鼠标到页面的距离
	var l = event.clientX - div1.offsetLeft;
	var t = event.clientY - div1.offsetTop;
	onmousemove = function(){
		//这里的event.client是到元素边框的距离
		//event.clientX,event.clientY;
		div.style.left = event.clientX - l + 'px';
		div.style.top  = event.clientY - t + 'px';
		};
	onmouseup = function(){
		onmousemove = null;
	}

  为了使鼠标只有在元素内部的时候才能实现拖拽,所以需要对onmousemoveonmousedownonmouseup进行设置。

	div.onmousedown = function(){
		var l = event.clientX - div1.offsetLeft;
		var t = event.clientY - div1.offsetTop;
		document.onmousemove = function(){
			//event.clientX,event.clientY;
		div.style.left = event.clientX - l + 'px';
		div.style.top  = event.clientY - t + 'px';
		};
		document.onmouseup = function(){
			document.onmousemove = null;
			document.onmouseup = null;
		};
		return false;
	}

  拖拽效果实现之后,对拖拽进行优化,使其不能超出页面的边框。

	div.onmousedown = function(){
		var l = event.clientX - div1.offsetLeft;
		var t = event.clientY - div1.offsetTop;
		document.onmousemove = function(){
			//event.clientX,event.clientY;
		var needX = event.clientX - l;
			var needY = event.clientY - t;
			if(needX<0){
				needX = 0;
			}
			if(needY<0){
				needY = 0;
			}
			if(needY>innerHeight - div1.offsetHeight){
				needY = innerHeight - div1.offsetHeight;
			}
			if(needX>innerWidth - div1.offsetWidth){
				needX = innerWidth - div1.offsetWidth;
			}
			div.style.left = needX + 'px';
			div.style.top  = needY + 'px';
		};
		document.onmouseup = function(){
			document.onmousemove = null;
			document.onmouseup = null;
		};
		return false;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生_Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值