Dando dos elementos HTML abitrarios A y B en el mismo documento, ¿cómo puedo saber cuál está "más cerca" del usuario (es decir, si se superponen, cuál está oscureciendo el otro)?Comparar elementos HTML por índice z real
El W3C CSS Specification describe los contextos de apilamiento, que los motores de representación deben implementar. Sin embargo, no pude encontrar una manera de acceder a esta información en un programa de JavaScript, navegadores cruzados o no. Todo lo que puedo leer es la propiedad css z-index
, que no dice mucho, ya que la mayoría de las veces está configurada en auto
o, incluso cuando se expresa como un valor numérico, no es un indicador confiable de cómo se muestra realmente (si pertenecen a diferentes contextos de statcking, la comparación de los índices z es irrelevante).
Tenga en cuenta que estoy interesado en arbitrarias elementos: si ambos elementos están por debajo del puntero del ratón, sólo uno será considerado "se cernía", para que pueda encontrar fácilmente el más cercano en este caso. Sin embargo, estoy buscando una solución más general, preferiblemente una que no implique volver a implementar el algoritmo de apilamiento que el motor de renderización ya está realizando.
Actualización: quiero aclarar un poco la razón detrás de esta pregunta: Hace poco abordados a question que expone una limitación en arrastrar y soltar mecanismo de jQuery - no se necesita índices de z en cuenta al caer, por lo que si una elemento está oscureciendo a otro, aún puede realizar la operación de caída en el elemento que está "detrás". Mientras que la pregunta vinculada fue respondida para el caso particular de OP, el problema general persiste, y no hay una solución fácil que yo sepa.
alex's answer a continuación es útil, pero no es suficiente para el caso que nos ocupa: cuando se arrastra, el elemento arrastrado en sí mismo (o más precisamente, su ayudante) es el elemento de la cima bajo el cursor del ratón, por lo elementFromPoint
volverá que en lugar de el próximo elemento superior, que realmente necesitamos (solución alternativa:style the cursor por lo que se coloca fuera del ayudante). Las otras estrategias de intersección que emplea jQuery también tienen en cuenta más de un punto, lo que complica la tarea de determinar el elemento superior que intersecta al ayudante de alguna manera. Ser capaz de comparar (u ordenar) los elementos por índice z real haría viable un modo de intersección de "índice z" para el caso general.
Voy a probar su código con más cuidado cuando tenga tiempo, pero a primera vista parece estar bien. Estoy aceptando su respuesta por el momento, ya que es la más completa que tenemos hasta ahora. – mgibsonbr