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中获取元素的几种方式小结
Jul 05 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
前端轻量级MVC框架CanJS详解
Sep 26 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
Jan 04 Javascript
JavaScript 基础函数_深入剖析变量和作用域
May 18 Javascript
Javascript自定义事件详解
Jan 13 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 Javascript
Vue数据监听方法watch的使用
Mar 28 Javascript
vue addRoutes路由动态加载操作
Aug 04 Javascript
vue修饰符.capture和.self的区别
Apr 22 Vue.js
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批量检测并去除文件BOM头代码实例
2014/05/08 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python线程池的实现实例
2013/11/18 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python使用minidom读写xml的方法
2015/06/03 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
把pandas转换int型为str型的方法
2019/01/29 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
golang/python实现归并排序实例代码
2020/08/30 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
致200米运动员广播稿
2014/02/06 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
环保倡议书范文
2014/05/12 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA
JS高级程序设计之class继承重点详解
2022/07/07 Javascript