Implementacja nieskończonego przewijania
Automatyczne ładowanie kolejnych treści podczas przewijania przez użytkownika
Implementacja nieskończonego przewijania to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Wzorzec
Nieskończone przewijanie ładuje kolejne treści, gdy użytkownik zbliża się do końca listy. Najczytelniejsza implementacja korzysta z IntersectionObserver: na końcu listy należy umieścić element „sygnalizacyjny” i rozpocząć jego obserwowanie. Gdy element sygnalizacyjny pojawi się w obszarze widocznym, należy pobrać następną stronę.
Element sygnalizacyjny
Po ostatnim elemencie listy należy dodać niewidoczny element <div> (albo element zastępczy „ładowanie...” ). Trzeba obserwować go za pomocą IntersectionObserver. Gdy element zostanie przecięty, oznacza to, że użytkownik przewinął stronę w pobliże końca — to właściwy moment na pobranie kolejnych danych.
<ul id="feed">
<li>Post 1</li>
<li>Post 2</li>
</ul>
<div id="sentinel" aria-hidden="true"></div>Pętla obserwatora
Po przecięciu należy pobrać następną stronę, wyrenderować nowe elementy i ponownie umieścić element sygnalizacyjny (pozostanie on automatycznie na końcu listy, jeśli nowe elementy zostaną dodane przed nim). Nie trzeba wyłączać ani ponownie włączać obserwowania — element sygnalizacyjny jest nadal obserwowany.
const sentinel = document.getElementById("sentinel");
const feed = document.getElementById("feed");
let page = 1;
let loading = false;
const observer = new IntersectionObserver(async (entries) => {
if (!entries[0].isIntersecting || loading) return;
loading = true;
const items = await fetchPage(page++);
items.forEach((it) => feed.insertAdjacentHTML("beforeend", renderItem(it)));
loading = false;
});
observer.observe(sentinel);Blokada stanu ładowania
Flaga logiczna loading zapobiega nakładaniu się żądań, gdy użytkownik szybko przewija stronę i powoduje wiele przecięć przed nadejściem pierwszej odpowiedzi. Bez niej ta sama strona jest pobierana wielokrotnie, a elementy pojawiają się zduplikowane.
Koniec danych
Gdy serwer zwróci pustą stronę (albo zasygnalizuje „brak kolejnych danych”), należy wyłączyć obserwowanie elementu sygnalizacyjnego i zastąpić go komunikatem o końcu listy. Przyszłe przecięcia nie będą wywoływać pobierania, a użytkownik zobaczy, że dotarł do końca.
Obsługa błędów
Wywołanie fetch należy umieścić w bloku try/catch. W razie błędu trzeba pozostawić loading = true, aby ponowne próby nie uruchamiały się automatycznie, oraz wyświetlić przycisk „Ponów”, który zresetuje loading i ponownie uruchomi ładowanie. Bez tego awarie sieci prowadzą do lawiny ponownych prób.
rootMargin do wcześniejszego ładowania
rootMargin: "500px" rozpoczyna pobieranie kolejnej strony 500 pikseli przed dotarciem użytkownika do elementu sygnalizacyjnego. Wartość należy dostosować do wysokości elementów i średniej szybkości przewijania — zbyt mała spowoduje wyświetlenie komunikatu „brak treści”, a zbyt duża doprowadzi do pobierania danych z nadmiernym wyprzedzeniem.
Przywracanie pozycji przewijania
Gdy użytkownik opuści stronę i na nią wróci, należy zachować pozycję przewijania ORAZ ponownie wyrenderować wcześniej załadowane elementy. Elementy można przechowywać w sessionStorage lub magazynie w stylu Zustand; po zamontowaniu należy je przywrócić i przewinąć stronę do zapamiętanego przesunięcia za pomocą scrollTo.
Kwestie związane z pamięcią
Podczas długiego nieskończonego przewijania w DOM gromadzą się tysiące węzłów. W przypadku bardzo długich kanałów (Twitter, Facebook) warto połączyć to rozwiązanie z wirtualizacją: usuwać z DOM elementy znajdujące się powyżej obszaru widocznego i przywracać je podczas przewijania w górę. Biblioteki takie jak react-virtual lub @tanstack/virtual robią to wydajnie.
Dostępność
Nieskończone przewijanie utrudnia korzystanie osobom używającym klawiatury i czytników ekranowych, które nie mogą łatwo dotrzeć do stopki. Należy zapewnić alternatywny przycisk „Wczytaj więcej” oraz zadbać o prawdziwą stopkę dostępną za pomocą klawiszy Home/End. Pomocny jest również region aria-live informujący o nowych elementach.
Odbijanie podczas przewijania na urządzeniach mobilnych
Odbijanie podczas przewijania w iOS może powodować wielokrotne przecięcia w pobliżu końca. Blokada ładowania obsługuje większość takich przypadków; można również zastosować opóźnienie 300 ms, aby odfiltrować serię przecięć występujących podczas odbijania.
Alternatywa: paginacja oparta na kursorze
Interfejsy API serwera powinny zwracać „następny kursor” zamiast polegać na numerach stron śledzonych po stronie klienta — takie rozwiązanie jest odporne na dodawanie i usuwanie elementów podczas przewijania. Klient przekazuje kursor przy każdym żądaniu i kończy działanie, gdy serwer nie zwróci kursora.
Sprawdzenie wiedzy
Dlaczego flaga „loading” jest konieczna w callbacku IntersectionObservera używanym do nieskończonego przewijania?
Podsumowanie
Nieskończone przewijanie korzysta z IntersectionObservera na elemencie sentinel umieszczonym na końcu listy. Po wykryciu przecięcia pobierz następną stronę, wyrenderuj ją i nadal obserwuj ten element. Zabezpiecz ten mechanizm flagą loading, odpowiednio obsłuż koniec danych i błędy, a także dostosuj rootMargin do odległości wstępnego pobierania. Zapewnij alternatywę dostępną z klawiatury (przycisk „Wczytaj więcej”) i rozważ wirtualizację w przypadku bardzo długich kanałów.
Często zadawane pytania
Czy lekcja „Implementacja nieskończonego przewijania” jest bezpłatna?
Tak — pełny tekst „Implementacja nieskończonego przewijania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Implementacja nieskończonego przewijania”?
Automatyczne ładowanie kolejnych treści podczas przewijania przez użytkownika Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Implementacja nieskończonego przewijania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- IntersectionObserver API i progi
- Leniwe ładowanie za pomocą IntersectionObserver
- Implementacja nieskończonego przewijania
- Konfiguracja animacji powiązanych z przewijaniem