写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章《JavaScript实现最简单的拖拽效果》,便直接拿来使用(膜拜大神)。但发现这段代码使用前必须设置top和left样式属性,否则拖动时div会有跳动,而且不支持多个div的拖动。于是对代码大概修改了一番,贴在这里,以备后用,希望大神勿怪。

 1 /**
 2  * 纯js实现多div拖拽
 3  * @param bar, 拖拽触柄
 4  * @param target, 可拖动窗口
 5  * @param inWindow, 为true时只能在屏幕范围内拖拽
 6  * @param callback, 拖拽时执行的回调函数。包含两个参数,target的left和top
 7  * @returns {*}
 8  * @private
 9  */
10 var startDrag = function(bar, target, /* optional */inWindow, /* optional */callback) {
11     (function(bar, target, callback) {
12         var D = document,
13             DB = document.body,
14             params = {
15                 left: 0,
16                 top: 0,
17                 currentX: 0,
18                 currentY: 0
19             };
20         if(typeof bar == "string") {
21             bar = D.getElementById(bar);
22         }
23         if(typeof target == "string") {
24             target = D.getElementById(target);
25         }
26         bar.style.cursor="move";
27         bindHandler(bar, "mousedown", function(e) {
28             e.preventDefault();
29             params.left = target.offsetLeft;
30             params.top = target.offsetTop;
31             if(!e){
32                 e = window.event;
33                 bar.onselectstart = function(){
34                     return false;
35                 }
36             }
37             params.currentX = e.clientX;
38             params.currentY = e.clientY;
39
40             var stopDrag = function() {
41                 removeHandler(DB, "mousemove", beginDrag);
42                 removeHandler(DB, "mouseup", stopDrag);
43             }, beginDrag = function(e) {
44                 var evt = e ? e: window.event,
45                     nowX = evt.clientX, nowY = evt.clientY,
46                     disX = nowX - params.currentX, disY = nowY - params.currentY,
47                     left = parseInt(params.left) + disX,
48                     top = parseInt(params.top) + disY;
49                 if(inWindow) {
50                     var maxTop = DB.offsetHeight - target.offsetHeight,
51                         maxLeft = DB.offsetWidth - target.offsetWidth;
52                     if(top < 0) top = 0;
53                     if(top > maxTop) top = maxTop;
54                     if(left < 0) left = 0;
55                     if(left > maxLeft) left = maxLeft;
56                 }
57                 target.style.left = left + "px";
58                 target.style.top = top + "px";
59
60                 if (typeof callback == "function") {
61                     callback(left, top);
62                 }
63             };
64
65             bindHandler(DB, "mouseup", stopDrag);
66             bindHandler(DB, "mousemove", beginDrag);
67         });
68
69         function bindHandler(elem, type, handler) {
70             if (window.addEventListener) {
71                 //false表示在冒泡阶段调用事件处理程序
72                 elem.addEventListener(type, handler, false);
73             } else if (window.attachEvent) {
74                 // IE浏览器
75                 elem.attachEvent("on" + type, handler);
76             }
77         }
78
79         function removeHandler(elem, type, handler) {
80             // 标准浏览器
81             if (window.removeEventListener) {
82                 elem.removeEventListener(type, handler, false);
83             } else if (window.detachEvent) {
84                 // IE浏览器
85                 elem.detachEvent("on" + type, handler);
86             }
87         }
88
89     })(bar, target, inWindow, callback);
90 };

View Code

上边的方法主要接受两个参数:第一个是点击的对象(即点击那里可以实现拖拽,例如弹出层的标题栏),第二个是拖拽的对象(例如一个弹出层)。也就是startDrag(触发拖拽对象,被拖拽对象)。详细使用方法猛戳上边链接查看。

转载于:https://www.cnblogs.com/Ghunter/p/5522043.html

