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仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
jcrop基本参数一览
Jul 16 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
jQuery实现网站添加高亮突出显示效果的方法
Jun 26 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
Sep 14 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
javascript中的 object 和 function小结
Aug 14 Javascript
关于ES6的六个小特性(二)
Feb 20 Javascript
微信小程序如何再次获取用户授权的方法
May 10 Javascript
JS实现放烟花效果
Mar 10 Javascript
JS相册图片抖动放大展示效果的示例代码
Jan 29 Javascript
vue的项目如何打包上线
Apr 13 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/11/11 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
django做form表单的数据验证过程详解
2019/07/26 Python
python中def是做什么的
2020/06/10 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
汽车专业人才自我鉴定范文
2013/12/29 职场文书
合作意向协议书范本
2014/03/31 职场文书
路政管理求职信
2014/06/18 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
员工2014年度工作总结
2014/12/09 职场文书
创业计划书之宠物店
2019/09/19 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang