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 相关文章推荐
IE本地存储userdata的一个bug说明
Jul 01 Javascript
Jquery插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
Nov 17 Javascript
XML、HTML、CSS与JS的区别整理
Feb 18 Javascript
老生常谈js中的MVC
Jul 25 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
动态加载JavaScript文件的3种方式
May 05 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 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
帅气的琦玉老师
2020/03/02 日漫
PHP4中实现动态代理
2006/10/09 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
出售房屋协议书范本
2014/10/06 职场文书
坎儿井导游词
2015/02/09 职场文书
2015个人半年总结范文
2015/03/09 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers