当前位置: 首页 > 面试题库 >

jQuery / JavaScript冲突检测

楮庆
2023-03-14
问题内容

如何检测两个<div>元素是否发生冲突?

这两个div是简单的彩色框,彼此垂直,因此没有复杂的形状或角度。


问题答案:
var overlaps = (function () {

    function getPositions( elem ) {

        var pos, width, height;

        pos = $( elem ).position();

        width = $( elem ).width();

        height = $( elem ).height();

        return [ [ pos.left, pos.left + width ], [ pos.top, pos.top + height ] ];

    }



    function comparePositions( p1, p2 ) {

        var r1, r2;

        r1 = p1[0] < p2[0] ? p1 : p2;

        r2 = p1[0] < p2[0] ? p2 : p1;

        return r1[1] > r2[0] || r1[0] === r2[0];

    }



    return function ( a, b ) {

        var pos1 = getPositions( a ),

            pos2 = getPositions( b );

        return comparePositions( pos1[0], pos2[0] ) && comparePositions( pos1[1], pos2[1] );

    };

})();



$(function () {

    var area = $( '#area' )[0],

        box = $( '#box0' )[0],

        html;



    html = $( area ).children().not( box ).map( function ( i ) {

        return '<p>Red box + Box ' + ( i + 1 ) + ' = ' + overlaps( box, this ) + '</p>';

    }).get().join( '' );



    $( 'body' ).append( html );

});


body {

    padding: 30px;

    color: #444;

    font-family: Arial, sans-serif;

}



h1 {

    font-size: 24px;

    margin-bottom: 20px;

}



#area {

    border: 2px solid gray;

    width: 500px;

    height: 400px;

    position: relative;

}



#area > div {

    background-color: rgba(122, 122, 122, 0.3);

    position: absolute;

    text-align: center;

    font-size: 50px;

    width: 60px;

    height: 60px;

}



#box0 {

    background-color: rgba(255, 0, 0, 0.5) !important;

    top: 150px;

    left: 150px;

}



#box1 {

    top: 260px;

    left: 50px;

}



#box2 {

    top: 110px;

    left: 160px;

}



#box3 {

    top: 200px;

    left: 200px;

}



#box4 {

    top: 50px;

    left: 400px;

}



p {

    margin: 5px 0;

}


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<h1>Detect overlapping with JavaScript</h1>

<div id="area">

    <div id="box0"></div>

    <div id="box1">1</div>

    <div id="box2">2</div>

    <div id="box3">3</div>

    <div id="box4">4</div>

</div>

一般思路-获得框的偏移量和尺寸,并检查它们是否重叠。

如果要更新,可以使用setInterval

function detectOverlapping() {
    // code that detects if the box overlaps with a moving box
    setInterval(detectOverlapping, 25);
}

detectOverlapping();

另外,请注意,您可以针对特定示例优化功能

  • 因为它们是固定的,所以您不必重复读取框的尺寸(就像我在代码中一样)。您可以在页面加载时读取它们(将其读取到变量中),然后仅读取变量

  • 小盒子的水平位置不会改变(除非用户调整窗口大小)。轿厢的垂直位置不变。因此,这些值也不必重复读取,也可以存储到变量中。

  • 您无需测试小盒子是否始终与所有汽车盒子重叠。您可以-基于其垂直位置-确定当前箱子在哪个车道上,并仅从该车道测试特定的汽车箱子。



 类似资料:
  • 我在做一个小的迷你瓷砖引擎游戏。我目前正致力于实现简单的基于块的碰撞检测,然而我遇到了实际的问题。我已经在谷歌上搜索了几个小时,查看了不同的实现,但似乎无法理解它。我目前的努力(只在玩家向右移动时检测碰撞),大部分工作,但允许玩家通过障碍物的底部。碰撞使用法线映射数组来检测碰撞,映射中的任何值2都是一个实体对象。 我明白了我需要做什么的概念--在我移动我的玩家之前,计算玩家将最终进入哪个单元格。检

  • 我正在尝试为我的大学工作制作一个基于2D平台的游戏(在SFML)。我不是要求任何人为我编写一些代码,但如果有人能提供一些指示,我将非常感激:) 目前我有大约13门课,包括: BaseEntity(大多数游戏对象都是由此派生的) 玩家(继承自BE) 魔法宝石(玩家需要这些来通过关卡晋级) 平台 SolidBlock(从平台继承) 可以说,我已经构建了大部分的游戏“积木”--每个类都有自己的更新函数,

  • 我正在尝试制作一个砖块游戏,在碰撞检测方面遇到了一些问题。如果你曾经玩过撞砖游戏,你知道在划桨时,如果球向左移动,而你击中了顶部的左侧,那么它会继续向右移动。不过,在这种情况下,如果你从右侧击球,那么球就会改变方向。而且如果你在桨的侧面撞击它,它会在Y轴上反弹。由于我不知道如何完成桨叶的顶部,我无法向您展示代码,因为我没有任何代码:)这是我用于侧面的代码: 发生的是,当球从侧面被击中时,它正好穿过

  • 本文向大家介绍jQuery无冲突模式详解,包括了jQuery无冲突模式详解的使用技巧和注意事项,需要的朋友参考一下 解决冲突的方法: 在jQuery中解决冲突的方法是noConflict()方法,这个方法将$标识符的控制权返回给其他JavaScript库 如以下示例中的jQuery代码将在将jQuery加载到页面后立即将其置于无冲突模式,并分配新的变量名称$j以替换$别名,以避免与原型框架冲突。详

  • 我只使用Box2D进行碰撞检测。我的代码与Ray Wenderlich教程中的代码类似。 我遇到了这个方法的问题。由于代码绕过了Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D冲突API提供了一个单位法向量来帮助解决冲突。然而,这个矢量传达的是方向,而不是大小。因此,我无法确定应该将重叠的sprites移动多远。有人知道如何使用Box2D冲突API手动解决重叠问题吗?

  • 我使用下面的类制作了一个项目符号列表和一个精灵列表。如何检测子弹是否与子画面发生碰撞,然后删除该精灵和子弹?