原生js实现拖拽效果
2018-09-03 16:18 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>

<p>解决办法:禁止掉图片自己的拖拽事件<br />
对要拖拽的图片添加几个属性
<ul>
<li>oncontextmenu:"false" <span>禁止图片右键菜单弹出</span></li>
<li>onselectstart:"false" <span>禁止图片选中</span></li>
<li>ondragstart:"false" <span>禁止图片拖拽</span></li>
<li>draggable:"false" <span>禁止图片拖拽</span></li>
</ul>
</p>
作者:KeerDi —— ET.frog
出处:http://www.cnblogs.com/frogblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架