Leniwe ładowanie

Jak leniwe ładowanie obrazów i iframe poprawia Core Web Vitals, atrybut loading, ryzyka SEO leniwego ładowania treści powyżej linii zagięcia oraz jak Googlebot renderuje odroczone treści.

Opublikowano po raz pierwszy: 2 lip 2026 · Ostatnia aktualizacja: 3 sie 2026 · Zaawansowane

Leniwe ładowanie odracza obrazy i iframe poza ekranem do momentu, gdy mają się pojawić w widoku, zmniejszając początkową wagę strony i pomagając Core Web Vitals. Natywnym sposobem jest atrybut loading="lazy" na <img> i <iframe> — bez potrzeby JavaScriptu. Dużym błędem jest leniwe ładowanie obrazu hero/LCP, co opóźnia Largest Contentful Paint. Googlebot nie przewija ani nie klika, więc wszystko ukryte za zdarzeniem przewijania lub kliknięcia może pozostać niezauważone. To nie jest bezpośredni czynnik rankingowy — efekt działa przez Core Web Vitals i możliwość indeksowania. Zweryfikuj, co faktycznie renderuje się w Narzędziu do sprawdzania adresów URL w Search Console: adresy URL obrazów powinny znajdować się w atrybucie src w wyrenderowanym HTML.

TL;DR — Leniwe ładowanie odracza obrazy i ramki poza ekranem do chwili, gdy zbliżą się do viewportu, zmniejszając początkową wagę strony i pracę głównego wątku. Natywny atrybut loading="lazy" w <img> i <iframe> zastąpił większość bibliotek JavaScript; znaczenie mają tylko wartości lazy i eager, a auto jest przestarzałe. Szkodliwe błędy to leniwe ładowanie obrazu LCP lub widocznego nad linią zagięcia oraz ukrywanie treści za przewijaniem albo kliknięciem, którego Googlebot nie wykona. Nie jest to bezpośredni czynnik rankingowy; wpływ przebiega przez Core Web Vitals i możliwość crawlowania. W narzędziu do sprawdzania adresów URL potwierdź, że adresy obrazów trafiają do atrybutu src wyrenderowanego HTML.

Co właściwie robi leniwe ładowanie

Pomysł jest prosty: ładuj zasoby tylko wtedy, gdy ich potrzebujesz, zamiast ładować wszystko naraz. Na stronie z dużą ilością multimediów pobieranie każdego obrazu i osadzonego elementu z góry zajmuje przeglądarkę pobieraniem rzeczy, których odwiedzający może nigdy nie przewinąć — marnując przepustowość, pamięć i baterię na nic. Odroczenie tych poza ekranem pozwala na szybsze wyświetlenie treści nad linią zagięcia. Martin Splitt dokładnie to zauważył w odcinku firmowego podcastu Google „Leniwe ładowanie bez tajemnic”: Celem jest unikanie pracy, która nic nie daje, ponieważ niekrytyczne obrazy, bez których strona mogłaby się obejść, po prostu zajmują przeglądarkę.

To łączy się z Core Web Vitals, które większość osób stara się osiągnąć. Mniej bajtów konkurujących o sieć na początku oznacza, że element Largest Contentful Paint może się wyrenderować wcześniej. W przypadku iframe — reklam, widgetów społecznościowych, sekcji komentarzy, map — odroczenie ich również zmniejsza pracę głównego wątku podczas startu, co jest wygraną dla Interaction to Next Paint, a nie tylko dla LCP. Wskazówki Google na web.dev opisują leniwie ładowane iframe jako ulepszenie INP podczas ładowania strony.

Natywne a sterowane JavaScriptem leniwe ładowanie

Kilka lat temu przeglądarki zyskały natywny atrybut loading dla obrazów i iframe, więc możesz przekazać całą pracę przeglądarce zamiast podłączać API JavaScriptu. W moim przewodniku po SEO dla JavaScriptu w Ahrefs zauważam to samo: odkąd napisałem ten artykuł, leniwe ładowanie w większości przeszło z bycia sterowanym JavaScriptem do obsługi przez przeglądarki. Nadal spotkasz konfiguracje sterowane JS, a w przypadku obrazów zwykle są one w porządku — sprawdzam, czy faktyczna treść (nie tylko obrazy) jest ładowana leniwie, ponieważ to te konfiguracje powodowały, że treść nie była poprawnie pobierana.

Wersja natywna:

<!-- Below-the-fold image: defer it -->
<img src="gallery-07.jpg" loading="lazy" width="800" height="600" alt="…">

<!-- Off-screen embed: defer it -->
<iframe src="https://www.youtube.com/embed/…" loading="lazy" title="…"></iframe>

Zawsze ustawiaj jawne width/height (lub aspect-ratio) na leniwych obrazach, aby przeglądarka zarezerwowała miejsce przed załadowaniem obrazu — to największe ryzyko przesunięcia układu przy odroczonych obrazach. Zarezerwowane wymiary nie są jednak absolutną gwarancją CLS: jeśli otaczający układ lub responsywne przycięcie nadal zmieni się po załadowaniu obrazu, nadal możesz zobaczyć przesunięcie, więc potwierdź to prawdziwym śladem przesunięcia układu, zamiast zakładać, że same stałe wymiary to rozwiążą.

Leniwe ładowanie i iframe wymagają jeszcze jednego rozróżnienia: loading="lazy" na <iframe> tylko odracza kiedy nastąpi pobranie i utworzenie osadzenia. Nie ustawia za Ciebie jego title, zachowania fokusu, sandbox, allow/polityki uprawnień, referrerpolicy, obsługi zgody ani wymiarów — te nadal wymagają własnej uwagi, a osadzenie może nadal wykonywać pracę (skrypty, piksele śledzące, układ), gdy stanie się kwalifikowane do załadowania. I nie zakładaj, że „poniżej krawędzi” działa wszędzie tak samo: treść z display: none, slajdy karuzeli poza ekranem, transformowane elementy i zagnieżdżone kontenery przewijane mogą przecinać viewport inaczej niż zwykły element poniżej krawędzi, więc przetestuj faktyczny układ i elementy nawigacji, zamiast zakładać równoważność.

Wartości atrybutu loading

Obecnie liczą się tylko dwie wartości:

  • loading="lazy" — odrocz zasób, dopóki nie znajdzie się blisko viewportu.
  • loading="eager" — załaduj go natychmiast, to domyślne zachowanie. Użyj tego, aby jawnie oznaczyć obrazy powyżej krawędzi.
Dowód potwierdzający to twierdzenie The native loading attribute supports lazy loading for images and iframes without a JavaScript lazy-loading library. Zakres: Browser-level lazy loading behavior; browser heuristics decide the fetch distance. Poziom ufności: wysoki · Zweryfikowano: web.dev: Browser-level image lazy loading

Możesz zobaczyć loading="auto" w starszych artykułach — jest przestarzałe w Chrome, więc po nie sięgaj. Nie ma takiej potrzeby; pominięcie atrybutu już daje ci domyślne (eager) zachowanie.

Jak blisko jest „blisko”? loading="lazy" to wskazówka, a nie gwarancja kontrolowana przez autora — specyfikacja pozostawia faktyczną decyzję o bliskości viewportu przeglądarce. Chromium stara się pobrać leniwy zasób wystarczająco wcześnie, aby był gotowy, zanim do niego przewiniesz, a odległość wyzwalania różni się w zależności od przeglądarki, prędkości połączenia i typu zasobu; nie jest to stała wartość w pikselach, na której możesz polegać lub którą możesz odtworzyć w różnych przeglądarkach lub wersjach. Nie publikuj — ani nie ufaj — konkretnej liczbie „ładuje N pikseli przed viewportem”; traktuj okno bliskości viewportu jako zdefiniowane przez implementację i potwierdź faktyczne zachowanie śladem sieciowym w przeglądarce/połączeniu, które Cię interesuje, zamiast zakładać stałą.

Natywne leniwe ładowanie dobrze współgra również z obrazami responsywnymi: dotyczy zwykłego src oraz wyboru srcset/sizes, więc nie tracisz zachowania responsywnych obrazów przez dodanie loading="lazy". Jeśli natomiast ukryjesz prawdziwy URL tylko w atrybucie data-*, aby skrypt podmienił go później, ładowanie zależy teraz od tego skryptu — przetestuj wyrenderowany HTML i sprawdź, co się stanie, jeśli skrypt zawiedzie (więcej na ten temat w zakładkach Skrypty i Rozwiązywanie problemów).

Dowód potwierdzający to twierdzenie Native lazy loading works with ordinary src and responsive srcset/sizes selection; hiding the real URL only in data-* attributes makes loading dependent on script and should be tested in rendered HTML and under script failure. Zakres: responsive image fetching and layout Poziom ufności: wysoki · Zweryfikowano: HTML Standard: img

Błąd nr 1: leniwe ładowanie obrazu LCP / obrazu nad zakładką

To najczęstszy błąd, jaki widuję, i wszystkie źródła się z tym zgadzają. Jeśli leniwie ładujesz obraz hero — lub dowolny obraz, który prawdopodobnie będzie elementem LCP — mówisz przeglądarce, aby czekała na najważniejszy piksel dla postrzeganej szybkości ładowania. Przeglądarka nie może też leniwie załadować obrazu, dopóki nie wie, gdzie obraz będzie się znajdować na stronie, więc leniwe ładowanie obrazów nad zakładką zwykle działa wolniej niż natychmiastowe. To bezpośrednio opóźnia Largest Contentful Paint, metrykę, którą Google zaleca rozwiązać w ciągu pierwszych 2,5 sekundy ładowania.

Nie stosuj leniwego ładowania do obserwowanego lub prawdopodobnego obrazu LCP; potwierdź rzeczywisty czas żądania i renderowania w śladzie. Źródło: Lazy Loading

Ścieżka z wyprzedzeniem wykrywa prawdopodobny obraz LCP w HTML i rozpoczyna jego żądanie natychmiast. Ścieżka leniwa czeka na heurystyki ładowania przeglądarki przed rozpoczęciem żądania. Porównanie nie używa stałych wartości czasowych i zauważa, że rzeczywisty LCP musi być zmierzony.

© Patrick Stox LLC · CC BY 4.0 ·

Splitt przedstawił drugą stronę jasno w odcinku SOTR: jeśli nie używasz leniwego ładowania tam, gdzie powinieneś, prawdopodobnie zaszkodzi to niektórym aspektom Core Web Vitals — najprawdopodobniej LCP. Więc to działa w obie strony. Zasada:

  • Prawdopodobny lub zaobserwowany kandydat na LCP → ładuj natychmiast (pomiń loading="lazy" lub ustaw eager). Rozważ fetchpriority="high" na obrazie LCP.
  • Poniżej zakładki → loading="lazy".

Nie każdy obraz nad zakładką jest kandydatem na LCP — zidentyfikuj ten właściwy (trace Performance lub PageSpeed Insights go wskaże) i zweryfikuj jego czasy żądań, zamiast traktować wszystkie obrazy na pierwszym ekranie tak samo. To osobne wskazówki, nie jedno ustawienie: loading="eager" (lub pominięcie loading) oznacza tylko, że przeglądarka nie odroczy odkrycia zasobu — samo w sobie nie podnosi priorytetu pobierania. fetchpriority to odrębna, doradcza wskazówka na dodatek. Łączenie <link rel="preload"> z loading="lazy" na tym samym zasobie wysyła przeglądarce sprzeczne intencje, więc sprawdź rzeczywisty wodospad sieciowy, zamiast zakładać, że kombinacja działa tak, jak oczekujesz.

Ogólnym antywzorcem jest włączanie leniwego ładowania dla każdego obrazu w całej witrynie — to częsty domyślny stan CMS. Jak zauważył Splitt, jeśli każdy obraz jest leniwie ładowany, to obrazy, które są (lub powinny być) natychmiast widoczne, również są leniwie ładowane, co jest dokładnie przypadkiem, którego chcesz uniknąć.

Jak Googlebot renderuje leniwie ładowane treści

Oto rzeczywistość indeksowania, która zaskakuje ludzi: Googlebot nie przewija strony i nie klika. Renderuje Twoją stronę w przeglądarce bezgłowej, ale nie symuluje użytkownika interagującego z nią. Google stwierdza to wprost — jego zalecane metody leniwego ładowania celowo nie polegają na działaniach użytkownika, takich jak przewijanie czy klikanie, ponieważ Google Search nie wchodzi w interakcję z Twoją stroną.

Dowód potwierdzający to twierdzenie Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Zakres: Google Search guidance for JavaScript-driven lazy loading. Poziom ufności: wysoki · Zweryfikowano: Google Search Central: Lazy-load content

Dlatego właśnie sposób implementacji ma znaczenie. Dokumentacja Google wymienia trzy implementacje, które uważa za bezpieczne: wbudowane leniwe ładowanie przeglądarki dla obrazów i iframe, API IntersectionObserver (z polyfillem) lub biblioteka JavaScript, która ładuje dane, gdy wchodzą w obszar widoczny. Wszystkie trzy opierają się na przecięciu z obszarem widocznym — nie na zdarzeniu przewijania lub kliknięcia, którego Googlebot nigdy nie wywoła.

Wzorzec wysokiego ryzyka to niestandardowa lub zewnętrzna biblioteka JS do leniwego ładowania. Jeśli biblioteka zachowuje się nieprawidłowo, a URL obrazu nigdy nie trafi do atrybutu src, Google po prostu nie pobierze tego obrazu — Splitt opisał dokładnie ten tryb awarii w odcinku SOTR. Nie ma czego indeksować, jeśli URL nie jest tam obecny. To samo sygnalizuję w moim przewodniku po JavaScript SEO: leniwe ładowanie obrazów jest zwykle w porządku, ale leniwie ładowane treści to miejsce, gdzie pojawiają się problemy z indeksowaniem, a rozwiązaniem jest sprawdzenie, co Google faktycznie renderuje.

