面向对象 + 原生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. web测试点

    一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号. 禁止直接输入特殊字符时, ...

  2. List<Map>去重并合并数量

    今天在查询出的sql中,出现了部门名称和部门ID有重合的数据!当然这样在页面上展示也会容易一起误导!查询出的数据结构如下图 希望根据deptid中 >最后一个节点id把deptname 合并成& ...

  3. Vue 创建组件的两种方法

    地址:https://blog.csdn.net/cofecode/article/details/74634301 创建组件的两种方法 1.全局注册 2.局部注册 var child=Vue.ext ...

  4. vue中给请求来的数据List ,添加属性false 后,赋值不上问题解决办法

    data() { return { list:[ // 添加属性fale 后的值 ], // 测试数据 goList:[ { name:'张三', phone:'18621958665' }, { n ...

  5. C#socket客户端自己输入消息发送到服务端通信实现通信

    一,服务端代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  6. VMwareworkstations14 安装arch

    一.CLI安装充光驱启动系统,进入系统后名令提示符为"root@archiso ~ #"1.验证知己的启动方式是UEFI还是BISO,如果没有找到下面的文件就是BIOS的启动方式. ...

  7. CentOS 7.3 环境配置java和tomcat开机启动

    Centos7下添加开机自启动服务和脚本  https://blog.csdn.net/GMingZhou/article/details/78677953 安装部分参考我的博文,仅参考他的开机启动部 ...

  8. mysql中查看所有表、表字段、表注释、字段注释

    查看所有表和表注释 select TABLE_NAME, TABLE_COMMENT from INFORMATION_SCHEMA.Tables where table_schema = '某数据库 ...

  9. go语言从例子开始之Example9.切片

    Slice 是 Go 中一个关键的数据类型,是一个比数组更加强大的序列接口 package main import "fmt" func main() { 不像数组,slice 的 ...

  10. sublime text的快捷键

    Ctrl + Shift + P:调出命令板(Command Palette)Ctrl + `:调出控制台Ctrl + Enter:在当前行下面新增一行然后跳至该行Ctrl + Shift + Ent ...