写代码的时候遇到需要对绝对布局的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. 题解 P4779 【【模板】单源最短路径(标准版)】
  2. 单词搭配用法查询网站
  3. java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用
  4. 2-1:配置与环境之环境
  5. js 获取当前gmt时间_javascript-如何将日期转换为GMT?
  6. 小组文化——洗洗睡了的故事
  7. apue.h头文件内容
  8. OTC场外交易平台源码/虚拟场外交易源码
  9. 【人工智能之手写字体识别】机器学习及与智能数据处理之降维算法PCA及其应用手写字体识别
  10. 3.25期货每日早盘操作建议
  11. ElementUI、sass、若依后台管理系统踩坑 --> 项目打包后字体图标偶发性乱码
  12. 【图解数据结构】队列全面总结
  13. linux i386 4G内存,Ubuntu i386 使用4G内存
  14. 米尔格拉姆连锁信实验_连锁信:使客户对个性化电子邮件感到满意
  15. 如何使用WordPress建立亚马逊会员商店
  16. 耗时3个多月、总结过往5年,马毅曹颖沈向洋撰文智能两大原则
  17. 通俗理解 什么是量纲
  18. java php 时间戳转日期_java时间戳转php时间戳
  19. 从0到1—JAVA大数据架构师之路
  20. 阿里云上利用virtiope+colinux实现linux系统盘动态无损多分区

热门文章

  1. Arrays.copyOf
  2. 转python 发送邮件实例
  3. phpMyAdmin view_create.php 跨站脚本漏洞
  4. 使用intellij idea创建JSP和引入Tomecat包
  5. 设计模式(十): 代理模式
  6. [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
  7. BZOJ3711 : [PA2014]Druzyny
  8. 【有意思的BUG】未名
  9. 如何把Access中数据导入Mysql中 (转)
  10. Dev--Config Files