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

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

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

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

    </div>
</div>
<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>

效果图如下:简单吧。

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

其实这个大家会经常用到,比如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,在平时开发中是不会遇到的。

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

下次会解决 ~ 尽请期待

时间: 2024-10-25 21:58:26

Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理的相关文章

Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理

我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来也不方便.顺便提一下,我们之前加了一个return false;帮我们解决了很多问题,如果去掉这个的话,chrome也会出现一样的问题.那么也就是说这个return false;可以解决chrome ff IE9+ 这些浏览器的问题. 实际上在我们开发中,页面上会有许多的元素组成,不可能就一个div

Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了拖拽的原理

今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript"> window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { v

Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理

原文:Javascript 匀速运动停止条件--逐行分析代码,让你轻松了运动的原理 我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 <style type="text/css"> #div1 { width: 100px; height: 100px; position: absolute; background: red; top: 50px; left: 600px; } #div2 { width: 1px;

Javascript 学习笔记 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解 接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者. #div1 { width: 100px; height: 100px; position: absolute; background: red; top: 50px; left: 0; /*600 初始值*/ } #div2 { width: 1px; height: 300px; position: a

Javascript 拖拽雏形——逐行分析代码,让你轻松了拖拽的原理

拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标.拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位置-物体位置的差值就是那个距离 是吧.那这个斜线就是横线和竖线组成的. 我们距离看下程序怎么做. /*实际上他改的就是某个div 的left top ,那他就动起来了. 那样式中肯定要有绝对定位是吧.*/ <style type="text/css"> #div1 { width

Javascript 链式运动框架——逐行分析代码,让你轻松了运动的原理

所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动.这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascript 代码 function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } funct

Javascript 可同时变大边框等一系列效果运动框架——逐行分析代码,让你轻松了运动的原理

等待已久的可同时变大边框等一系列效果运动框架出炉了,现在还是个初级版本,能满足需求.我们看看是如何实现的. 我们知道在Javascript 中 ‘.’等同于 ‘[]’ 例如: oDiv.style.height=oDiv.style[‘height’] 那么,我们把要运动的属性作为一个参数,传入到之前函数中即可. 透明度呢,需要单独处理,判断下即可. 直接上代码. <style type="text/css"> div { width: 200px; height: 200

Javascript 多物体运动——逐行分析代码,让你轻松了运动的原理

我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; height: 50px; background: red; margin: 10px; } </style> <body> <div></div> <div></div> <div></div> </body>

Javascript 完美运动框架——逐行分析代码,让你轻松了解运动的原理

大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的.实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动. 那这个问题怎么解决呢? 我们先来看看之前的运动框架 function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } function startMov