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 相关文章推荐
一个可以增加和删除行的table并可编辑表格中内容
Jun 16 Javascript
简介JavaScript中的setHours()方法的使用
Jun 11 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
Jan 27 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
Apr 26 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
Jan 05 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 Javascript
JavaScript中的一些隐式转换和总结(推荐)
Dec 22 Javascript
新手入门js闭包学习过程解析
Oct 08 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
如何利用JavaScript编写更好的条件语句详解
Aug 10 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语法(2)
2006/10/09 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
showModelessDialog()使用详解
2006/09/21 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
angular2使用简单介绍
2016/03/01 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Python实现多线程HTTP下载器示例
2017/02/11 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
分析经典Python开发工程师面试题
2019/04/08 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
实习求职信
2013/12/01 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
心理健康日活动总结
2014/05/08 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android