2012-08-22 26 views
35

Tengo dos elementos div. Cada uno de ellos tiene 450px de ancho y alto. ¿Cómo puedo verificar si el primer div se superpone al segundo div?¿Cómo comprobar si un elemento se superpone a otros elementos?

He intentado usar javascript hittest, pero es un poco complicado. Como estoy tratando de descubrir cómo funciona realmente, me gustaría comenzar con un código más simple.

Descubrí que puedo usar .getClientRects para obtener el límite de un elemento, pero no estoy muy seguro de cómo comparar los límites.

Por favor, ¡avísenme!

+2

http://stackoverflow.com/questions/4230029/jquery-javascript-collision-detection puede ver si esto te ayuda. – user1071979

+0

Entonces, lo que está preguntando es que dado un conjunto de rectángulos delimitadores, ¿cómo se determina cuáles se superponen? – Blender

+0

@Blender // exactamente – Moon

Respuesta

63

Algo como esto para rect1 y rect2 recuperado a través de getBoundingClientRect():

var overlap = !(rect1.right < rect2.left || 
       rect1.left > rect2.right || 
       rect1.bottom < rect2.top || 
       rect1.top > rect2.bottom) 

Explicar: si una o más expresiones en el paréntesis que son true, no hay solapamiento. Si todos son false, debe haber una superposición.

+1

funciona a la perfección ... y es mucho más fácil que otras funciones de prueba en Google !!!! – Moon

+0

Acabo de descubrir que esto solo funciona si ambos elementos están actualmente visibles, ¡una pena! – graygilmore

+1

Esto es increíble, pude reemplazar mi solución JQuery (que implicaba tener que agarrar la posición/altura izquierda y hacer las matemáticas) con esto y aumentó mucho el rendimiento. Gracias @Buu – Johannes

2

element.getBoundingClientRect() es muy bueno en los navegadores modernos, ofrece un límite en relación con la pantalla. mirar here que la prueba si las dimensiones de las cajas se superponen, es decir geometría simple ...

oh ... discúlpame encontrado su edición demasiado tarde ...

1

En Internet Explorer anterior a la versión 8, la devolvió TextRectangle objeto contiene las coordenadas en tamaño de píxel físico, mientras que a partir de la versión 8, contiene las coordenadas en tamaño de píxel lógico.

Si necesita el rectángulo delimitador de todo el elemento, utilice el método getBoundingClientRect.

12

Aquí hay algo que hice hace algunos días: https://gist.github.com/yckart/7177551

var AABB = { 
    collide: function (el1, el2) { 
    var rect1 = el1.getBoundingClientRect(); 
    var rect2 = el2.getBoundingClientRect(); 

    return !(
     rect1.top > rect2.bottom || 
     rect1.right < rect2.left || 
     rect1.bottom < rect2.top || 
     rect1.left > rect2.right 
    ); 
    }, 

    inside: function (el1, el2) { 
    var rect1 = el1.getBoundingClientRect(); 
    var rect2 = el2.getBoundingClientRect(); 

    return (
     ((rect2.top <= rect1.top) && (rect1.top <= rect2.bottom)) && 
     ((rect2.top <= rect1.bottom) && (rect1.bottom <= rect2.bottom)) && 
     ((rect2.left <= rect1.left) && (rect1.left <= rect2.right)) && 
     ((rect2.left <= rect1.right) && (rect1.right <= rect2.right)) 
    ); 
    } 
}; 
+1

El interior se puede simplificar a: 'rect1.top <= rect2.bottom && rect1.bottom> = rect2.top && rect1.left <= rect2.right && rect1.right> = rect2.left' –

Cuestiones relacionadas