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

 /**
* 纯js实现多div拖拽
* @param bar, 拖拽触柄
* @param target, 可拖动窗口
* @param inWindow, 为true时只能在屏幕范围内拖拽
* @param callback, 拖拽时执行的回调函数。包含两个参数,target的left和top
* @returns {*}
* @private
*/
var startDrag = function(bar, target, /* optional */inWindow, /* optional */callback) {
(function(bar, target, callback) {
var D = document,
DB = document.body,
params = {
left: 0,
top: 0,
currentX: 0,
currentY: 0
};
if(typeof bar == "string") {
bar = D.getElementById(bar);
}
if(typeof target == "string") {
target = D.getElementById(target);
}
bar.style.cursor="move";
bindHandler(bar, "mousedown", function(e) {
e.preventDefault();
params.left = target.offsetLeft;
params.top = target.offsetTop;
if(!e){
e = window.event;
bar.onselectstart = function(){
return false;
}
}
params.currentX = e.clientX;
params.currentY = e.clientY; var stopDrag = function() {
removeHandler(DB, "mousemove", beginDrag);
removeHandler(DB, "mouseup", stopDrag);
}, beginDrag = function(e) {
var evt = e ? e: window.event,
nowX = evt.clientX, nowY = evt.clientY,
disX = nowX - params.currentX, disY = nowY - params.currentY,
left = parseInt(params.left) + disX,
top = parseInt(params.top) + disY;
if(inWindow) {
var maxTop = DB.offsetHeight - target.offsetHeight,
maxLeft = DB.offsetWidth - target.offsetWidth;
if(top < 0) top = 0;
if(top > maxTop) top = maxTop;
if(left < 0) left = 0;
if(left > maxLeft) left = maxLeft;
}
target.style.left = left + "px";
target.style.top = top + "px"; if (typeof callback == "function") {
callback(left, top);
}
}; bindHandler(DB, "mouseup", stopDrag);
bindHandler(DB, "mousemove", beginDrag);
}); function bindHandler(elem, type, handler) {
if (window.addEventListener) {
//false表示在冒泡阶段调用事件处理程序
elem.addEventListener(type, handler, false);
} else if (window.attachEvent) {
// IE浏览器
elem.attachEvent("on" + type, handler);
}
} function removeHandler(elem, type, handler) {
// 标准浏览器
if (window.removeEventListener) {
elem.removeEventListener(type, handler, false);
} else if (window.detachEvent) {
// IE浏览器
elem.detachEvent("on" + type, handler);
}
} })(bar, target, inWindow, callback);
};

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

纯js实现DIV拖拽的更多相关文章

  1. 纯JS实现可拖拽表单

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要用到可拖拽表单,个人要比较喜欢自己动手,不怎么喜欢在不懂实现或者原理的情况下用插件,所以查找资料实现了一个. 思路:放入:用mouse ...

  2. 原生js实现div拖拽+按下鼠标计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...

  3. 原生js实现div拖拽

    十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  4. 运用DIV拖拽实现resize和碰撞检测

    运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...

  5. JS Event 鼠标拖拽事件

    <!DOCTYPE html><html> <head>        <meta charset="UTF-8">         ...

  6. 实现Div拖拽

    直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...

  7. html之div拖拽,html5拖拽

    html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp

  8. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

  9. 案例:简易的Div拖拽

    案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...

随机推荐

  1. 字符、字符集、编码,以及它们python中会遇到的一些问题(下)

    在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇, ...

  2. Dynamic web module 版本之间的区别

    Servlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传Servlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释Servlet ...

  3. JS--微信浏览器复制到剪贴板实现

    由于太忙很久没写博客了,如有错误遗漏,请指出,感谢! 首先这里要注意,是微信浏览器下的解决方案,其他浏览器请自行测试. 先说复制到剪贴板主要有什么使用场景: 优惠券优惠码,需要用户复制 淘宝商品,需要 ...

  4. oracle pl/sql 分页

    一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book, ...

  5. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

  6. 新建maven项目遇到Select an Archetype时没有maven-archetype-webapp处理方法

    [已经有很多博客写过相关的了.详细请去看其他博主的.这里只是记录新建的时候发生的问题给新手提供帮助.因为我跟我的同事都遇到了.因为没记录下来,又花了时间找问题.而网上好像也不多.所以记录下来.希望帮到 ...

  7. UI自动化测试(四)AutoIT工具使用和robot对象模拟键盘按键操作

    AutoIT简介 AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/ ...

  8. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

  9. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

  10. MySQL or MariaDB 错误解决方法之报错代码1045

    phpMyAdmin登录报错:mysqli_real_connect(): (28000/1045): Access denied for user 'root'@'localhost' (using ...