// htmltahak/ · 06 z 09

Odkazy & Média

a, img, picture, figure, figcaption, video, audio, iframe — hyperlinkový element, obrázky, responzivní média a vložené dokumenty.

<a>

Odkaz (anchor)

Nejdůležitější tag webu. Odkaz na URL, email, telefon, kotvu v dokumentu nebo soubor ke stažení.

INLINE

a (anchor) je hyperlinkový element. Může odkazovat na URL, email (mailto:), telefon (tel:), soubor ke stažení (download), nebo kotvu v dokumentu (#id). Nikdy nepoužívejte a bez href jako klikatelný element — pro akce bez navigace slouží <button>.

// target="_blank" bezpečnostOdkaz s target="_blank" bez rel="noopener noreferrer" umožní cílové stránce přistoupit k window.opener a přesměrovat původní záložku. Vždy přidejte rel="noopener noreferrer" pro jakýkoli target="_blank".
Atributy
hrefURL cíl — URL, mailto:, tel:, #id, relativní, absolutníURL / #id
target_blank = nová záložka, _self = stejná (výchozí)_blank / _self
relnoopener noreferrer pro _blank. nofollow pro SEO.string
downloadStáhnout soubor, hodnota = název souborufilename
aria-labelPřístupný popis pro screen readerystring
hreflangJazyk cílové stránkycs / en
  • target="_blank" vždy s rel="noopener noreferrer"
  • Text odkazu musí dávat smysl sám o sobě
  • "klikněte zde" je špatný text odkazu!
  • <a> pro navigaci, <button> pro akce
  • Kotva: href="#id" + element s id="id"
Všechny typy odkazů
HTML
<!-- Základní odkaz -->
<a href="https://google.com">Google</a>

<!-- Nová záložka — BEZPEČNĚ -->
<a href="https://google.com"
   target="_blank"
   rel="noopener noreferrer">
  Otevřít v nové záložce
</a>

<!-- Email -->
<a href="mailto:info@web.cz">
  info@web.cz
</a>

<!-- Telefon (klik na mobilu zavolá) -->
<a href="tel:+420123456789">
  +420 123 456 789
</a>

<!-- Kotva v dokumentu -->
<a href="#kontakt">Přejít na kontakt</a>
<section id="kontakt">...</section>

<!-- Stažení souboru -->
<a href="cenik.pdf"
   download="cenik-2024.pdf">
  Stáhnout ceník (PDF)
</a>

<!-- Odkaz s ikonou — přístupně -->
<a href="/produkt"
   aria-label="Detail produktu Victorinox">
  <img src="icon.png" alt="">
  Victorinox Classic
</a>
<a href="/produkty">Zobrazit produkty</a>
<a href="#">Klikněte zde</a>
<a onclick="fn()"> bez href
<img>

Obrázek

Void element. alt je povinný. width+height zabrání layout shift. loading="lazy" pro výkon.

VOIDINLINE

img vloží rastrový obrázek. alt je povinný atribut — pro přístupnost a pro případ nenahrání. Void element — nemá zavírací tag. loading="lazy" výrazně zlepšuje výkon stránky.

Alt text — pravidla
✅ Obsahový obrázek

Nese informaci → popisný alt text:

alt="Jana Nováková při prezentaci"
✅ Dekorativní obrázek

Jen vizuální → prázdný alt:

alt=""
❌ Špatné alt texty

alt="image" — obecné
alt="logo.png" — název souboru
Chybějící alt atribut

✅ Logo v odkazu

Alt = název firmy:

alt="MůjWeb — domů"
Atributy
srcURL obrázku. Povinné.URL / cesta
altAlt text. Povinné! Prázdné ("") pro dekorativní.string / ""
widthŠířka v px — zabrání CLS (layout shift)číslo
heightVýška v px — zabrání CLSčíslo
loadinglazy = načti při scrollu, eager = okamžitě (LCP)lazy / eager
srcsetRůzná rozlišení pro různé obrazovkyURL + deskriptor
sizesPro srcset: jaká velikost na jaký viewportmedia + size
decodingasync = neblokuje render při dekódováníasync / sync
  • Vždy width+height → zabrání CLS (Core Web Vitals)
  • loading="lazy" pro obrázky pod záhybem
  • loading="eager" pro LCP hero obrázek
  • WebP je ~30 % menší než JPG
  • srcset pro Retina displeje (2×, 3×)
Příklady
HTML
<!-- Základní -->
<img
  src="foto.jpg"
  alt="Jana Nováková při prezentaci"
  width="800"
  height="600"
>

<!-- Výkonná verze -->
<img
  src="hero.jpg"
  alt="Victorinox Classic kapesní nůž"
  width="800"
  height="600"
  loading="eager"
  decoding="async"
  srcset="
    hero-400.jpg  400w,
    hero-800.jpg  800w,
    hero-1200.jpg 1200w
  "
  sizes="
    (max-width: 600px)  400px,
    (max-width: 900px)  800px,
    1200px
  "
>

<!-- Lazy load -->
<img
  src="produkt.jpg"
  alt="Gerber Paraframe"
  width="400" height="300"
  loading="lazy"
>

<!-- Dekorativní — prázdný alt -->
<img src="dekorace.svg" alt="">

<!-- CSS: responzivní obrázky -->
<style>
img { max-width: 100%; height: auto; }
</style>
<picture>

Responzivní obrázek

Různé obrázky pro různé podmínky: formát (WebP/AVIF), breakpoint, DPR. Art direction.

BLOCKHTML5

picture umožňuje "art direction" — různé obrázky pro různé situace. Prohlížeč vybere první vyhovující <source>. Fallback je <img> uvnitř. Skvělé pro WebP s JPG fallbackem pro starší prohlížeče.

// WebP a AVIF fallbackAVIF = nejmenší (50–80 % menší než JPG), ale ne všechny prohlížeče. WebP = ~30 % menší než JPG, podporují všechny moderní prohlížeče. JPG/PNG = fallback pro staré. Picture element vybere automaticky nejlepší podporovaný formát.
Dva scénáře použití
Formáty: AVIF → WebP → JPG fallback Art direction: jiný ořez na mobilu
  • Fallback <img> uvnitř picture je povinný
  • type atribut pro formáty (AVIF, WebP)
  • media atribut pro breakpointy (art direction)
  • AVIF > WebP > JPG pro kompresi
  • Squoosh.app pro konverzi a optimalizaci
Příklady
HTML
<!-- WebP + JPG fallback -->
<picture>
  <source type="image/avif"
    srcset="hero.avif">
  <source type="image/webp"
    srcset="hero.webp">
  <img
    src="hero.jpg"
    alt="Hero obrázek"
    width="1200" height="600"
    loading="eager"
  >
</picture>

<!-- Art direction: jiný ořez -->
<picture>
  <!-- Mobil: na výšku, jiný ořez -->
  <source
    media="(max-width: 600px)"
    srcset="hero-mobile.jpg"
  >
  <!-- Tablet -->
  <source
    media="(max-width: 1200px)"
    srcset="hero-tablet.jpg"
  >
  <!-- Desktop fallback -->
  <img
    src="hero-desktop.jpg"
    alt="Naše prodejna"
    width="1200" height="400"
  >
</picture>
<figure> & <figcaption>

Obrázek s popiskem

figure obalí samostatný obsah (obrázek, kód, graf). figcaption je jeho viditelný popis.

BLOCKHTML5

figure obaluje samostatný obsah — obrázek, video, kód, citát, diagram — ke kterému se vztahuje popisek. figcaption je viditelný popis. figure lze přesunout na jiné místo dokumentu bez ztráty smyslu.

// figure vs pouhé img+pimg + p vedle sebe nemají sémantické propojení. figure + figcaption říká prohlížeči "tento popisek patří k tomuto obrázku". Screen readery ohlásí figcaption jako popis obrázku. Lepší SEO i přístupnost.
Co může být uvnitř figure
<img> obrázek <picture> obrázek <video> video <pre><code> kódový blok <blockquote> citát SVG diagram, graf
  • figcaption může být první nebo poslední v figure
  • figure je sémanticky "pojmenovaná příloha"
  • aria-labelledby propojí figcaption s obrázkem explicitně
  • Čísla obrázků: "Obrázek 1: ..." v figcaption
Příklady
HTML
<!-- Obrázek s popiskem -->
<figure>
  <img
    src="nuz.jpg"
    alt="Victorinox Classic"
    width="400" height="300"
  >
  <figcaption>
    Victorinox Classic — kapesní nůž
    s 9 funkcemi, váha 21 g.
  </figcaption>
</figure>

<!-- Kódový blok s popiskem -->
<figure>
  <figcaption>
    Příklad: Hello World v Pythonu
  </figcaption>
  <pre><code>
print("Hello, World!")
  </code></pre>
</figure>

<!-- CSS -->
<style>
figure {
  margin: 1.5rem 0;
}
figcaption {
  font-size: 0.875rem;
  color: #666;
  margin-top: 0.5rem;
  font-style: italic;
}
</style>
<video>

Video

Nativní HTML video přehrávač. Více formátů pro kompatibilitu. Poster pro náhled. Track pro titulky.

BLOCKHTML5

Nativní video bez Flash nebo JS pluginů. controls zobrazí ovládací prvky. autoplay funguje jen s muted — prohlížeče blokují autoplay se zvukem. track uvnitř pro titulky (přístupnost).

// autoplay + muted = background videoModerní prohlížeče blokují autoplay se zvukem (uživatelé to nenávidí). Pro background video: autoplay muted loop playsinline. playsinline zabrání iOS fullscreen přepnutí.
Atributy
controlsZobrazí přehrávač s tlačítkyboolean
autoplayAutomaticky přehrát (jen s muted!)boolean
mutedBez zvuku (nutné pro autoplay)boolean
loopOpakovat stále dokolaboolean
posterNáhledový obrázek před přehrávánímURL
preloadCo přednahrát: none / metadata / autometadata
playsinlineiOS: přehrát inline, ne fullscreenboolean
width/heightRozměry přehrávačečíslo
  • autoplay pouze s muted (prohlížeče jinak blokují)
  • track pro titulky — přístupnost je povinná
  • WebM je menší než MP4, použijte oba
  • poster = náhled před kliknutím na play
Příklady
HTML
<!-- Standardní video s titulky -->
<video
  controls
  poster="nahled.jpg"
  preload="metadata"
  width="800" height="450"
>
  <source src="video.mp4"
    type="video/mp4">
  <source src="video.webm"
    type="video/webm">
  <track
    src="titulky.vtt"
    kind="subtitles"
    srclang="cs"
    label="Čeština"
  >
  <p>Váš prohlížeč nepodporuje video.
    <a href="video.mp4">Stáhnout</a>
  </p>
</video>

<!-- Background video -->
<video
  autoplay muted loop playsinline
>
  <source src="bg.mp4" type="video/mp4">
</video>

<!-- Responzivní video CSS -->
<style>
.video-wrap {
  position: relative;
  padding-top: 56.25%; /* 16:9 */
}
.video-wrap video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
</style>
<audio>

Audio

Nativní HTML audio přehrávač. Podobný video, ale bez poster a rozměrů. Podcast, hudba.

BLOCKHTML5

audio vloží audio přehrávač. Bez controls není viditelný (skrytý přehrávač ovládaný JS). Multiple source elementy uvnitř pro různé formáty — prohlížeč vybere první podporovaný.

// FormátyMP3 = nejširší podpora. OGG = open source alternativa. AAC = Apple/iOS optimální. WebM/Opus = nejmenší, moderní prohlížeče. Doporučení: MP3 + OGG pro 100% pokrytí.
Atributy
controlsZobrazí přehrávačboolean
autoplayAutomaticky přehrát (blokováno!)boolean
loopOpakovatboolean
mutedZtlumitboolean
preloadnone / metadata / autometadata
  • Bez controls je přehrávač neviditelný (jen JS)
  • autoplay bez interakce blokují prohlížeče
  • Web Audio API pro pokročilé zpracování zvuku
  • Howler.js pro cross-browser audio v JS
Příklad
HTML
<!-- Základní audio -->
<audio controls preload="metadata">
  <source src="podcast.mp3"
    type="audio/mpeg">
  <source src="podcast.ogg"
    type="audio/ogg">
  Váš prohlížeč nepodporuje audio.
</audio>

<!-- Skrytý audio řízený JS -->
<audio id="bgMusic" loop>
  <source src="hudba.mp3"
    type="audio/mpeg">
</audio>

<button onclick="
  document.getElementById('bgMusic')
    .play()
">
  Spustit hudbu
</button>

<!-- Stylování -->
<style>
audio {
  width: 100%;
  border-radius: 4px;
}
</style>
<iframe>

Inline rám

Vloží jiný webový dokument do stránky. YouTube, Google Mapy, platební brány. title je povinný!

BLOCK

iframe vloží jiný dokument — YouTube video, Google Mapy, platební bránu, reCAPTCHA. Atribut sandbox omezuje co může iframe dělat (JS, formuláře, stejný origin). title je povinný pro přístupnost — screen reader přečte co iframe obsahuje.

// Bezpečnost iframůBez sandbox může iframe přistoupit k cookies a localStorage vaší stránky (same-origin). S sandbox jsou práva omezena. allow-same-origin NUTNÉ pro cizí obsah (YouTube). Vždy zkontrolujte co vkládáte!
Atributy
srcURL vkládaného dokumentuURL
titlePopis pro screen readery. POVINNÉ!string
width/heightRozměryčíslo / 100%
loadinglazy = načíst při scrollu do viewportulazy / eager
sandboxOmezení: allow-scripts, allow-forms...string
allowfullscreenPovolí fullscreen (YouTube)boolean
referrerpolicyOmezení odesílání referrerno-referrer
  • title je povinný pro přístupnost!
  • loading="lazy" pro YouTube/Mapy mimo viewport
  • aspect-ratio CSS pro responzivní iframe
  • Lite YouTube Embed pro výkon (načte jen náhled)
Příklady
HTML + CSS
<!-- YouTube -->
<iframe
  src="https://www.youtube.com/embed/VIDEO_ID"
  title="Název videa"
  width="560" height="315"
  frameborder="0"
  allow="accelerometer; autoplay;
    encrypted-media; gyroscope"
  allowfullscreen
  loading="lazy"
></iframe>

<!-- Google Maps -->
<iframe
  src="https://www.google.com/maps/embed?pb=..."
  title="Mapa pobočky Praha 1"
  width="600" height="450"
  loading="lazy"
  style="border: 0"
></iframe>

<!-- Responzivní iframe (16:9) -->
<div class="iframe-wrap">
  <iframe src="..." title="...">
  </iframe>
</div>

<style>
.iframe-wrap {
  position: relative;
  aspect-ratio: 16 / 9;
}
.iframe-wrap iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}
</style>
title="Ukázka produktu Victorinox"
iframe bez title atributu
← 05 Inline 06 / 09 — Odkazy & Média 07 Formuláře →