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基础 函数“重载” 详细介绍
Oct 25 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
Apr 21 jQuery
js自定义瀑布流布局插件
May 16 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
May 26 jQuery
Vue一次性简洁明了引入所有公共组件的方法
Nov 28 Javascript
django中使用vue.js的要点总结
Jul 07 Javascript
JavaScript展开操作符(Spread operator)详解
Jul 20 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 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
async和DOM Script文件加载比较
2014/07/20 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
详解webpack分包及异步加载套路
2017/06/29 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python greenlet实现原理和使用示例
2014/09/24 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Python request post上传文件常见要点
2020/11/20 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
事业单位分类改革实施方案
2014/03/21 职场文书
环卫工作汇报材料
2014/10/28 职场文书
红歌会主持词
2015/07/02 职场文书
谢师宴学生致辞
2015/07/27 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python