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 相关文章推荐
表单(FORM)的一些实用效果代码
Mar 25 Javascript
给moz-firefox下添加IE方法和属性
Apr 10 Javascript
基于jquery的让textarea自适应高度的插件
Aug 03 Javascript
javascript表单验证大全
Aug 12 Javascript
jquery实现简单的遮罩层
Jan 08 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
js禁止表单重复提交
Aug 29 Javascript
详解vue的diff算法原理
May 20 Javascript
Angular封装搜索框组件操作示例
Apr 25 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之sprintf函数用法详解
2014/11/12 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
three.js实现圆柱体
2018/12/30 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
python 读取修改pcap包的例子
2019/07/23 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
12岁生日感言
2014/01/21 职场文书
残疾人小组计划书
2014/04/27 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
工作表扬信范文
2015/01/17 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
2016新年致辞
2015/08/01 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
2016年母亲节广告语
2016/01/28 职场文书
初中生物教学反思
2016/02/20 职场文书