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 卷帘效果实现代码(不同方向)
Feb 05 Javascript
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
Sep 20 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
Jul 13 Javascript
vue如何实现动态加载脚本
Feb 05 Javascript
实例讲解React 组件生命周期
Jul 08 Javascript
Vue实现购物小球抛物线的方法实例
Nov 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 远程关机操作的代码
2008/12/05 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript动态加载三
2012/08/22 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Pytorch之保存读取模型实例
2019/12/30 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
什么是封装
2013/03/26 面试题
圣诞节活动策划方案
2014/06/09 职场文书
银行授权委托书样本
2014/10/13 职场文书
团拜会主持词
2015/07/04 职场文书
学风建设主题班会
2015/08/17 职场文书
小组组名及励志口号
2015/12/24 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle