javascript实现拖放效果


Posted in Javascript onDecember 16, 2015

本文实例为大家分享的是一个拖放的效果,参考的代码,重构以下,加以理解学习。

首先来看效果:

拖动div

javascript实现拖放效果     

拖放状态:未开始 

【程序说明】

拖动原理:其实就是在拖动块上监听mousedown事件,鼠标点击时,通过事件对象获取对应的坐标参数。然后鼠标移动时再监听document上的mousemove事件,获取鼠标的clientX 和clientY坐标然后设置拖动块的left 和 top。

首先是监听mousedown事件

EventUtil.addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));

然后在Start上添加mousemove 和 mouseup 事件
//监听mousemove 和 mouseup事件
EventUtil.addEventHandler(document, "mousemove", this._fM);
EventUtil.addEventHandler(document, "mouseup", this._fS);

鼠标移动时,设置拖动块的left 和 top 属性 :

if(!this.LockX)this.Drag.style.left = iLeft + "px";
 if(!this.LockY)this.Drag.style.top = iTop + "px";

水平和垂直锁定:通过判断LockX 和lockY属性来限制对于的top 和 left 属性即可。

范围限制锁定:通过计算容器的宽高和拖动块的宽高差值来设定最大left值和top值,来限制拖动块的left值和top值会在一定的范围里。

完整DEMO:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>JavaScript拖放效果</title>
 <style type="text/css">
  
 </style>
