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 相关文章推荐
创建一个复制UBB软件信息的链接或按钮的js代码
Jan 06 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
PHP+jQuery+Ajax实现多图片上传效果
Mar 14 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
Nov 23 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
Jan 04 Javascript
JavaScript 有用的代码片段和 trick
Feb 22 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
微信小程序 生成携带参数的二维码
Oct 23 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结合表单实现一些简单功能的例子
2011/06/04 PHP
php中对2个数组相加的函数
2011/06/24 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python帮你识破双11的套路
2019/11/11 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
python3访问字典里的值实例方法
2020/11/18 Python
Python中过滤字符串列表的方法
2020/12/22 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
中专生自荐信
2013/10/12 职场文书
食品工程专业求职信
2014/06/15 职场文书
户籍证明格式
2014/09/15 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
个人自荐书范文
2015/03/09 职场文书
金榜题名主持词
2015/07/02 职场文书
MySQL创建管理LIST分区
2022/04/13 MySQL