0Pricing
HTML Academy · Lekcja

Leniwe ładowanie za pomocą IntersectionObserver

Opóźnianie ładowania obrazów i treści do momentu pojawienia się ich w obszarze widoku

Leniwe ładowanie za pomocą IntersectionObserver to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 2 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.

Więcej niż natywne loading="lazy"

Natywne leniwe ładowanie obejmuje elementy <img> i <iframe>. W przypadku pozostałych elementów — obrazów tła, wideo, kosztownych komponentów czy widżetów zewnętrznych — właściwym narzędziem jest IntersectionObserver, który odracza pracę do chwili, gdy element znajdzie się blisko obszaru widocznego.

Wzorzec

Elementy, których ładowanie ma być odroczone, należy oznaczyć atrybutem data-src zawierającym właściwe źródło i początkowo wyrenderować niewielki element zastępczy. Należy obserwować każdy z nich, a po przecięciu zamienić data-src na src (lub w inny sposób aktywować element) i wyłączyć jego obserwowanie, aby funkcja zwrotna nie została już nigdy wywołana.

<img class="lazy" data-src="/photo.jpg" alt="Photo" width="800" height="600">
<script>
const observer = new IntersectionObserver((entries) => {
  for (const entry of entries) {
    if (entry.isIntersecting) {
      entry.target.src = entry.target.dataset.src;
      observer.unobserve(entry.target);
    }
  }
}, { rootMargin: "200px" });
document.querySelectorAll(".lazy").forEach((img) => observer.observe(img));
</script>

Leniwe ładowanie obrazów tła

Nie można natywnie zastosować leniwego ładowania do właściwości CSS background-image. Po przecięciu należy ustawić el.style.backgroundImage = `url("${el.dataset.bg}")` albo dodać klasę CSS definiującą background-image. W tym momencie rozpoczyna się pobieranie obrazu.

Leniwe ładowanie wideo

W przypadku filmów znajdujących się poniżej obszaru widocznego początkowo należy pominąć atrybut src i elementy source. Po przecięciu trzeba wstawić elementy <source> i wywołać video.load(). W przeciwnym razie metadane wideo mogą zostać pobrane z wyprzedzeniem, zanim użytkownik przewinie stronę w pobliże elementu.

Widżety zewnętrzne

Osadzenia mediów społecznościowych, widżety komentarzy i skrypty czatu mogą pobierać megabajty danych. Po przecięciu należy dynamicznie zaimportować skrypt konfigurujący widżet: await import("/embed.js"). Koszt jest ponoszony dopiero wtedy, gdy użytkownik rzeczywiście przewinie stronę do tej sekcji.

Leniwe ładowanie iframe (więcej niż loading="lazy")

Natywne leniwe ładowanie iframe nadal pobiera dokument iframe. W przypadku ciężkich osadzeń (map czy odtwarzaczy wideo) należy użyć wzorca „fasady”: wyświetlić obraz zastępczy, a po kliknięciu lub przecięciu zastąpić go właściwym iframe. Znacznie zmniejsza to początkowy rozmiar strony.

rootMargin do wstępnego ładowania

rootMargin: "200px" rozpoczyna ładowanie 200 pikseli przed wejściem elementu w obszar widoczny. Wartość należy dostosować do szybkości przewijania: zbyt mała spowoduje, że podczas szybkiego przewijania użytkownicy zobaczą elementy zastępcze, a zbyt duża zniweczy cel leniwego ładowania, ponieważ wszystko zostanie załadowane.

Wyłączanie obserwowania po wyzwoleniu

Po aktywowaniu leniwego ładowania należy zawsze wywołać observer.unobserve(element). W przeciwnym razie funkcja zwrotna będzie uruchamiana za każdym razem, gdy element ponownie pojawi się w obszarze widocznym — powoduje to niepotrzebne zużycie procesora i potencjalne błędy, jeśli aktywacja nie jest idempotentna.

Rezerwowanie miejsca

W przypadku leniwie ładowanych obrazów należy ustawić szerokość i wysokość, a dla leniwie ładowanych kontenerów — min-height. Bez jawnych wymiarów układ strony zmienia się w miarę ładowania treści, powodując irytujące skoki podczas przewijania i pogarszając wynik Cumulative Layout Shift.

Fallback bez JavaScriptu

Aby zapewnić pełne Progressive Enhancement, należy umieścić leniwie ładowany element w <noscript> z właściwym src: <noscript><img src="/photo.jpg"></noscript>. Użytkownicy bez JavaScriptu otrzymają obraz załadowany od razu, a użytkownicy z JavaScriptem — wersję leniwą. Należy połączyć to z właściwym oznaczeniem data-src.

Grupowanie wielu elementów

Pojedyncza instancja obserwatora może wydajnie obserwować setki elementów. Nie należy tworzyć osobnego obserwatora dla każdego elementu. Trzeba utworzyć jeden współdzielony obserwator z wybranymi opcjami i użyć observe(), aby zarejestrować każdy cel.

Łączenie z natywnym loading="lazy"

W przypadku elementu <img> należy używać loading="lazy" jako podstawowego mechanizmu, a IntersectionObserver rezerwować dla przypadków, których natywne leniwe ładowanie nie obejmuje. Oba rozwiązania dobrze ze sobą współdziałają: natywne ładowanie obsługuje obrazy poniżej obszaru widocznego, a IntersectionObserver — tła, komponenty i inne niestandardowe mechanizmy ładowania.

Sprawdź swoją wiedzę

Dlaczego po aktywowaniu elementu załadowanego leniwie ważne jest wywołanie observer.unobserve(element)?

Podsumowanie

IntersectionObserver rozszerza leniwe ładowanie poza natywny mechanizm <img loading="lazy">, obejmując tła, wideo, widżety zewnętrzne i dynamiczne importy komponentów. Należy używać elementów zastępczych z data-src, zamieniać źródło po przecięciu i wyłączać obserwowanie po aktywacji. Wstępne ładowanie można realizować za pomocą rootMargin, miejsce rezerwować przez width i height, zapewnić fallback noscript oraz łączyć to rozwiązanie z natywnym leniwym ładowaniem tam, gdzie ma ono zastosowanie.

Często zadawane pytania

Czy lekcja „Leniwe ładowanie za pomocą IntersectionObserver” jest bezpłatna?

Tak — pełny tekst „Leniwe ładowanie za pomocą IntersectionObserver” 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 „Leniwe ładowanie za pomocą IntersectionObserver”?

Opóźnianie ładowania obrazów i treści do momentu pojawienia się ich w obszarze widoku Ć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 2 z 4.

Ile czasu zajmuje lekcja „Leniwe ładowanie za pomocą IntersectionObserver”?

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