代码改变世界

原生js实现拖拽效果

  ET.frog  阅读(1359)  评论(0编辑  收藏  举报

面向对象 + 原生js拖拽

拖拽div等盒子模型,都是日常操作没有什么问题,如果是拖拽图片的话,会有一点小坑要踩......

那么我们看代码:

``` var Move_fn = {}; (function(Move_fn){ function Move_img() {
}
Move_img.prototype = {
	constructor:Move_img,
	pageInit: function(imgEle, imgContent) {
		this.Ele = imgEle;
		this.Box = imgContent;
                    imgEle.className = "_positon";//添加定位属性便于计算拖拽位置
		this._mw = imgContent.offsetWidth - imgEle.offsetWidth;
		this._mh = imgContent.offsetHeight - imgEle.offsetHeight;
		this.mouseDown();
		this.closeEvt();
	},
	closeEvt:function() {
		var that = this;
		this.Box.onclick = function(e) {
			e.preventDefault();
			e.stopPropagation();
			if(e.target.tagName == "DIV" || e.srcElement.tagName == "div") {
				Elf.utils.remove(that.Box.parentNode, that.Box.parentNode.parentNode);
			}
		}
	},
	mouseDown: function() {
		var that = this;
		this.Ele.onmousedown = function(e) {
			that.offX = e.offsetX;
			that.offY = e.offsetY;
			that.mouseMove();
		}
	},
	mouseMove: function(){
		var that = this;
		document.onmousemove = function(e) {
			var l = e.clientX - that.offX;
			var t = e.clientY - that.offY;
			//判断边界设置最大最小值
			if(t <= 0) {
				t = 0;
			}
			if(t >= that._mh) {
				t = that._mh;
			}
			if(l <= 0) {
				l = 0;
			}
			if(l >= that._mw) {
				l = that._mw;
			}
			that.Ele.style.top = t + "px";
			that.Ele.style.left = l + "px";
			that.mouseUp();
		}
	},
	mouseUp: function() {
		var that = this;
		document.onmouseup = function(e) {
			document.onmousemove = null;
			document.onmousedown = null;
		}
	}
}
Move_fn.move_img = new Move_img();

}(Move_fn));

<p>使用方式也横简单,Move_fn.move_img.pageInit(imgShow, imgContent);初始化一下就好了。要求imgContent全屏遮盖</p>
<p>现在来说一下,图片拖拽的小坑。当鼠标移动到图片上的时候,会有一个,图片选中可拖拽的状态,这个时候我们执行的是ondragstart、draggable事件,而不是自行添加的onmousemove事件。会造成的后果是什么呢?拖拽后图片卡顿,自行添加的鼠标抬起事件onmouseup失效,当我们的鼠标抬起后依然会执行鼠标移动事件,即鼠标抬起后图片会跟着鼠标跑</p>
![](https://images2018.cnblogs.com/blog/1244681/201809/1244681-20180903161715077-1922354997.png)

<p>解决办法:禁止掉图片自己的拖拽事件<br />
对要拖拽的图片添加几个属性
<ul>
	<li>oncontextmenu:"false"&nbsp;&nbsp;&nbsp;&nbsp;<span>禁止图片右键菜单弹出</span></li>
	<li>onselectstart:"false"&nbsp;&nbsp;&nbsp;&nbsp;<span>禁止图片选中</span></li>
	<li>ondragstart:"false"&nbsp;&nbsp;&nbsp;&nbsp;<span>禁止图片拖拽</span></li>
	<li>draggable:"false"&nbsp;&nbsp;&nbsp;&nbsp;<span>禁止图片拖拽</span></li>
</ul>
</p>
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示