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 相关文章推荐
动态加载iframe
Jun 16 Javascript
用javascript getComputedStyle获取和设置style的原理
Oct 10 Javascript
浅析JavaScript回调函数应用
May 22 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
Javascript动画效果(1)
Oct 11 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
bootstrap基本配置_动力节点Java学院整理
Jul 14 Javascript
React从react-router路由上做登陆验证控制的方法
May 10 Javascript
layui的table单击行勾选checkbox功能方法
Aug 14 Javascript
详解Axios 如何取消已发送的请求
Oct 20 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
浅谈Python数据类型之间的转换
2016/06/08 Python
python实现八大排序算法(1)
2017/09/14 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Python列表list排列组合操作示例
2018/12/18 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
Python-接口开发入门解析
2019/08/01 Python
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
村官工作鉴定评语
2014/01/27 职场文书
特色冷饮店创业计划书
2014/01/28 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
索桥的故事教学反思
2014/02/06 职场文书
面试感谢信范文
2015/01/22 职场文书
迁徙的鸟观后感
2015/06/09 职场文书