Check collision between certain divs

前端 未结 3 1498
无人及你
无人及你 2021-01-05 04:42

How can I check for collision between certain divs?

At the moment I\'m using getBoundingClientRect(), but it checks for every div:

if (thi         


        
相关标签:
3条回答
  • 2021-01-05 05:14

    You can also use the widely supported getBoundingClientRect() to achieve this.

    Here's the function I developed using the tutorial found at:

    2D collision detection

    // a & b are HTMLElements
    function overlaps(a, b) {
      const rect1 = a.getBoundingClientRect();
      const rect2 = b.getBoundingClientRect();
      const isInHoriztonalBounds =
        rect1.x < rect2.x + rect2.width && rect1.x + rect1.width > rect2.x;
      const isInVerticalBounds =
        rect1.y < rect2.y + rect2.height && rect1.y + rect1.height > rect2.y;
      const isOverlapping = isInHoriztonalBounds && isInVerticalBounds;
      return isOverlapping;
    }
    
    0 讨论(0)
  • 2021-01-05 05:31

    Okay, I ended up using a modified version of this duplicate. The function which does the work is:

    var overlaps = (function () {
        function getPositions( elem ) {
            var pos, width, height;
            pos = $( elem ).position();
            width = $( elem ).width() / 2;
            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] );
        };
    })();
    

    And it is called by using overlaps( div1, div2 ); (returns true or false).

    0 讨论(0)
  • 2021-01-05 05:38

    Pure JavaScript version

    var overlaps = (function () {
        function getPositions( elem ) {
            var width = parseFloat(getComputedStyle(elem, null).width.replace("px", ""));
            var height = parseFloat(getComputedStyle(elem, null).height.replace("px", ""));
            return [ [ elem.offsetLeft, elem.offsetLeft + width ], [ elem.offsetTop, elem.offsetTop + height ] ];
        }
    
        function comparePositions( p1, p2 ) {
            var r1 = p1[0] < p2[0] ? p1 : p2;
            var 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] );
        };
    })();
    
    0 讨论(0)
提交回复
热议问题