Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)


Posted in Javascript onJanuary 23, 2015

今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能

上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级。原理和之前的一样,简单吧。

html代码:

<div id="div2">
      <div id="div1">

      </div>
    </div>

css代码:

<style type="text/css">
      #div1 {
        width: 100px;
        height: 100px;
        background: red;
        position: absolute;
      }
      #div2 {
        width: 400px;
        height: 300px;
        background: #CCCCCC;
        position: relative;
      }
    </style>

javascript代码:

<script type="text/javascript">
       // 拖拽空div 低版本的火狐有bug
      window.onload = function() {
        var oDiv = document.getElementById("div1");
        var oDiv2 = document.getElementById("div2");
        var disX = 0;
        var disY = 0;
        oDiv.onmousedown = function(ev) {
          var oEvent = ev || event;
          disX = oEvent.clientX - oDiv.offsetLeft;
          disY = oEvent.clientY - oDiv.offsetTop;

          document.onmousemove = function(ev) {
            var oEvent = ev || event;
            // 存储div当前的位置
            var oDivLeft = oEvent.clientX - disX;
            var oDivTop = oEvent.clientY - disY;

            if (oDivLeft < 0) {
              oDivLeft = 0;
            } else if (oDivLeft > oDiv2.offsetWidth - oDiv.offsetWidth) {
              oDivLeft = oDiv2.offsetWidth - oDiv.offsetWidth;
            }

            if (oDivTop < 0) {
              oDivTop = 0;
            } else if (oDivTop > oDiv2.offsetHeight - oDiv.offsetHeight) {
              oDivTop = oDiv2.offsetHeight - oDiv.offsetHeight;
            }

            oDiv.style.left = oDivLeft + 'px';
            oDiv.style.top = oDivTop + 'px';
          };

          document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
          };
          return false; // 阻止默认事件,解决火狐的bug
        };
      };
    </script>

效果图如下:

Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)

简单吧。

接下来就是如何让他自动吸附。

其实这个大家会经常用到,比如ps里面有个小窗拖着拖着到页面边上的时候,他就会自动吸附上去。

我们这个拖拽怎么才能有这样的功能呢?

这其实之前将运动的时候提到过,就好比打车你不可能分毫不差的让司机停在那里,他肯定是停在靠近目的地的地方。

那程序也是一样的,差不多快到了就直接赋值即可。假设我拖拽的物体离左边50px的时候,我就认为他到了左边,那直接赋值为0,他就会自动吸附上去。

原理很简单,看看代码如何实现的吧。稍作修改即可

<script type="text/javascript">
      window.onload = function() {
        var oDiv = document.getElementById("div1");
        var oDiv2 = document.getElementById("div2");
        var disX = 0;
        var disY = 0;
        oDiv.onmousedown = function(ev) {
          var oEvent = ev || event;
          disX = oEvent.clientX - oDiv.offsetLeft;
          disY = oEvent.clientY - oDiv.offsetTop;

          document.onmousemove = function(ev) {
            var oEvent = ev || event;
            var oDivLeft = oEvent.clientX - disX;
            var oDivTop = oEvent.clientY - disY;


            // 当left 小于50 就自动归0 这样实现吸附
            if (oDivLeft < 50) {
              oDivLeft = 0;
            } else if (oDivLeft > oDiv2.offsetWidth - oDiv.offsetWidth) {
              oDivLeft = oDiv2.offsetWidth - oDiv.offsetWidth;
            }

            if (oDivTop < 0) {
              oDivTop = 0;
            } else if (oDivTop > oDiv2.offsetHeight - oDiv.offsetHeight) {
              oDivTop = oDiv2.offsetHeight - oDiv.offsetHeight;
            }

            oDiv.style.left = oDivLeft + 'px';
            oDiv.style.top = oDivTop + 'px';
          };

          document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
          };
          return false; 
        };
      };
    </script>

下一次会讲到高级应用,这些会更加的负责更加的有用。已完善我们的拖拽功能。

比如说图片的拖拽和文字的选中。比如说我们现在的这个拖拽页面上就只有一个div,在平时开发中是不会遇到的。

其实在页面上有东西的情况下,这个拖拽会出现什么问题???

下次会解决 ~ 尽请期待

Javascript 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
JavaScript的类型简单说明
Sep 03 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
JavaScript优化专题之Loading and Execution加载和运行
Jan 20 Javascript
深入学习js瀑布流布局
Oct 14 Javascript
JS实现字符串去重及数组去重的方法示例
Apr 21 Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 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
PHP实现的各种中文编码转换类分享
Jan 23 #Javascript
You might like
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
实现python版本的按任意键继续/退出
2016/09/26 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
python实现小球弹跳效果
2019/05/10 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
教育教学读书笔记
2015/07/02 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书