纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的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拖拽相关推荐
- 【墙裂推荐】【原生基础版】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 ...
最新文章
- 题解 P4779 【【模板】单源最短路径(标准版)】
- 单词搭配用法查询网站
- java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用
- 2-1:配置与环境之环境
- js 获取当前gmt时间_javascript-如何将日期转换为GMT?
- 小组文化——洗洗睡了的故事
- apue.h头文件内容
- OTC场外交易平台源码/虚拟场外交易源码
- 【人工智能之手写字体识别】机器学习及与智能数据处理之降维算法PCA及其应用手写字体识别
- 3.25期货每日早盘操作建议
- ElementUI、sass、若依后台管理系统踩坑 --> 项目打包后字体图标偶发性乱码
- 【图解数据结构】队列全面总结
- linux i386 4G内存,Ubuntu i386 使用4G内存
- 米尔格拉姆连锁信实验_连锁信:使客户对个性化电子邮件感到满意
- 如何使用WordPress建立亚马逊会员商店
- 耗时3个多月、总结过往5年,马毅曹颖沈向洋撰文智能两大原则
- 通俗理解 什么是量纲
- java php 时间戳转日期_java时间戳转php时间戳
- 从0到1—JAVA大数据架构师之路
- 阿里云上利用virtiope+colinux实现linux系统盘动态无损多分区
热门文章
- Arrays.copyOf
- 转python 发送邮件实例
- phpMyAdmin view_create.php 跨站脚本漏洞
- 使用intellij idea创建JSP和引入Tomecat包
- 设计模式(十): 代理模式
- [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
- BZOJ3711 : [PA2014]Druzyny
- 【有意思的BUG】未名
- 如何把Access中数据导入Mysql中 (转)
- Dev--Config Files