原生javascript实现拖动元素示例代码


Posted in Javascript onSeptember 01, 2014

本文介绍原生javascript实现元素拖动。

思路:

1.首先改变被拖动元素的布局属性,关键是“position:absolue”;

2.捕捉鼠标事件"mousedown","mousemove","mouseup";

3.当触发"mousedown"时,记录下当前鼠标在元素中的相对位置,_x,_y;

4.紧接着处理"mousemove"事件,通过改变元素的top和left属性来移动元素;

5.当触发"mouseup"时间时,终止拖动。

同时,应考虑代码的封装性和浏览器的兼容性,代码如下:

<!DOCTYPE html> 
<html> 
<head> 
<title>draggable div</title> 
<style type="text/css"> 
body{ 
margin: 0; 
padding: 0; 
background-color: #fff; 
} 

#drag_div{ 
width: 150px; 
height: 150px; 
padding: 10px; 
margin: 10px; 
background-color: #66dd33; 
cursor: move; 
} 
</style> 
</head> 
</html> 
<body> 
<div id="drag_div"></div> 
</body> 
<script type="text/javascript"> 

function Drag () { 
this.initialize.apply(this, arguments); 
} 

Drag.prototype = { 

// 初始化 
initialize : function (element, options) { 

this.element = this.$(element); // 被拖动的对象 
this._x = this._y = 0; // 鼠标在元素中的位置 
this._moveDrag = this.bind(this, this.moveDrag); 
this._stopDrag = this.bind(this, this.stopDrag); 

// 设置参数 
this.setOptions(options); 

// 设置鼠标去“拖”的“柄”对象(注意与被拖动的对象区别) 
this.handle = this.$(this.options.handle); 

// 设置回调函数 
this.onStart = this.options.onStart; 
this.onMove = this.options.onMove; 
this.onStop = this.options.onStop; 

this.handle.style.cursor = "move"; 

this.changeLayout(); 

// 注册开始拖动事件 
this.addHandler(this.handle, "mousedown", this.bind(this, this.startDrag)); 
}, 

// 改变被拖动对象的布局属性 
changeLayout: function () { 
this.element.style.top = this.element.offsetTop + "px"; 
this.element.style.left = this.element.offsetLeft + "px"; 
this.element.style.position = "absolute"; 
this.element.style.margin = "0"; 
}, 

startDrag : function (event) { 
var event = event || window.event; 

this._x = event.clientX - this.element.offsetLeft; 
this._y = event.clientY - this.element.offsetTop; 

this.addHandler(document, "mousemove", this._moveDrag); 
this.addHandler(document, "mouseup", this._stopDrag); 

this.preventDefault(event); 

this.handle.setCapture && this.handle.setCapture(); 

this.onStart(); 
}, 
moveDrag : function (event) { 
var event = this.getEvent(event); 

var iTop = event.clientY - this._y; 
var iLeft = event.clientX - this._x; 

this.element.style.top = iTop + "px"; 
this.element.style.left = iLeft + "px"; 

this.onMove(); 
}, 
stopDrag : function () { 

this.removeHandler(document, "mousemove", this._moveDrag); 
this.removeHandler(document, "mouseup", this._stopDrag); 
this.handle.releaseCapture && this.handle.releaseCapture(); 

this.onStop() 

}, 
setOptions : function (options) { 
this.options = { 
handle: this.element, //事件对象 
onStart : function () {}, // 开始时回调函数 
onMove : function(){}, // 拖拽时回调函数 
onStop : function(){} // 停止时回调函数 
}; 
for(var p in options){ 
this.options[p] = options[p]; 
} 
}, 
$ : function (id) { 
return typeof id === "string" ? document.getElementById(id):id; 
}, 
addHandler : function (element, eventType, handler) { 
if(element.addEventListener){ 
return element.addEventListener(eventType, handler, false); 
}else{ 
return element.attachEvent("on"+eventType, handler); 
} 
}, 
removeHandler : function (element, eventType, handler) { 
if(element.removeEventListener){ 
return element.removeEventListener(eventType, handler, false); 
}else{ 
return element.detachEvent("on" + eventType, handler); 
} 
}, 
getEvent: function (event) { 
return event || window.event; 
}, 
preventDefault: function (event) { 
if(event.preventDefault){ 
event.preventDefault(); 
}else{ 
event.returnValue = false; 
} 
}, 
bind : function (obj, handler) { 
return function () { 
return handler.apply(obj, arguments); 
} 
} 
}; 

window.onload = function () { 
var drag_div = document.getElementById("drag_div"); 

var drag = new Drag(drag_div, {handle: drag_div}); 
} 

</script> 
</html>
Javascript 相关文章推荐
fromCharCode和charCodeAt 方法
Dec 27 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 06 Javascript
javascript排序函数实现数字排序
Jun 26 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
Angular工具方法学习
Dec 26 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
Mar 19 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
使用text方法获取Html元素文本信息示例
Sep 01 #Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 #Javascript
超级好用的jQuery圆角插件 Corner速成
Aug 31 #Javascript
Html5的placeholder属性(IE兼容)实现代码
Aug 30 #Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 #Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 #Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
Aug 30 #Javascript
You might like
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
DOM相关内容速查手册
2007/02/07 Javascript
js function定义函数使用心得
2010/04/15 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
使用angular写一个hello world
2015/01/23 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
Python实现异步IO的示例
2020/11/05 Python
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
写自荐信要注意什么
2013/12/26 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
妇女干部培训方案
2014/05/12 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers