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
- IntersectionObserver API i progi
- Leniwe ładowanie za pomocą IntersectionObserver
- Implementacja nieskończonego przewijania
- Konfiguracja animacji powiązanych z przewijaniem