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重写Cognos右键菜单的实现代码
Apr 11 Javascript
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
jQuery中andSelf()方法用法实例
Jan 08 Javascript
Javascript中的高阶函数介绍
Mar 15 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
Jul 11 Javascript
15位和18位身份证JS校验的简单实例
Jul 18 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
JS实现数组的增删改查操作示例
Aug 29 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
ant design 日期格式化的实现
Oct 27 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/09/20 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
python matplotlib中文显示参数设置解析
2017/12/15 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
详解python单元测试框架unittest
2018/07/02 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python实现分段线性插值
2018/12/17 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Python发展史及网络爬虫
2019/06/19 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
教育学专业毕业生的自我评价
2013/11/21 职场文书
党员党性分析材料
2014/02/17 职场文书
工程安全员岗位职责
2014/03/09 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
手机被没收的检讨书
2014/10/04 职场文书
关于工作经历的证明书
2014/10/11 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
升学宴学生答谢词
2015/01/05 职场文书
收入证明怎么写
2015/06/12 职场文书
经典爱情感言
2015/08/03 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
zabbix监控mysql的实例方法
2021/06/02 MySQL
python turtle绘图命令及案例
2021/11/23 Python