博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
纯js实现DIV拖拽
阅读量:6954 次
发布时间:2019-06-27

本文共 3646 字,大约阅读时间需要 12 分钟。

写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神的一篇文章《》,便直接拿来使用(膜拜大神)。但发现这段代码使用前必须设置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: 019             };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

你可能感兴趣的文章
Content作用
查看>>
安装courier-authlib找不到mysqlclient.so文件
查看>>
第3章 文件操作(2 标准I/O库)
查看>>
java输出九九乘法口诀表
查看>>
WebSocket数据帧和各种操作码
查看>>
window 下cygwin开启了后来又关闭了
查看>>
一:依使初衷
查看>>
Juniper EX系列交换机堆叠配置
查看>>
linux上构建ftp服务器
查看>>
java 集合框架(十)List
查看>>
自学有感
查看>>
js_面向对象
查看>>
第二个冲刺周期第7天
查看>>
Unity3d自定义脚本模板
查看>>
《编写高性能.NET程序-Concurrency in .NET》(1)- 为什么要读这本书?
查看>>
iOS开发线程之NSThread
查看>>
IE浏览器报Promise未定义的错误
查看>>
CSS震动效果
查看>>
webpack开发配置
查看>>
心境 静 净
查看>>