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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
超酷的网页音乐播放器DewPlayer使用方法
Dec 18 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
Apr 24 Javascript
可编辑下拉框的2种实现方式
Jun 13 Javascript
ajax如何实现页面局部跳转与结果返回
Aug 24 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
vue+vux实现移动端文件上传样式
Jul 28 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
Sep 04 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
使用javascript做在线算法编程
May 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
php导入导出excel实例
2013/10/25 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
Ionic快速安装教程
2016/06/03 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
python使用tensorflow深度学习识别验证码
2018/04/03 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python Collatz序列实现过程解析
2019/10/12 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
机械制造毕业生求职信
2014/03/03 职场文书
黄金搭档广告词
2014/03/21 职场文书
法人授权委托书范本
2014/04/04 职场文书
高中生操行评语大全
2014/04/25 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
论群众路线学习笔记
2014/11/06 职场文书
会计主管岗位职责
2015/04/02 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技