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 相关文章推荐
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
Mar 04 Javascript
JQuery给元素添加/删除节点比如select
Apr 02 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
基于jquery实现三级下拉菜单
May 10 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
js实现密码强度检验
Jan 15 Javascript
jQuery中DOM节点的删除方法总结(超全面)
Jan 22 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
VUE.js实现动态设置输入框disabled属性
Oct 28 Javascript
js实现飞机大战小游戏
Aug 26 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
微信小程序渲染性能调优小结
2019/07/30 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
javascript实现计算器功能
2020/03/30 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
python 性能提升的几种方法
2016/07/15 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
外贸实习生自荐信范文
2013/11/24 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
校园安全教育广播稿
2014/02/17 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
酒店员工培训方案
2014/06/02 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
班主任经验交流心得体会
2015/11/02 职场文书