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_11_constructor实现原理
Oct 18 Javascript
jquery重新播放css动画所遇问题解决
Aug 21 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
js改变style样式和css样式的简单实例
Jun 28 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
JS搜狐面试题分析
Dec 16 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
vue之a-table中实现清空选中的数据
Nov 07 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
Nov 10 Javascript
使用pkg打包ThinkJS项目的方法步骤
Dec 30 Javascript
JS新手入门数组处理的实用方法汇总
Apr 07 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
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
基于jquery的$.ajax async使用
2011/10/19 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
vue实现微信分享功能
2018/11/28 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
django实现前后台交互实例
2017/08/07 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
numpy中索引和切片详解
2017/12/15 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
详解Django CAS 解决方案
2019/10/30 Python
Python Json数据文件操作原理解析
2020/05/09 Python
销售心得体会
2014/01/02 职场文书
小学生元旦广播稿
2014/02/21 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
Pandas自定义选项option设置
2021/07/25 Python
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
MySQL 语句执行顺序举例解析
2022/06/05 MySQL
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技