Dato due elementi HTML A e B in abile nello stesso documento, come posso scoprire quale è "più vicino" all'utente (cioè se si sovrappongono, quale oscura l'altro)?Confronta gli elementi HTML con lo z-index effettivo
Il W3C CSS Specification descrive i contesti di impilamento, che devono essere implementati dai motori di rendering conformi. Tuttavia, non sono riuscito a trovare un modo per accedere a queste informazioni in un programma JavaScript, cross-browser o no. Tutto quello che posso leggere è la proprietà css z-index
, che di per sé non dice molto, poiché la maggior parte del tempo è impostata su auto
o, anche se espressa come valore numerico, non è un indicatore affidabile di come viene effettivamente visualizzata (se appartengono a diversi contesti statcking, il confronto tra gli z-index è irrilevante).
Si prega di notare che sono interessato a arbitrario elementi: se entrambi gli elementi sono sotto il puntatore del mouse, solo uno sarà considerato "al passaggio del mouse", quindi posso facilmente trovare quello più vicino in questo caso. Tuttavia, sto cercando una soluzione più generale, preferibilmente una che non implichi la re-implementazione dell'algoritmo di stacking che il motore di rendering sta già eseguendo.
Aggiornamento: vorrei chiarire un po 'la ragione dietro a questa domanda: di recente ho affrontato a question che ha esposto una limitazione nel meccanismo di trascinamento e rilascio di jQuery - non ci vuole z-indici in considerazione quando si cadere, quindi se un l'elemento oscura un altro, può comunque eseguire l'operazione di rilascio nell'elemento "dietro". Mentre la domanda collegata è stata risolta per il caso particolare del PO, il problema generale persiste e non c'è una soluzione facile che io conosca.
alex's answer sotto è utile, ma non sufficiente per il caso in questione: durante il trascinamento, l'elemento trascinato stessa (o più precisamente il suo helper) è l'elemento più in alto sotto il cursore del mouse, quindi elementFromPoint
sarà tornare esso anziché il prossimo elemento, quello di cui abbiamo veramente bisogno (soluzione alternativa:style the cursor quindi è posizionato all'esterno dell'assistente). Le altre strategie di intersezione utilizzate da jQuery tengono conto anche di più di un punto, complicando il compito di determinare l'elemento più in alto che interseca l'helper in qualche modo. Essere in grado di confrontare (o ordinare) gli elementi con lo z-index effettivo renderebbe valida una modalità di intersezione "z-index aware" per il caso generale.
Testerò il tuo codice con più attenzione quando avrò tempo, ma a prima vista sembra soddisfacente. Per ora accetto la tua risposta, poiché è la più completa che abbiamo finora. – mgibsonbr