Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)


Posted in Javascript onJanuary 23, 2015

拖拽的原理: 其实就是鼠标与左上角的距离保持不变。我们来看下图, Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)这红点就是鼠标。

拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性。 那这个距离怎么求呢??

鼠标的位置-物体位置的差值就是那个距离 是吧。那这个斜线就是横线和竖线组成的。

Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)

我们距离看下程序怎么做。

<div id="div1">

    </div>

实际上他改的就是某个div 的left top ,那他就动起来了。 那样式中肯定要有绝对定位是吧。

<style type="text/css">
      #div1 {
        width: 200px;
        height: 200px;
        background: red;
        position: absolute;
      }
    </style>

这里有几个步骤,1. 鼠标按下 2. 鼠标抬起来 3. 鼠标移动

<script type="text/javascript">
   window.onload = function() {
    var oDiv = document.getElementById("div1");
    var disX = 0;
    var disY = 0;
    oDiv.onmousedown = function(ev) {
     var oEvent = ev || event; // 浏览器兼容
     disX = oEvent.clientX - oDiv.offsetLeft; // 横向的位置就是鼠标的位置-div的位置
     disY = oEvent.clientY - oDiv.offsetTop;
    };

    oDiv.onmousemove = function(ev) {
      var oEvent = ev || event;
      oDiv.style.left = oEvent.clientX - disX+'px'; // 当前鼠标的位置-disX
      oDiv.style.top = oEvent.clientY - disY+'px';
     };
   };
  </script>

看图说话:

Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)

var oDivLeft = oEvent.clientX - disX; 图表示 很清楚吧

Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)

mouseup 我们先不加看下现在是什么效果。。

Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)

你会发现一个很有意思的现象,我鼠标没有按也会跟着我走, 这是为什么呢???

我们来看看 mousemove: Javascript中没有人规定一定是要鼠标按下才出发是吧,不管你鼠标按不按下去,这个mousemove一直在发生,所以问题就来自于这里。当鼠标还没有按下去之前,这个时候鼠标在上面移动应该是没有反应的,是要按下去才有反应。

所以呢,这个mousemove不应该一上来就添加,而是等到鼠标按下去之后再添加mousemove,来看看修改后的代码。

顺便加上mouseup,这时他的作用就体现出来了 。作用就是oDiv.onmousemove = null; 去掉move事件,

否则当你鼠标抬起来的时候 ,物体还是会跟着你走的。 oDiv.onmouseup = null; 不留垃圾,鼠标抬起本来也就没有用了.

来看看修改后的代码:

<script type="text/javascript">
   window.onload = function() {
    var oDiv = document.getElementById("div1");
    var disX = 0;
    var disY = 0;
    oDiv.onmousedown = function(ev) {
     var oEvent = ev || event; // 浏览器兼容
     disX = oEvent.clientX - oDiv.offsetLeft; // 横向的位置就是鼠标的位置-div的位置
     disY = oEvent.clientY - oDiv.offsetTop;

     oDiv.onmousemove = function(ev) {
      var oEvent = ev || event;
      oDiv.style.left = oEvent.clientX - disX+'px'; // 当前鼠标的位置-disX
      oDiv.style.top = oEvent.clientY - disY+'px';
     };
     oDiv.onmouseup = function() {
      oDiv.onmousemove = null;
      oDiv.onmouseup = null; // 不留垃圾,鼠标抬起本来也就没有用了
     };

    };

   };
  </script>

现在我们就做了一个简单的拖拽出来,当然这还有一些小问题有待我们去解决。

但是无论如何,我们已经具备一个拖拽的雏形。 下期我们会一一解决一些bug。

Javascript 相关文章推荐
js正确获取元素样式详解
Aug 07 Javascript
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
Query中click(),bind(),live(),delegate()的区别
Nov 19 Javascript
href下载文件根据id取url并下载
May 28 Javascript
使用js Math.random()函数生成n到m间的随机数字
Oct 09 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
JavaScript中利用构造器函数模拟类的方法
Feb 16 Javascript
JS+html5制作简单音乐播放器
Sep 13 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
js实现本地时间同步功能
Aug 26 Javascript
JS实现简单的表格增删
Jan 16 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 #Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
jQuery选择器querySelector的使用指南
Jan 23 #Javascript
jQuery中DOM操作实例分析
Jan 23 #Javascript
jquery实现点击页面计算点击次数
Jan 23 #Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 #Javascript
You might like
随机广告显示(PHP函数)
2006/10/09 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
js的一些常用方法小结
2011/06/29 Javascript
js Math 对象的方法
2013/09/01 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
js获取ip和地区
2017/03/10 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
js闭包学习心得总结
2018/04/17 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python tkinter三种布局实例详解
2020/01/06 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
在职研究生自我鉴定
2013/10/16 职场文书
教师应聘个人求职信
2013/12/10 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
新闻发布会主持词
2014/03/28 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
工程承包协议书范本
2014/09/29 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
铁人观后感
2015/06/16 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书