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 相关文章推荐
JS 判断undefined的实现代码
Nov 26 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
Feb 03 Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
vue.js选中动态绑定的radio的指定项
Jun 02 Javascript
解决vue router使用 history 模式刷新后404问题
Jul 19 Javascript
js模块加载方式浅析
Aug 12 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
浅谈Angular单元测试总结
Mar 22 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 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
MySQL数据源表结构图示
2008/06/05 PHP
php include,include_once,require,require_once
2008/09/05 PHP
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
动态加载jquery库的方法
2014/02/12 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
vue多级多选菜单组件开发
2020/09/08 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python函数的5种参数详解
2017/02/24 Python
python树莓派红外反射传感器
2019/01/21 Python
对python 自定义协议的方法详解
2019/02/13 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
生物制药自我鉴定
2014/01/25 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
安全教育第一课观后感
2015/06/17 职场文书
小学科学课教学反思
2016/02/23 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
为Centos安装指定版本的Docker
2022/04/01 Servers
ORACLE中dbms_output.put_line输出问题的解决过程
2022/06/28 Oracle