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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
JavaScript笛卡尔积超简单实现算法示例
Jul 30 Javascript
JS中判断字符串存在和非空的方法
Sep 12 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
Sep 25 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 Javascript
微信小程序事件流原理解析
Nov 27 Javascript
node使用async_hooks模块进行请求追踪
Jan 28 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
PHP翻页跳转功能实现方法
2020/11/30 PHP
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
资料员岗位职责
2013/11/17 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
美术专业个人自我评价
2014/01/18 职场文书
小学生评语大全
2014/04/18 职场文书
考研英语复习计划
2015/01/19 职场文书
会计求职自荐信范文
2015/03/04 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
房屋所有权证明
2015/06/19 职场文书
Golang生成Excel文档的方法步骤
2021/06/09 Golang