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 相关文章推荐
jQuery实现统计复选框选中数量
Nov 24 Javascript
jquery+css实现的红色线条横向二级菜单效果
Aug 22 Javascript
详解maxlength属性在textarea里奇怪的表现
Dec 27 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
js实现延迟加载的几种方法
Apr 24 Javascript
Vue异步组件处理路由组件加载状态的解决方案
Sep 07 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
Angular6新特性之Angular Material
Dec 28 Javascript
Vue组件间的通信pubsub-js实现步骤解析
Mar 11 Javascript
解决Antd Table组件表头不对齐的问题
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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php中文字母数字验证码实现代码
2008/04/25 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python实现简易Web爬虫详解
2018/01/03 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
python生成word合同的实例方法
2021/01/12 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
竞职演讲稿范文
2014/01/11 职场文书
12岁生日感言
2014/01/21 职场文书
闭幕式主持词
2014/04/02 职场文书
优秀求职信
2014/05/29 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书