0Pricing
HTML Academy · Lekcja

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

  1. IntersectionObserver API i progi
  2. Leniwe ładowanie za pomocą IntersectionObserver
  3. Implementacja nieskończonego przewijania
  4. Konfiguracja animacji powiązanych z przewijaniem
← Powrót do HTML Academy