完美的js div拖拽实例代码


Posted in Javascript onSeptember 24, 2016

本文实例为大家分享了完美的js div拖拽实例代码,供大家参考,具体内容如下

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>拖拽库</title>
<style type="text/css">
div,h2,p{margin:0;padding:0;}
body{font:14px/1.5 arial;}
#box{width:100px;height:100px;background:#fef4eb;padding:5px;margin:50px;border:1px solid #f60;}
#box .title{height:25px;background:#f60;}
#tool{margin-bottom:10px;}
</style>
<script type="text/javascript">
function Drag()
{
 //初始化
 this.initialize.apply(this, arguments)
}
Drag.prototype = {
 //初始化
 initialize : function (drag, options)
 {
 this.drag = this.$(drag);
 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.maxContainer = this.$(this.options.maxContainer);

 this.maxTop = Math.max(this.maxContainer.clientHeight, this.maxContainer.scrollHeight) - this.drag.offsetHeight;
 this.maxLeft = Math.max(this.maxContainer.clientWidth, this.maxContainer.scrollWidth) - this.drag.offsetWidth;

 this.limit = this.options.limit;
 this.lockX = this.options.lockX;
 this.lockY = this.options.lockY;
 this.lock = this.options.lock;

 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.drag.style.top = this.drag.offsetTop + "px";
 this.drag.style.left = this.drag.offsetLeft + "px";
 this.drag.style.position = "absolute";
 this.drag.style.margin = "0"
 },
 startDrag : function (event)
 { 
 var event = event || window.event;

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

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

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

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

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

 if (this.lock) return;

 this.limit && (iTop < 0 && (iTop = 0), iLeft < 0 && (iLeft = 0), iTop > this.maxTop && (iTop = this.maxTop), iLeft > this.maxLeft && (iLeft = this.maxLeft));

 this.lockY || (this.drag.style.top = iTop + "px");
 this.lockX || (this.drag.style.left = iLeft + "px");

 event.preventDefault && event.preventDefault();

 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.drag, //事件对象
  limit:  true, //锁定范围
  lock:  false, //锁定位置
  lockX:  false, //锁定水平位置
  lockY:  false, //锁定垂直位置
  maxContainer: document.documentElement || document.body, //指定限制容器
  onStart: function () {}, //开始时回调函数
  onMove:  function () {}, //拖拽时回调函数
  onStop:  function () {} //停止时回调函数
 };
 for (var p in options) this.options[p] = options[p]
 },
 //获取id
 $ : function (id)
 {
 return typeof id === "string" ? document.getElementById(id) : id
 },
 //添加绑定事件
 addHandler : function (oElement, sEventType, fnHandler)
 {
 return oElement.addEventListener ? oElement.addEventListener(sEventType, fnHandler, false) : oElement.attachEvent("on" + sEventType, fnHandler)
 },
 //删除绑定事件
 removeHandler : function (oElement, sEventType, fnHandler)
 {
 return oElement.removeEventListener ? oElement.removeEventListener(sEventType, fnHandler, false) : oElement.detachEvent("on" + sEventType, fnHandler)
 },
 //绑定事件到对象
 bind : function (object, fnHandler)
 {
 return function ()
 {
  return fnHandler.apply(object, arguments) 
 }
 }
};
 
 
//应用
window.onload = function ()
{
 var oBox = document.getElementById("box"); 
 var oTitle = oBox.getElementsByTagName("h2")[0];
 var oSpan = document.getElementsByTagName("span")[0];
 var oDrag = new Drag(oBox, {handle:oTitle, limit:false});

 var aInput = document.getElementsByTagName("input");

 //锁定范围接口
 aInput[0].onclick = function ()
 {
 oDrag.limit = !oDrag.limit;
 this.value = oDrag.limit ? "取消锁定范围" : "锁定范围"
 };

 //水平锁定接口
 aInput[1].onclick = function ()
 {
 oDrag.lockX = !oDrag.lockX;
 this.value = oDrag.lockX ? "取消水平锁定" : "水平锁定"
 };

 //垂直锁定接口
 aInput[2].onclick = function ()
 {
 oDrag.lockY = !oDrag.lockY;
 this.value = oDrag.lockY ? "取消垂直锁定" : "垂直锁定"
 };

 //锁定位置接口
 aInput[3].onclick = function ()
 {
 oDrag.lock = !oDrag.lock;
 this.value = oDrag.lock ? "取消锁定位置" : "锁定位置"
 };

 //开始拖拽时方法
 oDrag.onStart = function ()
 {
 oSpan.innerHTML = "开始拖拽" 
 };

 //开始拖拽时方法
 oDrag.onMove = function ()
 {
 oSpan.innerHTML = "left:" + this.drag.offsetLeft + ", top:" + this.drag.offsetTop 
 };

 //开始拖拽时方法
 oDrag.onStop = function ()
 {
 oSpan.innerHTML = "结束拖拽" 
 };
};
</script>
</head>
<body>
<div id="tool">
 <input type="button" value="锁定范围" />
  <input type="button" value="水平锁定" />
  <input type="button" value="垂直锁定" />
  <input type="button" value="锁定位置" />
</div>
<p>拖放状态:<span>未开始</span></p>
<div id="box">
 <h2 class="title"></h2>
</div>
</body>
</html>
</td>
  </tr>
 </table>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 限制输入和粘贴(IE,firefox测试通过)
Nov 14 Javascript
Jquery 实现Tab效果 思路是js思路
Mar 02 Javascript
Javascript 中的 &amp;&amp; 和 || 使用小结
Apr 25 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
Dec 22 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
Apr 11 Javascript
JavaScript 和 Java 的区别浅析
Jul 31 Javascript
深入理解Javascript动态方法调用与参数修改的问题
Dec 10 Javascript
Jquery选择器中使用变量实现动态选择例子
Jul 25 Javascript
基于jquery实现图片放大功能
May 07 Javascript
详解cordova打包成webapp的方法
Oct 18 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
JS实现动态生成html table表格的方法分析
Jul 11 Javascript
javascript 解决浏览器不支持的问题
Sep 24 #Javascript
JavaScript生成验证码并实现验证功能
Sep 24 #Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 #Javascript
javascript 分号总结及详细介绍
Sep 24 #Javascript
Bootstrap对话框使用实例讲解
Sep 24 #Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 #Javascript
angular.js之路由的选择方法
Sep 24 #Javascript
You might like
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
10个Python小技巧你值得拥有
2018/09/29 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
教你打造完美的创业计划书
2014/01/06 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
环保标语大全
2014/06/12 职场文书
应届生自荐信
2014/06/30 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
关于教师节的广播稿
2015/08/19 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL