运用DIV拖拽实现resize和碰撞检测
运用DIV拖拽实现resize和碰撞检测
Div由拖拽改变大小
当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式

用鼠标拖动右下角的小三角就可以对文本框的大小进行重新设置,于是我们试着在一个div中实现与上述相似的功能
先看布局
<style>
#div1 {
width:10px;
height:10px;
background:red;
position:absolute;
z-index:2;
bottom:0;
right: 0;
cursor: nw-resize;
background: url(images/drag_ico.gif);
}
#div2 {
position: relative;
width: 200px;
height: 150px;
background: #ccc;
}
.box {
position: absolute;
border: 1px dashed #000;
}
</style>
<div id="div2">
<div id="div1"></div>
</div>
用父元素div2代替“文本框”,用div1代替小三角,这里的定位,为后面的js实现方法打下了基础

JS的实现方法
<script>
window.onload = function() {
var oDiv = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');
oDiv.onmousedown = function(ev) {
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;
document.onmousemove = function(ev) {
var oEvent = ev || event;
oDiv2.style.width = oEvent.clientX - disX + oDiv.offsetWidth + 'px';
oDiv2.style.height = oEvent.clientY - disY + oDiv.offsetHeight + 'px';
};
document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};
return false;
};
};
</script>
将小三角移动的x轴和y轴长度反应到其父元素的宽高上面,便得到了这样的效果
在拖动过程中检测两个div是否有重合
布局并不麻烦,两个div,定宽高、背景颜色即可
逆向思维:既然我们要检测div在运动过程中是否重合,那如果知道什么时候不重合,剩下的情况就是重合了,在这里,分析不重合的情况显然比分析重合的情况要容易
如图,当r1<l2, b1<t2, l1>r2, t2>b2,这四个条件只要有任意一个成立,都会导致两个div不重合,这里的t,l,b,r在下面的代码中有详细定义。

<script>
window.onload = function() {
var oDiv = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');
oDiv.onmousedown = function(ev) {
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;
document.onmousemove = function(ev) {
var oEvent = ev || event;
oDiv.style.left = oEvent.clientX - disX + 'px';
oDiv.style.top = oEvent.clientY - disY + 'px';
var l1 = oDiv.offsetLeft;
var r1 = l1 + oDiv.offsetWidth;
var t1 = oDiv.offsetTop;
var b1 = t1 + oDiv.offsetHeight;
var l2 = oDiv2.offsetLeft;
var r2 = l2 + oDiv2.offsetWidth;
var t2 = oDiv2.offsetTop;
var b2 = t2 + oDiv2.offsetHeight;
if (r1 < l2 || l1 > r2 || b1 < t2 || t1 > b2) {
oDiv2.style.backgroundColor = 'yellow';
} else {
// 发生碰撞的时候
oDiv2.style.backgroundColor = 'green';
}
};
document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};
};
};
</script>
运用DIV拖拽实现resize和碰撞检测的更多相关文章
- 实现Div拖拽
直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...
- html之div拖拽,html5拖拽
html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp
- 纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...
- 案例:简易的Div拖拽
案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...
- div拖拽的问题
今天看到一篇写的很好的文章,摘抄如下: 思路 父盒子相对定位,子元素,也就是被拖拽的元素绝对定位 当鼠标在子元素中按下时,绑定鼠标移动事件,根据鼠标位置改变元素位置 设置鼠标当前位置(offsetX, ...
- html --- javascript --- div --- 拖拽方块
当鼠标拖拽的很快时,光标会走出方块,所以把事件注册在了方块的父节点上, 如有疑问请参照:http://blog.csdn.net/a9529lty/article/details/2708171 使用 ...
- 原生js实现div拖拽+按下鼠标计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...
- 原生js实现div拖拽
十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- div拖拽缩放jquery插件编写——带8个控制点
项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...
随机推荐
- IOS开发之xcode 快捷键
IOS开发也有一年多了,发现Xcode快捷键,还不熟,恶补一下.要不然真影响工作效率,呵呵! 1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 C ...
- poj 3680 Intervals(费用流)
http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...
- WebService-06-CXF与Spring集成
前言 自3月份到一家快递公司之后,就极少有时间来写博客了,进去的第一个周末就加班.做公司的开放平台,协助一个小伙伴写WebService接口,用的就是CXF.正好这个东西曾经使用过.如今快7月了,曾经 ...
- Android版xx助手之天天酷跑外挂具体分析
Android版xx助手之天天酷跑外挂具体分析 图/文 莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開 ...
- 达内TTS6.0课件oop_day04
- Canvas路径、描边、填充
<script> var context = document.getElementById('canvas').getContext('2d'); context.font = '48p ...
- js中字符串方法
字符串方法: 1. charAt(索引值)//通过索引值获取字符串中对应的值 例如: var str='sdf123'; alert(str.charAt(0));//结果弹出第一个索引对应的值:s
- WinSock网络编程基础(3)server
上一篇讲的是简单的发送数据的客户端的实现.接下来讲的是如何实现收发数据服务器.这里说的服务器其实就是一个进程,它需要等待任意数量的客户端与之建立起连接,以便响应它们的请求. 服务器必须在已知的名称上监 ...
- USACO Section 5.1 Fencing the Cows(凸包)
裸的凸包..很好写,废话不说,直接贴代码. ----------------------------------------------------------------------------- ...
- leetcode Reverse Integer python
class Solution(object): def reverse(self, x): """ :type x: int :rtype: int "&quo ...