Necesito recuperar la altura visible de un div dentro de un área desplazable. Me considero bastante decente con jQuery, pero esto me está confundiendo por completo.
Digamos que tengo un div rojo dentro de una envoltura negra:
En el gráfico anterior, la función jQuery devolvería 248, la parte visible del div.
Una vez que el usuario se desplaza más allá de la parte superior del div, como en el gráfico anterior, informará 296.
Ahora, una vez que el usuario se haya desplazado más allá del div, volvería a informar 248.
Obviamente, mis números no serán tan consistentes y claros como lo son en esta demostración, o simplemente codificaría esos números.
Tengo un poco de teoría:
- Obtenga la altura de la ventana
- Obtenga la altura del div
- Obtenga el desplazamiento inicial del div desde la parte superior de la ventana
- Obtenga el desplazamiento a medida que el usuario se desplaza.
- Si el desplazamiento es positivo, significa que la parte superior del div aún está visible.
- si es negativo, la parte superior del div ha sido eclipsada por la ventana. En este punto, el div podría estar ocupando toda la altura de la ventana, o la parte inferior del div podría estar mostrando
- Si se muestra la parte inferior del div, calcule el espacio entre él y la parte inferior de la ventana.
Parece bastante simple, pero no puedo entenderlo. Tomaré otro crack mañana por la mañana; Supuse que algunos de ustedes, genios, podrían ayudar.
¡Gracias!
ACTUALIZACIÓN: descubrí esto por mi cuenta, pero parece que una de las respuestas a continuación es más elegante, así que la usaré en su lugar. Para los curiosos, esto es lo que se me ocurrió:
$(document).ready(function() {
var windowHeight = $(window).height();
var overviewHeight = $("#overview").height();
var overviewStaticTop = $("#overview").offset().top;
var overviewScrollTop = overviewStaticTop - $(window).scrollTop();
var overviewStaticBottom = overviewStaticTop + $("#overview").height();
var overviewScrollBottom = windowHeight - (overviewStaticBottom - $(window).scrollTop());
var visibleArea;
if ((overviewHeight + overviewScrollTop) < windowHeight) {
// alert("bottom is showing!");
visibleArea = windowHeight - overviewScrollBottom;
// alert(visibleArea);
} else {
if (overviewScrollTop < 0) {
// alert("is full height");
visibleArea = windowHeight;
// alert(visibleArea);
} else {
// alert("top is showing");
visibleArea = windowHeight - overviewScrollTop;
// alert(visibleArea);
}
}
});