纯js实现DIV拖拽相关推荐

  1. 【墙裂推荐】【原生基础版】js原生实现拖拽效果,注意不要忘了div的cursor用grab和grabbing 还是古法炮制、传统工艺的原生代码兼容性最好,推荐

    以下方式的劣势就是在放弃拖拽那一刻会触发click事件,通常如果被拖拽元素还有其他点击事件,会重复触发,往往并非业务需求.优势就是-额-貌似这段代码没什么屌优势! <div class='dra ...

  2. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)

    <div class='dragged'></div> //初始化需要拖拽的列initDrags() {var arr = document.querySelectorAll( ...

  3. html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...

    JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例 发布时间:2020-10-04 12:47:25 来源:脚本之家 阅读:121 作者:s_psycho 本文实例讲述了JS实现鼠标拖拽盒子移动及右键 ...

  4. 纯js操作div移动

    原文地址为: 纯js操作div移动 <html> <head> <meta http-equiv="Content-Type" content=&qu ...

  5. html之div拖拽,html5拖拽

    html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp 转载于:https://www.cnblogs.com/xiaol ...

  6. javascript,一幅图让你看懂DIV拖拽

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. html 复选框拖拽多选,js实现鼠标拖拽多选功能

    最近做了一个用js实现鼠标拖拽多选的功能,于是整理了一下思路,写了一个小demo: 遮罩出现: 被遮罩盖住的,即为选中的块(背景色为粉色) 下面是具体代码,注释已在文中,与大家交流. 鼠标拖拽多选功能 ...

  8. html div 可鼠标滚动,js实现鼠标拖拽div左右滑动

    本文实例为大家分享了js鼠标拖拽div左右滑动的具体代码,供大家参考,具体内容如下 Title body{ position: relative; margin:0; padding:0; width ...

  9. js实现可拖拽的div

    实现一个div可以被拖拽,代码如下所示: <!DOCTYPE html> <html lang="en"> <head><meta cha ...

  10. html5 div拖拽插件,div拖拽插件——JQ.MoveBox.js(自制JQ插件)

    有一段时间没更新博客了,都不知道忙些什么,学习也没什么进展,惭愧. 这一周空闲的时间学着自己写一下JQ插件. 以前用原生的JS做过类似拖拽div的效果,现在按原思路改做成一个JQ的小插件,当作制作JQ ...

最新文章

  1. linux查看文件安全权限,Linux系统下如何查看及修改文件读写权限
  2. HALCON从像素坐标得到世界坐标
  3. python list除以_扫描器篇(三)之python编写基于字典的网站目录探测脚本
  4. 中国再生金属行业发展前景及投资策略研究报告2021版
  5. 【CyberSecurityLearning 36】靶场环境搭建(ubuntu系统安装优化及vulhub安装)
  6. nand ubi -1 nand基础
  7. 绝不重新定义继承而来的缺省值参数
  8. python的进阶之路_Python 从入门到进阶之路(三)
  9. 设计模式学习笔记——模板(Template)模式
  10. 【scala】IDEA运行scala程序:Error:scalac: bad option: ‘-make:transitive‘
  11. AcWing 103. 电影
  12. Java编写一个小游戏
  13. js alert追加html,利用JQ来美化Js的alert弹出框
  14. IFIX组态----安全与权限配置
  15. Django博客项目实战
  16. Java程序员怎样考察报表工具的开发效率
  17. 打印机如何取消打印任务
  18. zblog火车头采集经验
  19. 关于Python的 求解答Bunch Pattern
  20. Windows 程序注册表常用键名——CurrentVersion

热门文章

  1. hdoj 4940 强连通图
  2. 无刷新上传图片 可以实时预览 选择图片后即自动上传,没有上传按钮
  3. 15-07-22 数据库--存储过程、触发器
  4. poj -- 1042 Gone Fishing(枚举+贪心)
  5. Office编程-RPC服务器不可用
  6. 【性能测试】:操作NMON的shell脚本
  7. 静态,类,实例方法,字典
  8. 织梦cms安装完成后登录后台出现空白。主要原因是php版本的问题
  9. 自写的简单屏蔽特定字符的TextBox和数字TextBox
  10. ckeditor+代码高亮