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 相关文章推荐
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
jQuery Ajax文件上传(php)
Jun 16 Javascript
js展开闭合效果演示代码
Jul 24 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
Oct 22 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
让mocha支持ES6模块的方法实现
Jan 14 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP中动态显示签名和ip原理
2007/03/28 PHP
php 更新数据库中断的解决方法
2009/06/05 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python中的Descriptor描述符学习教程
2016/06/02 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
学生就业推荐信
2013/11/13 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
奥林匹克的口号
2014/06/13 职场文书
红色旅游心得体会
2014/09/03 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
Python中使用ipython的详细教程
2021/06/22 Python