纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的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拖拽的更多相关文章
- 纯JS实现可拖拽表单
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要用到可拖拽表单,个人要比较喜欢自己动手,不怎么喜欢在不懂实现或者原理的情况下用插件,所以查找资料实现了一个. 思路:放入:用mouse ...
- 原生js实现div拖拽+按下鼠标计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...
- 原生js实现div拖拽
十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 运用DIV拖拽实现resize和碰撞检测
运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 实现Div拖拽
直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...
- html之div拖拽,html5拖拽
html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp
- php和js实现文件拖拽上传
Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...
- 案例:简易的Div拖拽
案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...
随机推荐
- Eclipse Oxygen 解决 自动导包的问题
换成了 Eclipse 的Oxygen 版本 , 发现之前好用的自动导包功能不能用了 (Ctrl+Shift+O) 再 网上看资料 上面说 将 In Windows 替换为Editing Java ...
- PHP防SQL注入攻击
PHP防SQL注入攻击 收藏 没有太多的过滤,主要是针对php和mysql的组合. 一般性的防注入,只要使用php的 addslashes 函数就可以了. 以下是一段copy来的代码: PHP代码 $ ...
- webstorm配置scss环境
1.下载 Ruby (安装过程中记得勾选添加到环境变量,安装结束最后可能会弹出一个cmd弹框,可以忽略) 2. cmd安装sass gem install sass 3. cmd检查是否安装 sas ...
- 再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
解释器模式 概念介绍 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 获取元素在页面中的路径 我们都知道获取一个 ...
- 深入理解计算机系统chapter9
从概念上来讲:虚拟存储器被组织为一个存放在磁盘上的N个连续的字节大小的单元组成的数组. 磁盘上数组的内容被缓存到主存中 1. 读写内存的安全性 物理内存本身是不限制访问的,任何地址都可以读写,而操作系 ...
- MyCAT-EYE开源
MyCAT EYE MySQL数据库监控工具,实现了对MySQL节点的管理和监控,可供开发人员和DBA使用.后续版本将整合MyCAT2.0的管理和配置. 演示地址: 开发人员视图:http://120 ...
- hive参数配置
CLI参数 两种修改方式: 1)启动时 hive --hiveconf hive.cli.print.current.db=true 2)修改当前用户home目录下 .hiverc文件,hive c ...
- 基于NIO的Socket通信
一.NIO模式的基本原理: 服务端: 首先,服务端打开一个通道(ServerSocketChannel),并向通道中注册一个通道调度器(Selector):然后向通道调度器注册感兴趣的事件Select ...
- Sum It Up 广搜
Sum It Up Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- [bzoj1059] [ZJOI2007] 矩阵游戏 (二分图匹配)
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选 ...