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 相关文章推荐
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
另一个javascript小测验(代码集合)
Jul 27 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
js闭包实现按秒计数
Apr 23 Javascript
JS处理json日期格式化问题
Oct 01 Javascript
jQuery代码实现对话框右上角菜单带关闭×
May 03 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
Jun 30 Javascript
js实现多图左右切换功能
Aug 04 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
Aug 31 Javascript
使用FormData实现上传多个文件
Dec 04 Javascript
JavaScript制作3D旋转相册
Aug 02 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
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python单元测试实例详解
2018/05/25 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
工程专业毕业生自荐信范文
2013/12/25 职场文书
三爱活动实施方案
2014/03/19 职场文书
银行金融服务方案
2014/06/11 职场文书
应用心理学专业求职信
2014/08/04 职场文书
护士求职自荐信范文
2015/03/04 职场文书
教师党员个人自我评价
2015/03/04 职场文书
个人培训总结
2015/03/05 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
Nginx限流和黑名单配置
2022/05/20 Servers