如何检测两个div是否触摸/碰撞检测

时间:2018-05-16 19:48:06

标签: javascript html5 css3 collision

我已经在谷歌和这里搜索了这个但是没有找到适合我的问题的答案

(这是一个非常简化的解释) 我有两个div可以由用户移动(使用JavaScript和点击事件)我需要检测两个div是否触摸/在彼此之上,如果他们要触发一个函数,我在这里看到了答案,但他们都使用jQuery,我想使用纯JS

可能有用的东西是两个div都有位置绝对和不同的z-index在css中设置

编辑:为了清理事情,因为我的解释非常差,两个div中的一个是静止的,第二个只能在Y方向上移动但是在Y方向上移动的div是使用案例动画旋转

5 个答案:

答案 0 :(得分:1)

试   Element.getBoundingClientRect() 在div和它们的坐标上你可以collision detection

答案 1 :(得分:1)

可能有更好的方法(这不是非常干)但它应该有效,只需用你的div ID替换“div1”和“div2”:

let div1 = document.getElementById('div1').getBoundingClientRect();
let div1Top = div1.top;
let div1Left = div1.left;
let div1Right = div1.right
let div1Bottom = div1.bottom

let div2 = document.getElementById('div2').getBoundingClientRect();
let div2Top = div1.top;
let div2Left = div1.left;
let div2Right = div1.right
let div2Bottom = div1.bottom

if ((div2Top > div1Top && div2Top < div1Bottom)||(div2Bottom > div1Top && div2Bottom < div1Bottom)) {
  let verticalMatch = true
} else{
  let verticalMatch = false
}

if ((div2Right > div1Left && div2Right < div1Right)||(div2Left < div1Right && div2Left > div1Left)) {
  let horizontalMatch = true
} else {
  let horizontalMatch = false
}

if (horizontalMatch && vertialMatch){
  let intersect = true
} else {
  let intersect = false
}

答案 2 :(得分:0)

您可以使用Anand Thangappan的the process described in this post来获取元素的计算位置。然后,您可以使用getComputedStyle()(documentation here)获取计算出的宽度和高度,并使用简单的不等式检查测试它们是否相交。

编辑:或者,您可以直接读取其位置值,因为您使用的是绝对位置。然后,您可以跳过更复杂的方法来获取元素的计算位置。

答案 3 :(得分:0)

由于您允许用户移动DIV并且它们都是绝对的,因此您必须能够访问DIV的STYLE属性。

获取顶部,左侧,宽度和高度属性。

计算底部和右侧属性。现在你有四个角坐标。

由于它们都是矩形,你可以查看dev A的顶部或底部是否在div B的顶部和底部之间,如果左边或右边是dev B的左边和右边。

关于这一点的一个好处是你只需要检查A - >; B因为在两个测试中都会检测到任何重叠。

这是因为形状的直线性质。如果它们是三角形或五边形,或者它们不是凸形,那将会更复杂。

值得注意的是,如果你正在使用CSS / JS动画,你可能希望扩大“碰撞区域”。如果你有高速移动的物体。否则,项目可能会在检查之间进行。

答案 4 :(得分:0)

这类似于当前的正确答案,但我为解决此问题所做的工作如下。

let d1 = document.getElementById('div1').getBoundingClientRect();
let d2 = document.getElementById('div2').getBoundingClientRect();

function touching(div1,div2){
    let ox = Math.abs(d1.x - d2.x) < (d1.x < d2.x ? d2.width : d1.width);
    let ox = Math.abs(d1.y - d2.y) < (d1.y < d2.y ? d2.height : d1.height);
    return ox && oy;
}

var t = touching(d1,d2) // should return whether they are touching

请注意,此功能无法很好地配合转换。