js判断两个盒子是否重叠的代码
时间: 2023-05-18 19:03:13 浏览: 83
以下是一种判断两个盒子是否重叠的 JavaScript 代码:
function isOverlap(box1, box2) {
var rect1 = box1.getBoundingClientRect();
var rect2 = box2.getBoundingClientRect();
return !(
rect1.bottom < rect2.top ||
rect1.top > rect2.bottom ||
rect1.right < rect2.left ||
rect1.left > rect2.right
);
}
其中,box1 和 box2 是两个 DOM 元素,getBoundingClientRect() 方法可以获取元素的位置和大小信息。函数返回值为 true 表示两个盒子重叠,否则返回 false。
相关问题
使用04-distance-1.html实现一个基于距离的简单碰撞检测。给出代码和效果。
### 回答1:
以下是基于距离的简单碰撞检测的示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的简单碰撞检测</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
// 定义圆形
var circle1 = {
x: 100,
y: 100,
radius: 50,
color: "blue"
};
var circle2 = {
x: 300,
y: 300,
radius: 75,
color: "red"
};
function drawCircle(circle) {
ctx.beginPath();
ctx.arc(circle.x, circle.y, circle.radius, 0, 2 * Math.PI);
ctx.fillStyle = circle.color;
ctx.fill();
}
function detectCollisions(circle1, circle2) {
// 计算两个圆心之间的距离
var distance = Math.sqrt(Math.pow(circle2.x - circle1.x, 2) + Math.pow(circle2.y - circle1.y, 2));
// 如果距离小于等于两个圆的半径之和,则发生碰撞
if (distance <= circle1.radius + circle2.radius) {
return true;
} else {
return false;
}
}
function update() {
// 清除画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制圆形
drawCircle(circle1);
drawCircle(circle2);
// 检测碰撞
if (detectCollisions(circle1, circle2)) {
ctx.fillText("发生碰撞!", 200, 50);
}
// 请求动画帧
requestAnimationFrame(update);
}
// 启动动画
requestAnimationFrame(update);
</script>
</body>
</html>
```
效果如下:
![基于距离的简单碰撞检测示例效果图](https://cdn.jsdelivr.net/gh/YunboCheng/pictures/images/20211214162505.png)
### 回答2:
代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的简单碰撞检测</title>
<style>
#box1 {
width: 50px;
height: 50px;
background-color: red;
position: absolute;
top: 100px;
left: 100px;
}
#box2 {
width: 50px;
height: 50px;
background-color: blue;
position: absolute;
top: 150px;
left: 150px;
}
</style>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
<script>
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
function checkCollision() {
var box1Rect = box1.getBoundingClientRect();
var box2Rect = box2.getBoundingClientRect();
var box1CenterX = box1Rect.left + box1Rect.width / 2;
var box1CenterY = box1Rect.top + box1Rect.height / 2;
var box2CenterX = box2Rect.left + box2Rect.width / 2;
var box2CenterY = box2Rect.top + box2Rect.height / 2;
var distance = Math.sqrt(Math.pow(box2CenterX - box1CenterX, 2) + Math.pow(box2CenterY - box1CenterY, 2));
if (distance < (box1Rect.width / 2 + box2Rect.width / 2)) {
box1.style.backgroundColor = 'green';
box2.style.backgroundColor = 'yellow';
} else {
box1.style.backgroundColor = 'red';
box2.style.backgroundColor = 'blue';
}
}
setInterval(checkCollision, 100);
</script>
</body>
</html>
```
效果:在页面中创建了两个矩形框,一个为红色,一个为蓝色。当两个矩形框位置重叠时,红色的框变为绿色,蓝色的框变为黄色;当两个矩形框位置不重叠时,颜色恢复为原来的颜色。通过计算两个矩形框中心点的距离,当距离小于两个矩形框宽度之和的一半时,认为发生了碰撞。使用setInterval函数每100毫秒调用一次检测碰撞函数。
### 回答3:
要实现一个基于距离的简单碰撞检测,可以使用04-distance-1.html中的代码。以下是一个可能的实现方式:
HTML代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>基于距离的碰撞检测</title>
<style>
#box1, #box2 {
width: 50px;
height: 50px;
background-color: blue;
position: absolute;
}
</style>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
var box1 = $("#box1");
var box2 = $("#box2");
$(document).mousemove(function(event){
// 更新box1的位置
box1.css({
left: event.pageX - box1.width() / 2,
top: event.pageY - box1.height() / 2
});
// 判断box1和box2是否碰撞
var distanceX = Math.abs(box1.offset().left - box2.offset().left);
var distanceY = Math.abs(box1.offset().top - box2.offset().top);
var distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
if (distance <= box1.width() / 2 + box2.width() / 2) {
box2.css("background-color", "red");
} else {
box2.css("background-color", "blue");
}
});
});
</script>
</body>
</html>
```
上述代码中,我们使用两个`div`元素分别表示box1和box2,它们的样式通过CSS进行设置。利用jQuery库,我们可以在文档准备就绪时获取box1和box2的jQuery对象并绑定鼠标移动事件。
在鼠标移动事件处理函数中,我们通过`event.pageX`和`event.pageY`获取鼠标坐标,并将box1定位到鼠标位置。然后,我们计算出box1和box2中心之间的距离,并与两个盒子的半径之和进行比较。如果距离小于等于半径之和,表示box1和box2发生了碰撞,我们将box2的背景颜色设置为红色,否则设置为蓝色。
使用这段代码,当鼠标移动时,box1会跟随鼠标移动,同时检测与box2的碰撞情况并改变box2的背景颜色。
什么是闭包?有什么作用? 什么是跨域?如何解决跨域问题? 什么是原型链?如何理解它? 什么是事件代理?有什么优点? 什么是事件冒泡和捕获?如何阻止它们? 什么是虚拟DOM?和真实DOM有什么区别? 什么是CSS盒子模型?有哪些属性? 什么是CSS选择器?有哪些常用的选择器? 什么是CSS层叠顺序?如何计算它? 什么是CSS预处理器?有哪些常用的预处理器?
1. 什么是闭包?有什么作用?
闭包是指函数能够访问并操作其外部作用域中的变量,即使函数在外部作用域之外被调用。闭包的作用是可以让变量长期驻留在内存中,可以被多个函数共享访问,避免全局变量的污染,以及实现一些特殊的功能,如柯里化、缓存等。
2. 什么是跨域?如何解决跨域问题?
跨域是指浏览器不能直接访问其他域名下的资源。跨域问题可以通过以下方式解决:
- JSONP:利用script标签可以跨域的特点,将需要传递的数据作为参数拼接在URL中,服务器返回一段JavaScript代码,该代码会在客户端执行,从而实现跨域请求。
- CORS:在服务器端设置响应头,允许指定的域名访问该服务器的资源。
- 代理:通过在服务器端设置代理,将跨域请求转发到同源服务器上,然后再将结果返回给客户端。
3. 什么是原型链?如何理解它?
原型链是JavaScript中实现继承的一种机制。每个对象都有一个隐藏的内部属性[[Prototype]],指向它的原型对象。当访问一个对象的属性时,如果该对象本身没有该属性,就会沿着原型链向上查找,直到找到该属性或者查找到原型链的顶端null。
4. 什么是事件代理?有什么优点?
事件代理是指将事件处理程序添加到父元素上,利用事件冒泡机制,处理子元素上的事件。事件代理的优点是可以减少事件处理程序的数量,避免内存泄漏,提高性能和代码的可维护性。
5. 什么是事件冒泡和捕获?如何阻止它们?
事件冒泡是指事件从最具体的元素开始,逐级向父元素传播,直到传播到document对象。事件捕获是指事件从document对象开始,逐级向下传播,直到传播到最具体的元素。可以通过调用事件对象的stopPropagation方法来阻止事件冒泡或者捕获。
6. 什么是虚拟DOM?和真实DOM有什么区别?
虚拟DOM是指用JavaScript对象来描述DOM结构的一种技术。通过比较新旧两个虚拟DOM对象的差异,可以最小化DOM操作,从而提高性能。虚拟DOM和真实DOM的区别在于,虚拟DOM是在JavaScript内存中操作的,而真实DOM是在浏览器中操作的。
7. 什么是CSS盒子模型?有哪些属性?
CSS盒子模型是指将一个元素看做一个矩形盒子,由内容区、内边距、边框和外边距组成。CSS盒子模型的属性有:
- width:盒子的宽度,不包括内边距、边框和外边距。
- height:盒子的高度,不包括内边距、边框和外边距。
- padding:内边距,包括上、右、下、左四个方向。
- border:边框,包括宽度、样式、颜色三个属性。
- margin:外边距,包括上、右、下、左四个方向。
8. 什么是CSS选择器?有哪些常用的选择器?
CSS选择器是用来选择需要样式化的元素的方式。常用的CSS选择器有:
- 标签选择器:根据元素的标签名选择元素。
- 类选择器:根据元素的class属性选择元素。
- ID选择器:根据元素的id属性选择元素。
- 属性选择器:根据元素的属性选择元素。
- 伪类选择器:根据元素的状态选择元素,如:hover、:active等。
- 后代选择器:选择元素的后代元素。
- 子元素选择器:选择元素的直接子元素。
- 相邻兄弟选择器:选择元素的下一个兄弟元素。
9. 什么是CSS层叠顺序?如何计算它?
CSS层叠顺序是指元素在重叠的情况下,哪个元素应该显示在哪个元素的上面。CSS层叠顺序的计算方式是将所有元素分为以下几类,按照顺序比较:
- 背景和边框。
- 元素本身。
- 浮动元素。
- 非定位的块级元素。
- 定位的元素。
10. 什么是CSS预处理器?有哪些常用的预处理器?
CSS预处理器是指在CSS基础之上,增加了一些编程语言的特性,如变量、函数、嵌套等。常用的CSS预处理器有:
- Sass:基于Ruby开发的一种CSS预处理器。
- Less:一种CSS预处理器,使用JavaScript实现。
- Stylus:一种CSS预处理器,使用JavaScript实现。
- PostCSS:一种CSS处理工具,支持插件扩展。
阅读全文