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插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
node操作mysql数据库实例详解
Mar 17 Javascript
vue实现手机号码抽奖上下滚动动画示例
Oct 18 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
Sep 20 Javascript
vue 实现锚点功能操作
Aug 10 Javascript
详解webpack的文件监听实现(热更新)
Sep 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
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js style动态设置table高度
2014/10/21 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
在Python web中实现验证码图片代码分享
2017/11/09 Python
python requests.post带head和body的实例
2019/01/02 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
公司股份合作协议书
2014/12/07 职场文书
优秀团员事迹材料
2014/12/25 职场文书
党员承诺书范文2015
2015/04/27 职场文书
学校通报表扬范文
2015/05/04 职场文书
交通事故案件代理词
2015/05/23 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书