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在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 Javascript
javascript 显示当前系统时间代码
Dec 28 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
javascript三元运算符用法实例
Apr 16 Javascript
window.location.hash知识汇总
Nov 09 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
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中计算时间差的几种方法
2009/12/31 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
对javascript继承的理解
2016/10/11 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
Python检测QQ在线状态的方法
2015/05/09 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
高山背包:High Sierra
2017/11/23 全球购物
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
十八大闭幕感言
2014/01/22 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
迎新晚会主持词
2014/03/24 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
数学教育专业求职信
2014/07/22 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
Python绘画好看的星空图
2022/03/17 Python