原生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 相关文章推荐
基于JQuery的抓取博客园首页RSS的代码
Dec 01 Javascript
js实时获取系统当前时间实例代码
Jun 28 Javascript
JavaScript异步加载浅析
Dec 28 Javascript
javascript实现的闭包简单实例
Jul 17 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
AngularJs expression详解及简单示例
Sep 01 Javascript
简单模拟node.js中require的加载机制
Oct 27 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 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
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
python中如何使用朴素贝叶斯算法
2017/04/06 Python
浅谈python数据类型及类型转换
2017/12/18 Python
pytorch 求网络模型参数实例
2019/12/30 Python
如何写python的配置文件
2020/06/07 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
公司门卫管理制度
2014/02/01 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
对象析构函数__del__在Python中何时使用
2022/03/22 Python
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers