Proč řešit lazy-load bez ztráty indexovatelnosti
Lazy-loading (odložené načítání) obrázků a videí je dnes standardem pro zrychlení načítání stránek, snížení objemu přenesených dat a zlepšení Core Web Vitals. Při nesprávné implementaci však hrozí, že vyhledávače vizuální zdroje neobjeví nebo jim neporozumí, což snižuje viditelnost v Obrázcích Google a na kartě Videa, zhoršuje pochopení obsahu a může poškodit výkon ve Snippetech, službě Discover či v rozšířených výsledcích vyhledávání pro videa. Tento článek představuje techniky, postupy a kontrolní seznam, jak používat lazy-load správně a bez kompromisů v indexovatelnosti.
Indexovatelnost vizuálních prvků: jak ji vyhledávače posuzují
- Dostupné HTML elementy:
<img>,<picture>,<video>,<source>,<iframe>(pro vložený obsah). - Jednoznačné adresy: procházetelné URL v atributech
src/srcset/poster/data-*(při JS lazy-loadu je nutný záložní obsah). - Kontext a textové signály: texty alt, figcaption, okolní text, nadpisy; u videa také náhledový obrázek, přepis a strukturovaná data.
- Strukturovaná data:
ImageObjectaVideoObjectprostřednictvímschema.org(JSON-LD) s položkamicontentUrl,thumbnailUrl,uploadDate,duration. - Mapy webu: rozšíření pro obrázky a videa v XML mapách webu na podporu jejich objevení.
Kdy (ne)používat lazy-load: pravidlo „nad ohybem“ a LCP
- Obrázek LCP nenačítejte líně: hlavní obrázek nad ohybem by měl mít
loading="eager"(výchozí hodnota) a případněfetchpriority="high". - Načítejte líně vše mimo viewport: galerie, ilustrace dále v článku, vložená videa mimo první obrazovku.
- Hraniční případy: prvky těsně pod ohybem; zvažte threshold v IntersectionObserveru nebo prefetch.
Preferovaná volba: nativní lazy-load
Moderní prohlížeče podporují nativní lazy-load pro <img> a <iframe>:
<img src="obr.jpg" alt="Popis" width="1200" height="800" loading="lazy" decoding="async">
<iframe src="https://player.example/video" title="Video" loading="lazy"></iframe>
- Výhody: jednoduché, stabilní, bez JS a spolehlivé z hlediska indexovatelnosti (pokud je v HTML uvedeno
src). - Nezbytné náležitosti: vždy definujte
widthaheight, abyste předešli CLS; používejtedecoding="async"pro dekódování mimo hlavní vlákno.
JS lazy-load s IntersectionObserverem (bez ztráty indexace)
Pokud potřebujete vlastní logiku (postupné zobrazení, blur-up, měření):
- Vypište na serveru plnohodnotný element
<img>s platným atributemsrc(nikoli prázdným!) aloading="lazy". JS pak může zdroj „vyměnit“ za obrázek s vyšším rozlišením nebo za WebP/AVIF podle potřeby. - Případně použijte
data-src/data-srcset, ale přidejte záložní obsah noscript se stejným blokem<img src=…>, aby byl zdroj objevitelný i bez JS.
Příklad HTML se záložním obsahem (bez <pre>):
<img class="lazy" data-src="obr.webp" src="obr-low.jpg" alt="Popis" width="1200" height="800" loading="lazy" decoding="async">
<noscript><img src="obr.webp" alt="Popis" width="1200" height="800"></noscript>
Základní zásady:
- Vyhněte se „přízračným“ elementům: nikdy nevypisujte pouze prázdný
<div data-src>. Použijte skutečný element<img>nebo<picture>. - „Nekvalitní zástupný obrázek“ (LQIP/blur-up): atribut
srcmůže obsahovat malý progresivní JPEG nebo rozmazaný data URI, který později nahradíte skutečnýmdata-src. - Bezpečná výměna atributů: při průniku do viewportu přesuňte
data-src → srcadata-srcset → srcset; pro zpětnou kompatibilitu ponechteloading="lazy".
Responzivní obrázky (picture, srcset, sizes)
Pro správný výběr formátu a šířky:
<picture>
<source type="image/avif" srcset="obr-800.avif 800w, obr-1600.avif 1600w" sizes="(max-width: 800px) 100vw, 800px">
<source type="image/webp" srcset="obr-800.webp 800w, obr-1600.webp 1600w" sizes="(max-width: 800px) 100vw, 800px">
<img src="obr-800.jpg" srcset="obr-800.jpg 800w, obr-1600.jpg 1600w" sizes="(max-width: 800px) 100vw, 800px" alt="Popis" width="800" height="533" loading="lazy" decoding="async">
</picture>
- Indexovatelnost: Google rozumí elementu
<picture>. Důležité je, aby koncový element<img>obsahoval atributalta vygenerované hodnotysrc/srcsetbyly prohledávatelné. - Preferujte moderní formáty: AVIF a WebP jako první elementy
<source>, JPEG jako záložní formát v elementu<img>.
Priority načítání a Core Web Vitals
- Obrázek LCP:
fetchpriority="high",preload, pokud je kritický, a atributloadingponechte na hodnotě „eager“. - CLS: vždy definujte
widthaheight(neboaspect-ratiov CSS). Při nahrazení zástupného obrázku neměňte rozvržení. - INP/TBT: vyhněte se náročným JS knihovnám pro lazy-load; preferujte nativní lazy-load nebo jednoduchý IntersectionObserver.
Lazy-load videí: HTML5 video vs. vložená videa z platforem
HTML5 video:
- Element:
<video controls preload="metadata" poster="thumb.jpg" width="1280" height="720"><source src="video.mp4" type="video/mp4"></video> - Lazy-load: videosoubor se celý nenačte při použití
preload="metadata"; pro odložené načítání mimo viewport použijte IntersectionObserver a odložené vložení elementu<source>nebo nastavení atributusrcaž při průniku do viewportu, a to se záložním obsahemnoscript. - Indexovatelnost: používejte
VideoObjects položkamicontentUrl(přímá adresa MP4/HLS),thumbnailUrl,name,description,uploadDate,duration.
Vložený obsah z YouTube/Vimeo:
- Nativní varianta:
<iframe loading="lazy" src="https://www.youtube.com/embed/ID" title="…" width="560" height="315" allow="accelerometer; autoplay; encrypted-media" allowfullscreen></iframe> - „Lite“ komponenty: pokud používáte „lite“ iframe (zástupný obsah + JS), vždy přidejte do
<noscript>plnohodnotný element<iframe>, aby byl vložený obsah objevitelný a prohledávač měl přímou stopu k adreseembedUrl. - Strukturovaná data:
VideoObjects položkamiembedUrl,thumbnailUrl(statický obrázek) adescription. Přidejte takétranscriptjako textový obsah stránky.
Záložní obsah noscript: kdy a jak
- Obrázky: při použití JS lazy-loadu používejte
<noscript><img src="plny-zdroj.jpg" alt="…" width="…" height="…" /></noscript>. - Videa/vložený obsah:
<noscript><iframe src="…/embed/ID"></iframe></noscript>nebo přímý odkaz na stránku s videem. - Obsah noscript: měl by odrážet skutečný obsah, nikoli být prázdný. Tím zajistíte indexovatelnost při vypnutém JS nebo zpožděném vykreslování.
Strukturovaná data pro obrázky a videa
Přidejte JSON-LD (stručně, bez <pre>; zalomené řádky):
<script type="application/ld+json">
{
"@context":"https://schema.org","@type":"Article","image":{
"@type":"ImageObject","url":"https://example.com/obr-1600.jpg","width":1600,"height":900,"caption":"Popis obrázku"}
}
</script>
Pro video:
<script type="application/ld+json">
{ "@context":"https://schema.org","@type":"VideoObject","name":"Název",
"description":"Popis","thumbnailUrl":"https://example.com/thumb.jpg",
"uploadDate":"2025-09-01","duration":"PT2M10S",
"contentUrl":"https://cdn.example.com/video.mp4","embedUrl":"https://www.youtube.com/embed/ID" }
</script>
CDN, optimalizace a formáty
- Transformace za běhu: CDN (Image CDN) pro generování různých šířek a formátů AVIF/WebP podle hlavičky
Accept. - Komprese a profily: pro fotografie: AVIF/WebP; pro vektorovou grafiku: SVG (kritické ikony SVG nenačítejte líně, vložte je přímo do HTML). Pro záznamy obrazovky: MP4/H.264 nebo H.265 s přiměřeným datovým tokem + samostatný náhledový obrázek.
- Mezipaměť: dlouhá hodnota
Cache-Controls názvy opatřenými fingerprintem, pokud možno s direktivouimmutable.
Časté chyby, které ničí indexovatelnost
- V HTML chybí
src(je uvedeno pouzedata-srcbeznoscript) – crawler bez vykreslení nic nenajde. - Lazy-load obrázku LCP: výrazné zhoršení LCP a nestabilní indexace obrázků v hlavní sekci.
- Skryté nebo prázdné elementy
<img>: CSSdisplay:nonenebo kontejner s nulovými rozměry; crawler obrázek ignoruje. - URL CDN blokované v souboru robots.txt – obrázky/videa nelze procházet.
- Chybějící rozměry: způsobují CLS a zhoršení hodnocení.
- Náročný JS lazy-loader: zhoršení INP/TBT, zejména na mobilech.
Měření dopadu: metriky a protokoly
- Core Web Vitals: obrázek LCP se načítá včas, CLS je nulové nebo nízké, INP je stabilní.
- CrUX a RUM: skutečná data uživatelů; sledujte element LCP (obvykle
<img>). - Search Console: pokrytí, vylepšení videa, obrázky v přehledu Prozkoumání.
- Protokoly serveru/CDN: přístupy botů na URL obrázků/videí (Googlebot-Image/Video).
- Pokrytí indexace médií: počet indexovaných obrázků/videí, výskyt v rozšířených výsledcích.
Testování a audit implementace
- Test zdrojového kódu: ověřte, zda jsou ve statickém HTML přítomné elementy
<img>/<video>/<iframe>se skutečnými URL nebo záložním obsahem noscript. - Vykreslení „bez JS“: spusťte stránku s vypnutým JS – zobrazí se obrázky alespoň prostřednictvím noscript?
- Lighthouse a web-vitals: LCP, CLS, INP; identifikujte element LCP a jeho atributy (rozměry,
loading,fetchpriority). - Kontrola URL: ověřte, zda Google vidí video a načítá náhledový obrázek; zkontrolujte platnost položek
VideoObject/ImageObject. - Robots a mezipaměť: URL CDN, obrázků a videí musí být povolené a vracet stavový kód 200; zkontrolujte správnost hlaviček.
Ukázkové postupy pro různé scénáře
Hlavní obrázek (bez lazy-loadu):
<img src="/img/hero-1600.avif" alt="Produkt v akci" width="1600" height="900" decoding="async" fetchpriority="high">
Ilustrace v článku (nativní lazy-load):
<img src="/img/chart-800.webp" alt="Porovnání metrik" width="800" height="500" loading="lazy" decoding="async">
Galerie s LQIP + výměna pomocí JS:
<img class="lazy" src="/img/gal/1-lqip.jpg" data-src="/img/gal/1-1600.avif" alt="Detail produktu" width="1200" height="800" loading="lazy" decoding="async">
<noscript><img src="/img/gal/1-1600.avif" alt="Detail produktu" width="1200" height="800"></noscript>
HTML5 video s odloženým zdrojem:
<video class="lazy-video" controls preload="metadata" poster="/thumbs/v1.jpg" width="1280" height="720"></video>
<noscript><video controls preload="metadata" poster="/thumbs/v1.jpg" width="1280" height="720"><source src="/video/v1.mp4" type="video/mp4"></video></noscript>
Vložené video z YouTube (lite + záložní varianta):
<div class="lite-yt" data-id="ID"></div>
<noscript><iframe loading="lazy" src="https://www.youtube.com/embed/ID" title="Název videa" width="560" height="315" allow="accelerometer; autoplay; encrypted-media" allowfullscreen></iframe></noscript>
Specifika platforem SPA/SSR
- SSR/SSG je ideální: generujte elementy
<img>/<video>přímo na serveru; vyhýbejte se vkládání obsahu výhradně na straně klienta. - Hydratace: zajistěte, aby neměnila atributy způsobem, který by vedl k CLS nebo ztrátě atributů
alt/width/height. - Přednačítání při přechodu na jinou stránku: u galerií na následujících stránkách zvažte prefetch náhledových obrázků, nikoli obrázků v plné velikosti.
Právní aspekty a přístupnost
- Text alt: povinný pro přístupnost a SEO; výstižný, stručný a bez nadbytečných klíčových slov.
- Titulky/figcaption: zlepšují kontext a angažovanost; u videa doplňte titulky.
- Autorská práva: uveďte jasný původ médií; u vloženého obsahu respektujte licence.
Kontrolní seznam: lazy-load bez ztráty indexovatelnosti
- Nad ohybem: žádný lazy-load, pro LCP nastavte
fetchpriority="high". - Mimo viewport:
loading="lazy"pro<img>/<iframe>. - Při vlastním JS: vždy záložní obsah
<noscript>s plnohodnotným elementem<img>/<iframe>. - Responzivita:
srcset/sizes,<picture>s AVIF/WebP a JPEG jako záložním formátem. - Rozměry:
width/heightneboaspect-ratiou všech vizuálních prvků. - Strukturovaná data:
ImageObject/VideoObjects položkamicontentUrl/thumbnailUrl. - Mapy webu: rozšíření pro obrázky a videa; URL CDN povolené v souboru
robots.txt. - Testy: vykreslení „bez JS“, kontrola URL, Lighthouse/CrUX, protokoly botů.
Praktická doporučení pro týmy
- Design & UX: navrhujte pro vizuální prvky pevnou plochu, aby efekt blur-up nevyvolával posuny.
- Vývoj: standardizujte komponenty (HeroImage, ArticleImage, VideoEmbed) s povinnými atributy.
- SEO: nastavte pravidla pro LCP, texty alt, JSON-LD, mapy webu a audity jednotlivých vydání.
- Obsah: udržujte konzistentní popisy, názvy souborů, popisky a přepisy videí.
Lazy-load může být výhodný pro všechny z hlediska rychlosti i SEO, pokud dodržíte tři zásady: 1) nad ohybem lazy-load nepoužívejte a upřednostněte prvek LCP, 2) mimo viewport používejte nativní lazy-load (nebo jednoduchý JS), aniž byste před crawlery skrývali adresu zdroje, 3) poskytujte bohaté kontextové a strukturované signály (text alt, popisky, JSON-LD, mapy webu). Taková implementace minimalizuje riziko ztráty indexovatelnosti a maximalizuje organický výkon i spokojenost uživatelů.
