Muszę pobrać widoczną wysokość elementu div w przewijalnym obszarze. Uważam się za całkiem przyzwoitego z jQuery, ale to kompletnie mnie wyrzuca.
Powiedzmy, że mam czerwony element DIV w czarnym opakowaniu:
Na powyższej ilustracji funkcja jQuery zwróciłaby 248, widoczną część elementu div.
Gdy użytkownik przewinie się poza górę elementu div, jak na powyższej ilustracji, zgłosi 296.
Teraz, gdy użytkownik przewinie się poza div, ponownie zgłosi 248.
Oczywiście moje liczby nie będą tak spójne i jasne, jak w tym demo, albo po prostu zakodowałbym te liczby.
Mam trochę teorii:
- Uzyskaj wysokość okna
- Uzyskaj wysokość div
- Uzyskaj początkowe przesunięcie elementu DIV z góry okna
- Uzyskaj przesunięcie, gdy użytkownik przewija.
- Jeśli przesunięcie jest dodatnie, oznacza to, że góra elementu div jest nadal widoczna.
- jeśli jest ujemna, górna część elementu div została przyćmiona przez okno. W tym momencie element div może zajmować całą wysokość okna lub może być wyświetlany spód elementu div
- Jeśli wyświetla się dół elementu div, sprawdź odstęp między nim a dołem okna.
Wydaje się to całkiem proste, ale po prostu nie mogę tego obejść. Jutro rano zjem kolejną porcję; Pomyślałem, że niektórzy z was, geniusze, mogliby pomóc.
Dzięki!
AKTUALIZACJA: Sam to wymyśliłem, ale wygląda na to, że jedna z poniższych odpowiedzi jest bardziej elegancka, więc zamiast tego użyję tego. Dla ciekawskich oto co wymyśliłem:
$(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);
}
}
});