2012-08-22 12 views
35

Ho due elementi div. Ognuno di essi ha una larghezza e un'altezza di 450 px. Come posso verificare se il primo div si sovrappone al secondo div?Come verificare se un elemento si sovrappone ad altri elementi?

Ho provato a usare javascript hittest, ma è un po 'complicato. Dato che sto cercando di scoprire come funziona, vorrei iniziare con un codice più semplice.

Ho scoperto che posso utilizzare .getClientRects per ottenere il limite di un elemento, ma non sono esattamente sicuro di come confrontare i limiti.

Si prega di avvisare!

+2

http://stackoverflow.com/questions/4230029/jquery-javascript-collision-detection si può vedere se questo ti aiuta. – user1071979

+0

Quindi quello che stai chiedendo è che data una serie di rettangoli di delimitazione, come determinare quali si sovrappongono? – Blender

+0

@Blender // esattamente – Moon

risposta

63

qualcosa di simile per rect1 e rect2 recuperate tramite getBoundingClientRect():

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

spiego: se una o più espressioni nel Parenthese sono true, non c'è sovrapposizione. Se tutti sono false, ci deve essere una sovrapposizione.

+1

funziona perfettamente ... e molto più facile rispetto ad altre funzioni hittest su google !!!! – Moon

+0

Abbiamo appena capito che funziona solo se entrambi gli elementi sono attualmente visibili - un vero peccato! – graygilmore

+1

Questo è fantastico, sono stato in grado di sostituire la mia soluzione JQuery (che comportava il bisogno di afferrare la posizione/altezza sinistra e fare matematica) e questo ha aumentato le prestazioni di molto. Grazie @Buu – Johannes

2

element.getBoundingClientRect() è silenzioso nei browser moderni, fornisce un parente legato allo schermo. guardare here Che test se le caselle di delimitazione si sovrappongono, cioè geometria semplice ...

oh scusate ... trovato la tua modifica troppo tardi ...

1

In Internet Explorer precedenti alla versione 8, il restituita TextRectangle oggetto contiene le coordinate nella dimensione fisica dei pixel, mentre dalla versione 8 contiene le coordinate nella dimensione logica dei pixel.

Se è necessario il rettangolo di delimitazione dell'intero elemento, utilizzare il metodo getBoundingClientRect.

12

Ecco qualcosa che ho fatto qualche giorno fa: 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

Inside può essere semplificato in: 'rect1.top <= rect2.bottom && rect1.bottom> = rect2.top && rect1.left <= rect2.right && rect1.right> = rect2.left' –

Problemi correlati