Devo recuperare l'altezza visibile di un div all'interno di un'area scorrevole. Mi considero abbastanza decente con jQuery, ma questo mi sta completamente buttando fuori.
Diciamo che ho un div rosso all'interno di un wrapper nero:
Nel grafico sopra, la funzione jQuery restituirebbe 248, la parte visibile del div.
Una volta che l'utente scorre oltre la parte superiore del div, come nel grafico sopra, riporterà 296.
Ora, una volta che l'utente ha passato il div, riporterà di nuovo 248.
Ovviamente i miei numeri non saranno così coerenti e chiari come lo sono in questa demo, o farei semplicemente un codice per quei numeri.
Ho un po 'di teoria:
- Prendi l'altezza della finestra
- Ottieni l'altezza del div
- Ottieni l'offset iniziale del div dalla parte superiore della finestra
- Ottieni l'offset mentre l'utente scorre.
- Se l'offset è positivo, significa che la parte superiore del div è ancora visibile.
- se è negativo, la parte superiore del div è stata eclissata dalla finestra. A questo punto, il div potrebbe occupare l'intera altezza della finestra o potrebbe essere visualizzata la parte inferiore del div
- Se la parte inferiore del div è visibile, calcola lo spazio tra essa e la parte inferiore della finestra.
Sembra piuttosto semplice, ma non riesco a capirlo. Domani mattina prenderò un altro crack; Ho solo pensato che alcuni di voi geni potessero essere in grado di aiutare.
Grazie!
AGGIORNAMENTO: L'ho capito da solo, ma sembra che una delle risposte seguenti sia più elegante, quindi la userò invece. Per i curiosi, ecco cosa ho pensato:
$(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);
}
}
});