原生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实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
javascript if条件判断方法小结
May 17 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
Angularjs中使用轮播图指令swiper
May 30 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
Aug 25 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
微信小程序实现登录注册功能
Dec 29 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新手上路(四)
2006/10/09 PHP
PHP代码优化的53个细节
2014/03/03 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
js面向对象编程总结
2017/02/16 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
阳光体育活动方案
2014/02/16 职场文书
校本研修个人总结
2015/02/28 职场文书
小学科学课教学反思
2016/02/23 职场文书