Nieskończone przewijanie to inny problem

Nie myl podstawowego leniwego ładowania obrazów/iframe z nieskończonym przewijaniem lub ładowaniem paginowanym. Odraczanie obrazów to jedno; ładowanie nowych fragmentów treści podczas przewijania przez użytkownika to drugie i wymaga własnej architektury. Wytyczne Google: nadaj każdemu fragmentowi stały, unikalny URL, utrzymuj treść stabilną dla każdego URL (używaj bezwzględnych numerów stron, takich jak ?page=12, a nie względnych wartości, takich jak ?date=yesterday), i aktualizuj wyświetlany URL za pomocą History API, gdy każdy fragment staje się główną widoczną treścią, tak aby można go było odświeżyć, udostępnić i linkować. Pomiń to, a głębsza treść za nieskończonym przewijaniem może nigdy nie zostać niezawodnie przeszukana ani zaindeksowana.

Jak to przetestować

Ścieżka weryfikacji jest taka sama w dokumentacji Google i w mojej własnej metodologii: użyj narzędzia URL Inspection w Search Console i sprawdź wyrenderowany HTML. Jeśli URL-e Twoich obrazów (lub filmów) pojawiają się w atrybucie src na elementach <img>/<video> w tym wyrenderowanym HTML, Twoja konfiguracja działa. Google mówi to wprost — sprawdź wyrenderowany HTML zgodnie z instrukcją: “Check the rendered HTML to make sure your content is in the rendered HTML” (tłumaczenie) „Sprawdź wyrenderowany HTML, aby upewnić się, że znajduje się w nim Twoja treść”. Jeśli URL brakuje w src, to jest Twój problem i zwykle wskazuje na trigger przewijania/kliknięcia lub uszkodzoną bibliotekę.

W przypadku leniwie ładowanej siatki produktów wyjdź poza tę kontrolę obecności. Uruchom macierz testowania SEO dla nieskończonego przewijania ze standardowymi i wysokimi rzutniami, świeżą nawigacją i zmianą rozmiaru po załadowaniu, przebiegami bez akcji i z przyrostowym przewijaniem, liczbami unikalnych linków do produktów oraz inspekcją drzewa dostępności. Zmiana rozmiaru zainicjalizowanej strony nie jest równoważna nawigacji przy końcowym rozmiarze rzutni, ponieważ obserwatory i obliczenia wsadowe mogą być rejestrowane tylko podczas uruchamiania. Dowód potwierdzający to twierdzenie Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Zakres: Google Search guidance for JavaScript-driven lazy loading. Poziom ufności: wysoki · Zweryfikowano: Google Search Central: Lazy-load content

Możesz też polegać na narzędziach do wydajności sieci: PageSpeed Insights flaguje obrazy poza ekranem, które powinieneś odraczać. W moim przewodniku po PageSpeed Insights w Ahrefs zauważam, że audyt “defer offscreen elements” mówi Ci, aby leniwie ładować obrazy — to wygodny sposób na połączenie diagnostyki, którą już uruchamiasz, z rozwiązaniem.

Uczciwość w kwestii sygnałów rankingowych

Bądź jasny co do tego, czym leniwe ładowanie jest, a czym nie jest. Używanie go nie jest bezpośrednim czynnikiem rankingowym, a nie używanie go nie jest karą. Związek z rankingami jest pośredni: płynie przez Core Web Vitals (głównie LCP, czasami INP dla iframe) oraz przez możliwość przeszukiwania, jeśli zła implementacja ukrywa treść. Splitt scharakteryzował wpływ na ranking przez Core Web Vitals jako drobny, minimalny czynnik w większości przypadków. Optymalizuj więc leniwe ładowanie dla doświadczenia ładowania Twoich użytkowników i dla czystego indeksowania — nie dlatego, że oczekujesz wzrostu rankingu od samego atrybutu.

Gdzie to pasuje

Leniwe ładowanie to jedna z dźwigni w szerszym zestawie narzędzi wydajności sieci. Łączy się z wskazówkami dotyczącymi zasobów (preload/preconnect dla zasobów, które chcesz wcześnie), strategią ładowania czcionek, buforowaniem i CDN — i jest oceniane ostatecznie przez Core Web Vitals. Odpowiednio podziel treść nad i pod linią zagięcia, a będzie to jedna z najtańszych dostępnych wygranych.

Dodaj notatkę eksperta

Przypnij cytat eksperta

Nowa osoba? Najpierw utwórz jej nieprzejęty profil na /admin/experts/ → Przypnij cytat eksperta .