原生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中Object和Function的关系的三段简单代码
Jun 27 Javascript
JSON.parse 解析字符串出错的解决方法
Jul 08 Javascript
js的写法基础分析
Jan 17 Javascript
javascript代码加载优化方法
Jan 30 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
Dec 31 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
jquery应用实例分享_实现手风琴特效
Feb 01 jQuery
解决vue2中使用axios http请求出现的问题
Mar 05 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
JavaScript Tab菜单实现过程解析
May 13 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中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Python机器学习之决策树算法
2017/12/22 Python
python中的set实现不重复的排序原理
2018/01/24 Python
python实现两个文件合并功能
2018/04/01 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
PyTorch中permute的用法详解
2019/12/30 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
python自动生成sql语句的脚本
2021/02/24 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
项目资料员岗位职责
2013/12/10 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS