Ładuję elementy przez AJAX. Niektóre z nich są widoczne tylko po przewinięciu strony.
Czy jest jakiś sposób, aby wiedzieć, czy element jest teraz w widocznej części strony?
javascript
jquery
scroll
yoavf
źródło
źródło
Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
Odpowiedzi:
To powinno załatwić sprawę:
Prosta funkcja narzędziowa Pozwala na wywołanie funkcji narzędziowej, która akceptuje poszukiwany element i jeśli chcesz, aby element był w pełni widoczny lub częściowo.
Stosowanie
źródło
window.innerHeight
zamiastelemTop
użyłem$(elem).position().top
ielemBottom
użyłemelemTop + $(elem).outerHeight(true)
.Ta odpowiedź w języku waniliowym:
źródło
isVisible = elementTop < window.innerHeight && elementBottom >= 0
? W przeciwnym razie element w połowie ekranu zwraca wartość false.Aktualizacja: użyj IntersectionObserver
Najlepszą metodą, jaką znalazłem do tej pory, jest wtyczka jQuery . Działa jak marzenie.
źródło
appear plugin
i prawdopodobnie będziesz musiał po prostu dodać!
gdzieś, aby uzyskaćdisappear
wtyczkę.Oto moje czyste rozwiązanie JavaScript, które działa, jeśli jest również ukryte w przewijalnym pojemniku.
Demo tutaj (spróbuj również zmienić rozmiar okna)
EDYCJA 26.03.2016: Zaktualizowałem rozwiązanie, aby uwzględnić przewijanie obok elementu, więc jest ono ukryte nad górną powierzchnią kontenera z możliwością przewijania. EDYCJA 2018-10-08: Zaktualizowano, aby obsługiwał po przewinięciu poza ekran nad ekranem.
źródło
return top <= document.documentElement.clientHeight && top >= 0;
Korzystanie z IntersectionObserver API (macierzysty w nowoczesnych przeglądarkach)
Za pomocą obserwatora łatwo i skutecznie można ustalić, czy element jest widoczny w viewpor lub w dowolnym przewijalnym pojemniku .
scroll
Eliminuje się potrzebę dołączania zdarzenia i ręcznego sprawdzania wywołania zwrotnego zdarzenia, a zatem wydajność:Wyświetl tabelę obsługi przeglądarek (nie obsługiwane w IE / Safari)
źródło
Wtyczka jQuery Waypoints wygląda tutaj bardzo ładnie.
Istnieje kilka przykładów na stronie wtyczki .
źródło
$('#my-div').waypoint(function() { console.log('Hello there!'); }, { offset: '100%' });
Co powiesz na
Następnie możesz uruchomić cokolwiek zechcesz, gdy element będzie już widoczny
To mi odpowiada
źródło
WebResourcesDepot napisał skrypt do załadowania podczas przewijania, który używa jQuery jakiś czas temu. Tutaj możesz obejrzeć ich demo na żywo . Ich funkcjonalność była następująca:
źródło
Poprawiłem fajną funkcję Scotta Dowdinga dla mojego wymagania - służy do sprawdzenia, czy element właśnie przewinął się do ekranu, tj. Jego górna krawędź.
źródło
Zwykła wanilia, aby sprawdzić, czy element (
el
) jest widoczny w przewijalnej div (holder
)Użycie z jQuery:
źródło
isScrolledIntoView jest bardzo potrzebną funkcją, więc wypróbowałem ją, działa dla elementów nie wyższych niż rzutnia, ale jeśli element jest większy niż rzutnia, to nie działa. Aby to naprawić, łatwo zmień warunek
do tego:
Zobacz demo tutaj: http://jsfiddle.net/RRSmQ/
źródło
Większość odpowiedzi tutaj nie bierze pod uwagę, że element można również ukryć, ponieważ jest on przewijany poza pole div, nie tylko całej strony.
Aby skorzystać z tej możliwości, musisz po prostu sprawdzić, czy element znajduje się w granicach każdego z jego rodziców.
To rozwiązanie robi dokładnie to:
Pozwala także określić, jaki procent ma być widoczny w każdym kierunku.
Nie obejmuje możliwości, że może być ukryty z powodu innych czynników, takich jak
display: hidden
.Powinno to działać we wszystkich głównych przeglądarkach, ponieważ używa tylko
getBoundingClientRect
. Osobiście przetestowałem to w Chrome i Internet Explorer 11.źródło
źródło
Oto inne rozwiązanie z http://web-profile.com.ua/
Zobacz to w JSFiddle
źródło
Dotyczy to każdego wypełnienia, granicy lub marginesu elementu, a także elementów większych niż sama rzutnia.
Aby to nazwać, użyj czegoś takiego:
źródło
Istnieje wtyczka dla jQuery o nazwie inview, która dodaje nowe zdarzenie „inview”.
Oto kod wtyczki jQuery, która nie używa zdarzeń:
Znalazłem to w komentarzu tutaj ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) przez faceta o imieniu James
źródło
Musiałem sprawdzić widoczność elementów wewnątrz przewijanego pojemnika DIV
źródło
e.style.opacity > 0
się(!e.style.opacity || e.style.opacity > 0)
, ponieważ domyślnie jest to pusty ciąg dla mnie w FF.Opierając się na tej wspaniałej odpowiedzi , możesz ją uprościć jeszcze bardziej, używając ES2015 +:
Jeśli nie obchodzi cię, że góra wychodzi z okna i zależy ci tylko na tym, że dno zostało obejrzane, można to uprościć
a nawet jednowarstwowy
źródło
Możesz użyć wtyczki jquery „onScreen”, aby sprawdzić, czy element znajduje się w bieżącej rzutni podczas przewijania. Wtyczka ustawia „: onScreen” selektora na true, gdy selektor pojawi się na ekranie. To jest link do wtyczki, którą możesz dołączyć do swojego projektu. „ http://benpickles.github.io/onScreen/jquery.onscreen.min.js ”
Możesz wypróbować poniższy przykład, który działa dla mnie.
Kod HTML:
CSS:
źródło
Mam taką metodę w mojej aplikacji, ale nie używa ona jQuery:
Edycja: Ta metoda działa dobrze dla IE (przynajmniej wersja 6). Przeczytaj komentarze dotyczące zgodności z FF.
źródło
var visibleBottom = visibleTop + window.innerHeight;
nie używam jQuery i pomogłeś mi znaleźć poprawną odpowiedź.Jeśli chcesz dostosować to do przewijania elementu w innym dziale,
źródło
Zmodyfikowano zaakceptowaną odpowiedź, tak że element musi mieć ustawioną właściwość display na wartość inną niż „none”, aby jakość była widoczna.
źródło
Oto sposób na osiągnięcie tego samego za pomocą Mootools, w poziomie, pionie lub obu.
źródło
Przykład oparty na tej odpowiedzi, aby sprawdzić, czy element jest widoczny w 75% (tj. Mniej niż 25% jest poza ekranem).
źródło
Istnieje ponad 30 odpowiedzi na to pytanie i żadne z nich nie korzysta z niezwykle prostego, czystego rozwiązania JS, którego używałem. Nie ma potrzeby ładowania jQuery tylko po to, aby rozwiązać ten problem, ponieważ wiele innych pcha.
Aby stwierdzić, czy element znajduje się w rzutni, musimy najpierw ustalić pozycję elementów w ciele. Nie musimy tego robić rekurencyjnie, jak kiedyś myślałem. Zamiast tego możemy użyć
element.getBoundingClientRect()
.Ta wartość jest różnicą Y między górą obiektu a górą ciała.
Następnie musimy stwierdzić, czy element jest w widoku. Większość implementacji pyta, czy pełny element znajduje się w okienku ekranu, więc to omówimy.
Przede wszystkim położenie górnej części okna jest:
window.scrollY
.Możemy uzyskać dolną pozycję okna, dodając wysokość okna do jego najwyższej pozycji:
Stwórzmy prostą funkcję do uzyskania najwyższej pozycji elementu:
Ta funkcja zwróci najwyższą pozycję elementu w oknie lub powróci,
0
jeśli przekażesz mu coś innego niż element z.getBoundingClientRect()
metody Ta metoda istnieje od dłuższego czasu, więc nie powinieneś się martwić, że Twoja przeglądarka jej nie obsługuje.Teraz najwyższą pozycją naszego elementu jest:
I lub dolna pozycja elementu to:
Teraz możemy ustalić, czy element znajduje się w rzutni, sprawdzając, czy dolne położenie elementu jest niższe niż górne położenie rzutni i sprawdzając, czy górne położenie elementu jest wyższe niż dolne położenie rzutni:
Stamtąd możesz wykonać logikę, aby dodać lub usunąć
in-view
klasę w elemencie, którą możesz później obsłużyć za pomocą efektów przejścia w CSS.Jestem absolutnie zaskoczony, że nie znalazłem tego rozwiązania nigdzie indziej, ale wierzę, że jest to najczystsze i najbardziej skuteczne rozwiązanie i nie wymaga załadowania jQuery!
źródło
Bardziej wydajna wersja tej odpowiedzi :
źródło
Ta metoda zwróci true, jeśli jakakolwiek część elementu jest widoczna na stronie. W moim przypadku działało to lepiej i może pomóc komuś innemu.
źródło
Prosta modyfikacja dla przewijalnego div (kontenera)
UWAGA: to nie działa, jeśli element jest większy niż przewijalny div.
źródło
Zaadaptowałem to krótkie rozszerzenie funkcji jQuery, z którego możesz swobodnie korzystać (licencja MIT).
źródło
Napisałem komponent do tego zadania, zaprojektowany do obsługi bardzo dużej liczby elementów bardzo szybko (do melodii <10ms dla 1000 elementów na powolnym telefonie komórkowym ).
To działa z każdym typem przewijania pojemniku masz dostęp do - okna, elementy HTML, osadzonym iframe, zrodził okna potomnego - i jest bardzo elastyczny, co wykryje ( pełne lub częściowe widoczność , pole granicy lub zawartość pola , niestandardowe pole tolerancji , etc ).
Ogromny, głównie automatycznie generowany pakiet testowy zapewnia, że działa on jak reklama, w różnych przeglądarkach .
Spróbuj, jeśli chcesz: jQuery.isInView . W przeciwnym razie możesz znaleźć inspirację w kodzie źródłowym, np . Tutaj .
źródło