纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章《JavaScript实现最简单的拖拽效果》,便直接拿来使用(膜拜大神)。但发现这段代码使用前必须设置top和left样式属性,否则拖动时div会有跳动,而且不支持多个div的拖动。于是对代码大概修改了一番,贴在这里,以备后用,希望大神勿怪。
![](/assets/blank.gif)
![](/assets/blank.gif)
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拖拽相关推荐
- 【墙裂推荐】【原生基础版】js原生实现拖拽效果,注意不要忘了div的cursor用grab和grabbing 还是古法炮制、传统工艺的原生代码兼容性最好,推荐
以下方式的劣势就是在放弃拖拽那一刻会触发click事件,通常如果被拖拽元素还有其他点击事件,会重复触发,往往并非业务需求.优势就是-额-貌似这段代码没什么屌优势! <div class='dra ...
- 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
<div class='dragged'></div> //初始化需要拖拽的列initDrags() {var arr = document.querySelectorAll( ...
- html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例 发布时间:2020-10-04 12:47:25 来源:脚本之家 阅读:121 作者:s_psycho 本文实例讲述了JS实现鼠标拖拽盒子移动及右键 ...
- 纯js操作div移动
原文地址为: 纯js操作div移动 <html> <head> <meta http-equiv="Content-Type" content=&qu ...
- html之div拖拽,html5拖拽
html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp 转载于:https://www.cnblogs.com/xiaol ...
- javascript,一幅图让你看懂DIV拖拽
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- html 复选框拖拽多选,js实现鼠标拖拽多选功能
最近做了一个用js实现鼠标拖拽多选的功能,于是整理了一下思路,写了一个小demo: 遮罩出现: 被遮罩盖住的,即为选中的块(背景色为粉色) 下面是具体代码,注释已在文中,与大家交流. 鼠标拖拽多选功能 ...
- html div 可鼠标滚动,js实现鼠标拖拽div左右滑动
本文实例为大家分享了js鼠标拖拽div左右滑动的具体代码,供大家参考,具体内容如下 Title body{ position: relative; margin:0; padding:0; width ...
- js实现可拖拽的div
实现一个div可以被拖拽,代码如下所示: <!DOCTYPE html> <html lang="en"> <head><meta cha ...
- html5 div拖拽插件,div拖拽插件——JQ.MoveBox.js(自制JQ插件)
有一段时间没更新博客了,都不知道忙些什么,学习也没什么进展,惭愧. 这一周空闲的时间学着自己写一下JQ插件. 以前用原生的JS做过类似拖拽div的效果,现在按原思路改做成一个JQ的小插件,当作制作JQ ...
最新文章
- linux查看文件安全权限,Linux系统下如何查看及修改文件读写权限
- HALCON从像素坐标得到世界坐标
- python list除以_扫描器篇(三)之python编写基于字典的网站目录探测脚本
- 中国再生金属行业发展前景及投资策略研究报告2021版
- 【CyberSecurityLearning 36】靶场环境搭建(ubuntu系统安装优化及vulhub安装)
- nand ubi -1 nand基础
- 绝不重新定义继承而来的缺省值参数
- python的进阶之路_Python 从入门到进阶之路(三)
- 设计模式学习笔记——模板(Template)模式
- 【scala】IDEA运行scala程序:Error:scalac: bad option: ‘-make:transitive‘
- AcWing 103. 电影
- Java编写一个小游戏
- js alert追加html,利用JQ来美化Js的alert弹出框
- IFIX组态----安全与权限配置
- Django博客项目实战
- Java程序员怎样考察报表工具的开发效率
- 打印机如何取消打印任务
- zblog火车头采集经验
- 关于Python的 求解答Bunch Pattern
- Windows 程序注册表常用键名——CurrentVersion