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 相关文章推荐
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
javascript实用小函数使用介绍
Nov 11 Javascript
浅谈 javascript 事件处理
Jan 04 Javascript
JavaScript encodeURI 和encodeURIComponent
Dec 04 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
Aug 04 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 Javascript
JS实现使用POST方式发送请求
Aug 30 Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 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 读取文件乱码问题
2010/02/20 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
js对象的比较
2011/02/26 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python中for语句简单遍历数据的方法
2015/05/07 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python中实现switch功能实例解析
2018/01/11 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
商场中秋节活动方案
2014/02/07 职场文书
师范大学生求职信
2014/06/13 职场文书
本科生自荐信
2014/06/18 职场文书
应届大专生求职信
2014/06/26 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
市场督导岗位职责
2015/04/10 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
教师读书笔记
2015/06/29 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