面向对象 + 原生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>

原生js实现拖拽效果的更多相关文章

  1. JS实现拖拽效果

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  2. js 鼠标拖拽效果实现

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. 原生Js实现拖拽(适用于pc和移动端)

    效果: HTML和CSS部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  4. 原生js实现拖拽功能

    1. 给个div,给定一些样式 <div class="drag" style="left:0;top:0;width:100px;height:100px&quo ...

  5. 【转】JS容器拖拽效果,并通过cookie保存拖拽各容器的所在位置

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. JS移动客户端--触屏滑动事件及js手机拖拽效果

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  7. js基础拖拽效果

    function drag(ele) { const config = { mark: 0, x: 0, y: 0, left: ele.offsetLeft, top: ele.offsetTop, ...

  8. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

  9. jQuery的DOM操作实例(2)——拖拽效果&&拓展插件

    一.原生JavaScript编写拖拽效果 二.jQuery编写的拖拽效果 三.在jQuery中拓展一个拖拽插件

随机推荐

  1. 2018-2019-2 20175105王鑫浩《Java程序设计》实验四 《Android开发基础》实验报告

    实验四 <Android开发基础> 实验报告封面 课程:Java程序设计 班级:1751班 姓名:王鑫浩 学号:20175105 指导教师:娄嘉鹏 实验日期:2019年5月17日 实验时间 ...

  2. 2019-2020-1 20175223 《信息安全系统设计基础》MyOD

    目录 一.要求 二.设计流程 1. 需求分析 2. 概要设计 伪代码 3. 详细设计 main.c tans_0x.c tans_pr.c tansp.h 三.编写Makefile,并制作动.静态库 ...

  3. LCA 总结

    代码: //RMQ求LCA struct node { int v, w; }; class LCA { private: vector<int>dep, pos, olx, dis; v ...

  4. jenkins-参数化构建插件:Choice Parameter

    参考: 谢谢大佬的总结: https://www.cnblogs.com/zhaojingyu/p/9862371.html 使用方式 step1: 添加参数,选择Choice Parameter,并 ...

  5. MVC和WebApi 使用get和post 传递参数。 转载https://blog.csdn.net/qq373591361/article/details/51508806

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq373591361/article/details/51508806我们总结一下用js请求服务器的 ...

  6. appium常见问题03_appium脚本报错selenium.common.exceptions.WebDriverException

    运行appium脚本时报错selenium.common.exceptions.WebDriverException...,如下截图: 该报错说明appium和app的内置chrome版本不一致 [解 ...

  7. fpm rpm制作

    使用fpm命令制作rpm包并安装 工作中有如下情况需要将文件打包rpm: 避免重复工作,将源码程序打包为rpm 使用yum发布项目,项目打包为rpm 将自己写好的程序打包为rpm,提供给用户下载 其他 ...

  8. 44-python基础-python3-字符串-常用字符串方法(二)-isalpha()-isalnum()-isdigit()-isspace()-istitle()

    3-isX 字符串方法   序号 方法 条件 返回结果1 返回结果2 1 isalpha() 如果字符串只包含字母,并且非空; True False 2 isalnum() 如果字符串只包含字母和数字 ...

  9. element checkbox 勾选时出现弹框提示。

    复选框选中的时候,必须提示是否确定选中,取消勾选的时候也要. 不能解决的思路: 1.element的checkbox只有一个change事件,该事件只返回该选项最新的值(true,false)(不会返 ...

  10. 对于一键退出APP功能实现的技术探讨

    在Android的开发过程中,会经常存在“一键退出APP”的需求.经过一段时间的整理,其主要实现方式有以下几种. 本质:一键结束当前APP的所有activity&一键结束当前APP进程,两者合 ...