原生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 相关文章推荐
javascript+css 网页每次加载不同样式的实现方法
Dec 27 Javascript
非阻塞动态加载javascript广告实现代码
Nov 17 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
20个实用的JavaScript技巧分享
Nov 28 Javascript
javascript背景时钟实现方法
Jun 18 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
Oct 24 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
简述jQuery Easyui一些用法
Aug 01 jQuery
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
使用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
星际争霸中的热键
2020/03/04 星际争霸
php数组总结篇(一)
2008/09/30 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
php删除指定目录的方法
2015/04/03 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
怎么判断js脚本加载完成
2014/02/28 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
python3抓取中文网页的方法
2015/07/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
最新英语专业学生求职信范文
2013/09/21 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
外贸专业求职信
2014/03/09 职场文书
建议书标准格式
2014/03/12 职场文书
团拜会策划方案
2014/06/07 职场文书
工作简报范文
2015/07/21 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL