jQuery使用drag效果实现自由拖拽div


Posted in Javascript onJune 11, 2015

偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下。

先说一下实现原理及要点,最主要的有三步。第一步是mousedown事件,鼠标mousedown的时候记录此时的鼠标X轴和Y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪。第二步是mousemove事件,此时动态获取鼠标的X轴和Y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果。第三步是mouseup事件,鼠标弹起时给拖拽标记赋值false,拖拽动作完成。

html代码如下:

<div class="divWrap" id="move1" style="width: 200px; height: 200px; background: Green; border: 1px solid red; position: absolute; top: 100px; left: 100px; cursor: move; -moz-user-select: none; -webkit-user-select: none;"></div>
<div class="divWrap" style="width: 200px; height: 200px; background: brown; border: 1px solid red; position: absolute; top: 300px; left: 100px;">
  <h3 id="move2" style="height: 45px; line-height: 45px; font-size: 18px; background: red; margin: 0; cursor: move; -moz-user-select: none; -webkit-user-select: none;">Title--Move</h3>
</div>

js代码如下:

(function($) {
  $.fn.dragDiv = function(divWrap) {
    return this.each(function() {
      var $divMove = $(this);//鼠标可拖拽区域
      var $divWrap = divWrap ? $divMove.parents(divWrap) : $divMove;//整个移动区域
      var mX = 0, mY = 0;//定义鼠标X轴Y轴
      var dX = 0, dY = 0;//定义div左、上位置
      var isDown = false;//mousedown标记
      if(document.attachEvent) {//ie的事件监听,拖拽div时禁止选中内容,firefox与chrome已在css中设置过-moz-user-select: none; -webkit-user-select: none;
        $divMove[0].attachEvent('onselectstart', function() {
          return false;
        });
      }
      $divMove.mousedown(function(event) {
        var event = event || window.event;
        mX = event.clientX;
        mY = event.clientY;
        dX = $divWrap.offset().left;
        dY = $divWrap.offset().top;
        isDown = true;//鼠标拖拽启动
      });
      $(document).mousemove(function(event) {
        var event = event || window.event;
        var x = event.clientX;//鼠标滑动时的X轴
        var y = event.clientY;//鼠标滑动时的Y轴
        if(isDown) {
          $divWrap.css({"left": x - mX + dX, "top": y - mY + dY});//div动态位置赋值
        }
      });
      $divMove.mouseup(function() {
        isDown = false;//鼠标拖拽结束
      });
    });
  };
})(jQuery);
//
$(document).ready(function() {
  $("#move1").dragDiv();//拖拽整个div
  $("#move2").dragDiv(".divWrap");//拖拽div头部
});

最后要说明一下,在开始拖拽动作之前,要禁止选中内容,否则影响拖拽效果。firefox和chrome可以通过css来设置:{-moz-user-select: none; -webkit-user-select: none;},ie本来也可以直接在html里写一个onselectstart="return false",但似乎chrome受了点影响,所以决定取消这个写法,然后在js里为ie浏览器写一个onselectstart事件。

这个小插件只是简单实现拖拽效果,但兼容性很好,里面也用到了一些知识点和技巧。当然也可以借助这个插件或里面的思想继续扩展,写一个比较完善的拖拽插件(如:Draggable和Droppable)。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
Mar 09 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
javascript正则表达式中分组详解
Jul 17 Javascript
AngularJs expression详解及简单示例
Sep 01 Javascript
详解Vue Elememt-UI构建管理后台
Feb 27 Javascript
详解ES6通过WeakMap解决内存泄漏问题
Mar 09 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
js实现点赞按钮功能的实例代码
Mar 06 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 Javascript
javascript 常见功能汇总
Jun 11 #Javascript
简介JavaScript中的setHours()方法的使用
Jun 11 #Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 #Javascript
JQuery遍历DOM节点的方法
Jun 11 #Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 #Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 #Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 #Javascript
You might like
PHP的基本常识小结
2013/07/05 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
微信API接口大全
2015/04/15 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
Javascript 自定义类型方法小结
2010/03/02 Javascript
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
webpack入门必知必会
2017/01/16 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
Python 调用DLL操作抄表机
2009/01/12 Python
Python编程中的反模式实例分析
2014/12/08 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
StringBuilder和String的区别
2015/05/18 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
2014年教师节寄语
2014/04/03 职场文书
生日寄语大全
2014/04/08 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
实例讲解Python中sys.argv[]的用法
2021/06/03 Python