</head>
<body>
 <div id="drag-wrap" style="height: 300px;margin:10px;border:5px solid #FF8000;background:#8080C0;position: relative;">
   <div class="draggable" id="drag" style="width:100px;height: 100px;position: absolute;top: 100px;left:100px;background:#eee;border:1px solid #aceaac;cursor: move;">拖动div</div>
 </div>
 <input id="idReset" type="button" value="复位" />
 <input id="idLock" type="button" value="锁定全部" />
 <input id="idLockX" type="button" value="锁定水平" />
 <input id="idLockY" type="button" value="锁定垂直" />
 <input id="idLimit" type="button" value="范围锁定" />
 <input id="idLimitOff" type="button" value="取消范围锁定" />
 <br />拖放状态:<span id="idShow">未开始</span>
 <script type="text/javascript">
  /**
   *工具函数
   */
   var isIE = (document.all) ? true : false ;
 
   var $$ = function(id){
    return "string" == typeof id ? document.getElementById(id) : id;
   };
 
   var Class = {
   create: function() {
    return function() { this.initialize.apply(this, arguments); }
   }
  };
 
  var Extend = function(destination,source){
   for(var property in source){
    destination[property] = source[property];
   }
  };
 
  var BindAsEventListener = function(object,func){
   return function(event){
    return func.call(object,event || window.event);
   }
  };
 
  var Bind = function(object,func){
   return function(){
    return func.apply(object,arguments);
   }
  };
 
   /**
   *跨浏览器事件对象
   */
  var EventUtil = {
   //事件注册处理程序
   addEventHandler:function(oTarget,sEventType,fnHandler){
     if(oTarget.addEventListener){
      oTarget.addEventListener(sEventType,fnHandler,false);
     }else if(oTarget.attachEvent){
      oTarget.attachEvent("on"+sEventType,fnHandler);
     }else{
      oTarget["on"+sEventType] = fnHandler;
     }
    },
    //事件移除处理程序
    removeEventHandler:function(oTarget,sEventType,fnHandler){
     if(oTarget.removeEventListener){
      oTarget.removeEventListener(sEventType,fnHandler,false);
     }else if(oTarget.detachEvent){
      oTarget.detachEvent("on"+sEventType,fnHandler);
     }else{
      oTarget["on"+sEventType] = null;
     }
    },
    getEvent:function(event){
     return event ? event : window.event;
    },
    getTarget:function(event){
     return event.target || event.srcElement;
    }
  }; 
 
  /**
   *拖放程序
   */
   var Drag= Class.create();
 
   Drag.prototype = {
    //初始化对象
    initialize:function(drag,options){
     this.Drag = $$(drag);//拖放对象
     this._x = this._y = 0;//记录鼠标相对于拖放对象的位置
     //事件对象(用于绑定移除事件)
     this._fM = BindAsEventListener(this, this.Move);
    this._fS = Bind(this, this.Stop);
    this.Drag.style.position = "absolute";
    this.marginLeft = this.marginTop = 0;//记录margin
    //设置参数
    this.setOptions(options);
    //获取相关参数及类型转换
    this.Limit = !!this.options.Limit;//转换为布尔型
    this.mxLeft = parseInt(this.options.mxLeft);
    this.mxRight = parseInt(this.options.mxRight);
    this.mxTop = parseInt(this.options.mxTop);
    this.mxBottom = parseInt(this.options.mxBottom);
 
    this.Lock = !!this.options.Lock;
    this.LockX = !!this.options.LockX;
    this.LockY = !!this.options.LockY;
 
    this.onStart = this.options.onStart;
    this.onMove = this.options.onMove;
    this.onStop = this.options.onStop;
 
    this._Handle = $$(this.options.Handle) || this.Drag;
    this._mxContainer = $$(this.options.mxContainer) || null;
    //监听拖动对象mousedown事件
    EventUtil.addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));
 
    },
    //准备拖动 
    Start:function(oEvent){
     if(this.Lock){return;}//如果锁定则不执行
     //记录mousedown触发时鼠标相对于拖放对象的位置
     this._x = oEvent.clientX - this.Drag.offsetLeft;
    this._y = oEvent.clientY - this.Drag.offsetTop;
    //监听mousemove 和 mouseup事件
    EventUtil.addEventHandler(document, "mousemove", this._fM);
    EventUtil.addEventHandler(document, "mouseup", this._fS);
    }, 
    //拖动
    Move:function(oEvent){
     //设置移动参数
     var iLeft = oEvent.clientX - this._x , iTop = oEvent.clientY - this._y;
     //设置范围限制
     if(this.Limit){
      //设置范围参数
     var mxLeft = this.mxLeft, mxRight = this.mxRight, mxTop = this.mxTop, mxBottom = this.mxBottom;
     //如果设置了容器,再修正范围参数
     if(!!this._mxContainer){
      mxLeft = Math.max(mxLeft, 0);
      mxTop = Math.max(mxTop, 0);
      mxRight = Math.min(mxRight, this._mxContainer.clientWidth);
      mxBottom = Math.min(mxBottom, this._mxContainer.clientHeight);
     };
     //修正移动参数
     iLeft = Math.max(Math.min(iLeft, mxRight - this.Drag.offsetWidth), mxLeft);
     iTop = Math.max(Math.min(iTop, mxBottom - this.Drag.offsetHeight), mxTop);
     }
     //XY锁定
     if(!this.LockX)this.Drag.style.left = iLeft + "px";
    if(!this.LockY)this.Drag.style.top = iTop + "px";
    //执行附加程序
    this.onMove();
    },
    //停止拖动
    Stop:function(){
    EventUtil.removeEventHandler(document, "mousemove", this._fM);
    EventUtil.removeEventHandler(document, "mouseup", this._fS);
    //执行附加程序
    this.onStop();
    },
    //设置默认参数
    setOptions:function(options){
     this.options = {//默认值
     Handle:   "",//设置触发对象(不设置则使用拖放对象)
     Limit:   false,//是否设置范围限制(为true时下面参数有用,可以是负数)
     mxLeft:   0,//左边限制
     mxRight:  9999,//右边限制
     mxTop:   0,//上边限制
     mxBottom:  9999,//下边限制
     mxContainer: "",//指定限制在容器内
     LockX:   false,//是否锁定水平方向拖放
     LockY:   false,//是否锁定垂直方向拖放
     Lock:   false,//是否锁定
     Transparent: false,//是否透明
     onStart:  function(){},//开始移动时执行
     onMove:   function(){},//移动时执行
     onStop:   function(){}//结束移动时执行
    };
    Extend(this.options, options || {});
    }
   };
 
  //初始化拖动对象
  var drag = new Drag('drag',{mxContainer:'drag-wrap',Limit:true,
    onStart: function(){ $$("idShow").innerHTML = "开始拖放"; },
    onMove: function(){ $$("idShow").innerHTML = "left:"+this.Drag.offsetLeft+";top:"+this.Drag.offsetTop; },
    onStop: function(){ $$("idShow").innerHTML = "结束拖放"; }
    });
  $$("idReset").onclick = function(){
   drag.Limit = true;
   drag.mxLeft = drag.mxTop = 0;
   drag.mxRight = drag.mxBottom = 9999;
   drag.LockX = drag.LockY = drag.Lock = false;
   $$("idShow").innerHTML = "复位";
  }
  $$("idLock").onclick = function(){ drag.Lock = true;$$("idShow").innerHTML = "锁定全部";}
  $$("idLockX").onclick = function(){ drag.LockX = true; $$("idShow").innerHTML = "锁定水平";}
  $$("idLockY").onclick = function(){ drag.LockY = true; $$("idShow").innerHTML = "锁定垂直";}
  $$("idLimit").onclick = function(){  drag.mxRight = drag.mxBottom = 200;drag.Limit = true;$$("idShow").innerHTML = "范围锁定"; }
  $$("idLimitOff").onclick = function(){ drag.Limit = false; $$("idShow").innerHTML = "取消范围锁定";}
 </script>
</body>
</html>

以上就是javascript实现拖放效果的代码,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JavaScript游戏之优化篇
Nov 08 Javascript
基于dom编程中 动态创建与删除元素的使用
Apr 17 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
JavaScript中按位“异或”运算符使用介绍
Mar 14 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
全面了解js中的script标签
Jul 04 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
Dec 06 Javascript
vue学习笔记之slot插槽基本用法实例分析
Feb 01 Javascript
vue递归获取父元素的元素实例
Aug 07 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
Dec 15 #Javascript
Jquery插件easyUi实现表单验证示例
Dec 15 #Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 #Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
Dec 15 #Javascript
jQuery进行组件开发完整实例
Dec 15 #Javascript
JavaScript组件开发完整示例
Dec 15 #Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 #Javascript
You might like
PHP 输出简单动态WAP页面
2009/06/09 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
apache php模块整合操作指南
2012/11/16 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
诉讼代理人授权委托书
2014/04/08 职场文书
社区护士演讲稿
2014/08/27 职场文书
优秀员工自荐书
2015/03/06 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
高一军训口号
2015/12/25 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL