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的一种模块模式
Sep 08 Javascript
javascript淡入淡出效果的实现思路
Mar 31 Javascript
JS对象转换为Jquery对象示例
Jan 26 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
js实现交换运动效果的方法
Apr 10 Javascript
js点击文本框后才加载验证码实例代码
Oct 20 Javascript
Vue防止白屏添加首屏动画的实例
Oct 31 Javascript
vue 自定义组件的写法与用法详解
Mar 04 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
Sep 16 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php显示指定目录下子目录的方法
2015/03/20 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
requireJS使用指南
2016/04/27 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
深入理解Python中的内置常量
2017/05/20 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
Python如何读取、写入JSON数据
2020/07/28 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
班长自荐书范文
2014/02/11 职场文书
学校读书活动总结
2014/06/30 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
监考失职检讨书
2015/01/26 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
安全生产协议书
2016/03/22 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis