Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理
今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能
上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级。原理和之前的一样,简单吧。
<div id="div2">
<div id="div1"> </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>
<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,在平时开发中是不会遇到的。
其实在页面上有东西的情况下,这个拖拽会出现什么问题???
下次会解决 ~ 尽请期待
Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理的更多相关文章
- Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理
我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来 ...
- Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了解拖拽的原理
今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript&q ...
- Javascript 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理
看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解 接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者. #div ...
- Javascript 拖拽雏形——逐行分析代码,让你轻松了解拖拽的原理
拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标. 拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位 ...
- Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理
所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...
- Javascript 可同时变大变宽等一系列效果运动框架——逐行分析代码,让你轻松了解运动的原理
等待已久的可变大,变宽 等一系列效果运动框架出炉了,现在还是个初级版本,能满足需求.我们看看是如何实现的. 我们知道在Javascript 中 ‘.’等同于 ‘[]’ 例如: oDiv.style.h ...
- Javascript 运动中Offset的bug——逐行分析代码,让你轻松了解运动的原理
我们先来看看这个bug 是怎么产生的. <style type="text/css"> #div1 { width: 200px; height: 200px; bac ...
- Javascript 多物体运动——逐行分析代码,让你轻松了解运动的原理
我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; heig ...
- Javascript 匀速运动停止条件——逐行分析代码,让你轻松了解运动的原理
我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 <style type="text/css"> #div1 ...
随机推荐
- windows驱动编程(目录)
目录 第一章 入门 配置开发环境 第一个程序 应用程序调用内核函数的流程
- python操作redis-事务
#!/usr/bin/python #!coding: utf-8 import redis import sys if __name__=="__main__": try: co ...
- Python中:self和__init__的含义 + 为何要有self和__init__
Python中:self和__init__的含义 + 为何要有self和__init__ 背景 回复: 我写的一些Python教程,需要的可以看看 中SongShouJiong的提问: Python中 ...
- 学习笔记之--java EE 环境的搭建
一.前期准备.(apache-maven-3.0.5.apache-tomcat-7.0.23-windows-x86.eclipse-jee-kepler-SR1-win32.jdk-7u45-wi ...
- Hadoop 4、Hadoop MapReduce的工作原理
一.MapReduce的概念 MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框就是mapreduce,两者缺一不可,也就是 ...
- ubuntu设置系统时间与网络时间同步和时区
Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC). 系统时间:指当前Linux Kernel中的时间. 硬件时间:主板上有电池供电的时 ...
- Android项目 手机安全卫士(代码最全,注释最详细)之十二 设置中心的界面
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android的Bitmap和BitmapDrawable类解析-android学习之旅(六十)
使用简单图片 使用Drawable对象 bitmap和BitmapDrawable对象 package peng.liu.test; import android.app.Activity; impo ...
- HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)
职务地址:http://acm.hdu.edu.cn/showproblem.php? pid=3081 有一段时间没写最大流的题了,这题建图竟然想了好长时间... 刚開始是按着终于的最大流即是做多轮 ...
- 第九十六题(编写strcpy 函数)
96.08 年中兴校园招聘笔试题 1.编写strcpy 函数 已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 当中st ...