完美的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 文章截取部分无损html显示实现代码
May 04 Javascript
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 Javascript
jquery自定义滚动条插件示例分享
Feb 21 Javascript
JavaScript数据结构与算法之栈详解
Mar 12 Javascript
jQuery在线选座位插件seat-charts特效代码分享
Aug 27 Javascript
ionic中列表项增加和删除的实现方法
Jan 22 Javascript
浅谈键盘上回车按钮的js触发事件
Feb 13 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 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
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php魔术变量用法实例详解
2014/11/13 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
Vue项目中设置背景图片方法
2018/02/21 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
python 合并文件的具体实例
2013/08/08 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
Django 静态文件配置过程详解
2019/07/23 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python如何快速生成时间戳
2020/07/21 Python
python中操作文件的模块的方法总结
2021/02/04 Python
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
会计毕业生自荐信
2013/11/21 职场文书
安全生产演讲稿
2014/05/09 职场文书
土建技术员岗位职责
2015/04/11 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