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 相关文章推荐
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
Aug 21 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
jQuery实现简易的天天爱消除小游戏
Oct 16 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
Angular2开发——组件规划篇
Mar 28 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 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实现手机归属地查询API接口实现代码
2012/08/27 PHP
php中上传文件的的解决方案
2018/09/25 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
对Python中的@classmethod用法详解
2018/04/21 Python
pycharm安装和首次使用教程
2018/08/27 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
印尼旅游网站:via
2017/11/12 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
企业道德讲堂实施方案
2014/03/19 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书