JavaScript实现简单的拖动效果


Posted in Javascript onJuly 02, 2016

拖动是一件非常酷的事情。你点击某个对象,并按住鼠标不放,将鼠标移动到另一个区域,然后释放鼠标按钮将对象放在这里。
下面是一个简单的案例:
HTML部分:注意,拖动元素一定要为绝对定义,即position = absolute;

<div style="position:absolute;height:100px;width:100px;background:red" class="draggable"></div>

<script src="dome.js"></script>

JS部分(dome.js):

var EventUtil = {
  // 获取事件和目标
  getEvent : function (event) {
    return event ? event : window.event;
  },
  getTarget : function (event) {
    return event.target || event.srcElement;
  },
  // 添加监听事件
  addEvent : function (element, type, handler) {
    if (element.addEventListener)
    {
      element.addEventListener(type, handler, false);
    } else if (element.attachEvent)
    {
      element.attachEvent("on" + type, handler);
    }
  },
  // 注销监听事件
  delEvent : function (element, type, handler) {
    if (element.removeEventListener)
    {
      element.removeEventListener(type, handler, false);
    } else if (element.detachEvent)
    {
      element.detachEvent("on" + type, handler);
    }
  }
}
var DragDrop = function () {
  // 判断DOM元素是否正在被拖动的标志
  var dragging = null;
  // DOM元素左上角与鼠标指针的差值
    diffX = 0;
    diffY = 0;
  function handleEvent(event) {
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
    switch (event.type) {
      case "mousedown" : 
      // 判断DOM元素的class中是否含有draggable属性
        if (target.className.indexOf("draggable") > -1) {
          dragging = target;
          diffX = event.clientX - target.offsetLeft;
          diffY = event.clientY - target.offsetTop;
        }
      break;

      case "mousemove" : 
        if (dragging != null) {
          target.style.left = event.clientX - diffX + "px";
          target.style.top = event.clientY - diffY + "px";
        }
      break;

      case "mouseup" :
        dragging = null;
      break;

    }
  }
  return {
    enable : function () {
      EventUtil.addEvent(document, "mousedown", handleEvent);
      EventUtil.addEvent(document, "mousemove", handleEvent);
      EventUtil.addEvent(document, "mouseup", handleEvent);
    },
    disable : function () {
      EventUtil.delEvent(document, "mousedown", handleEvent);
      EventUtil.delEvent(document, "mousemove", handleEvent);
      EventUtil.delEvent(document, "mouseup", handleEvent);
    }
  }
}();
DragDrop.enable();

这里需要讲解的是diffX和diffY,它们表示元素左上角与鼠标指针的差值。
diffX = 鼠标的x坐标 - 元素对象的offsetLeft
diffY = 鼠标的y坐标 - 元素对象的offsetTop

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JavaScript 字符串乘法
Aug 20 Javascript
javascript Deferred和递归次数限制实例
Oct 21 Javascript
JavaScript实现动画打开半透明提示层的方法
Apr 21 Javascript
jQuery旋转插件jqueryrotate用法详解
Oct 13 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
基于openlayers4实现点的扩散效果
Aug 17 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
vue2.0 中使用transition实现动画效果使用心得
Aug 13 Javascript
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
详细分析React 表单与事件
Jul 08 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
Oct 27 Javascript
jQuery插件简单学习实例教程
Jul 01 #Javascript
jquery插件autocomplete用法示例
Jul 01 #Javascript
AngularJS 避繁就简的路由
Jul 01 #Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 #Javascript
AngularJS实现分页显示数据库信息
Jul 01 #Javascript
AngularJS内建服务$location及其功能详解
Jul 01 #Javascript
学习Angularjs分页指令
Jul 01 #Javascript
You might like
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
php字符集转换
2017/01/23 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
详谈javascript异步编程
2016/02/21 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[00:11]战神迅矛
2019/03/06 DOTA
如何在python中使用selenium的示例
2017/12/26 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
计算机相关的自我评价
2014/01/15 职场文书
工地标语大全
2014/06/18 职场文书
五一促销活动总结
2014/07/01 职场文书
员工年终考核评语
2014/12/31 职场文书
史上最牛的辞职信
2015/02/28 职场文书
大学毕业生自我评价
2015/03/02 职场文书
redis 查看所有的key方式
2021/05/07 Redis
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby