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 相关文章推荐
自己的js工具 Cookie 封装
Aug 21 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
May 27 Javascript
node.js解决获取图片真实文件类型的问题
Dec 20 Javascript
JavaScript实现仿网易通行证表单验证
May 25 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
javascript实现简单的on事件绑定
Aug 23 Javascript
微信小程序开发实战教程之手势解锁
Nov 18 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
Jun 15 Javascript
Vue使用axios出现options请求方法
May 30 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 Javascript
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
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天
2008/06/15 PHP
PHP6 先修班 JSON实例代码
2008/08/23 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP代码加密的方法总结
2020/03/13 PHP
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
使用python实现生成用户信息
2017/03/20 Python
Python中表示字符串的三种方法
2017/09/06 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Order by的几种用法
2013/06/16 面试题
全民健身日活动方案
2014/01/29 职场文书
小学清明节活动方案
2014/03/08 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
检讨书大全
2015/01/27 职场文书
第一节英语课开场白
2015/06/01 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
MySQL RC事务隔离的实现
2022/03/31 MySQL