Proč záleží na sémantice?
HTML5 přineslo v roce 2014 velkou změnu: místo dřívějšího <div> pro vše máme nyní tagy, které nesou význam. Výsledný HTML kód vypadá stejně v prohlížeči, ale zcela jinak ho čtou:
- 🤖 Vyhledávače (Google, Bing) — lépe indexují obsah, výsledky jsou relevantnější
- ♿ Čtečky obrazovky — slepí nebo zrakově postižení uživatelé se lépe orientují
- 👨💻 Vy sami — kód je čitelnější a lépe udržovatelný
- 🛠️ Ostatní vývojáři — snazší spolupráce v týmu
Podívejte se na tyto dvě verze kódu — vizuálně jsou v prohlížeči totožné, ale jejich kvalita je zcela odlišná:
div vs. sémantické tagy
<div> a <span> jsou generické kontejnery bez vlastního významu. Jsou stále užitečné pro CSS layouty, ale jako primární strukturní prvky je nahradily sémantické alternativy.
| Nesémantické | Sémantická alternativa | Kdy použít sémantický? |
|---|---|---|
<div class="header"> | <header> | Záhlaví stránky nebo sekce |
<div class="nav"> | <nav> | Hlavní navigační menu |
<div class="main"> | <main> | Hlavní obsah stránky (jen 1×) |
<div class="article"> | <article> | Samostatný obsah (blogpost, karta) |
<div class="sidebar"> | <aside> | Vedlejší obsah, sidebar |
<div class="section"> | <section> | Tematická skupina obsahu |
<div class="footer"> | <footer> | Zápatí stránky nebo sekce |
<span> | <time>, <mark>, <cite> | Datum/čas, zvýraznění, citace |
<div> klidně dál. Sémantické tagy jsou pro strukturu a obsah, ne pro každý CSS kontejner.🧠 Kvíz: Jaký tag použijete pro hlavní navigaci webu?
Klíčové HTML5 sémantické tagy
Projdeme nejdůležitější tagy s praktickými příklady. Každý tag má svůj specifický účel:
<header> a <footer>
Mohou se opakovat — každá <section> nebo <article> může mít vlastní header a footer.
<article> vs <section>
Toto je nejčastější zdroj zmatku:
<article>— obsah, který dává smysl sám o sobě, vytrhnutý z kontextu (blogpost, komentář, tweet, produkt v e-shopu)<section>— tematická část stránky, která patří k celku. Vždy by měla mít nadpis (h2–h6)
<figure> a <figcaption>
Pro obrázky, grafy, ukázky kódu — vždy s popiskem:
<figure>
<img src="graf.png" alt="Růst tržeb Q3 2025">
<figcaption>Graf 1: Meziroční růst tržeb, Q3 2025</figcaption>
</figure>
<time> a <mark>
<!-- time: strojově čitelné datum -->
<time datetime="2025-09-15">15. září 2025</time>
<!-- mark: zvýraznění relevantního textu (ne jen styling!) -->
<p>Ve výsledcích hledání je <mark>sémantické HTML</mark> klíčové.</p>
<details><summary>Klikni</summary>Skrytý obsah</details>Kompletní struktura HTML5 stránky
Jak vypadá profesionální kostra moderní stránky? Každý prvek má své místo:
Důležité HTML atributy
Atributy dodávají tagům další informace. Znáte class a id — ale existuje mnoho dalších zásadně důležitých:
Datové atributy (data-*)
Vlastní atributy pro přenos dat do JavaScriptu — bez nutnosti skrytých inputů nebo globálních proměnných:
<button data-product-id="42" data-price="299" onclick="addToCart(this)">
Přidat do košíku
</button>
<script>
function addToCart(btn) {
const id = btn.dataset.productId; // "42"
const price = btn.dataset.price; // "299"
console.log(`Produkt ${id} za ${price} Kč`);
}
</script>
lang a dir
<html lang="cs"> <!-- jazyk dokumentu pro SEO a čtečky -->
<p lang="en">This paragraph is in English.</p>
<p dir="rtl">Arabic text goes right to left.</p>
tabindex a accesskey
<!-- tabindex: pořadí klávesy Tab -->
<input tabindex="1">
<input tabindex="2">
<button tabindex="3">Odeslat</button>
<!-- accesskey: klávesová zkratka (Alt+S) -->
<button accesskey="s"><u>S</u>hledat</button>
🧠 Kvíz: Co vrátí btn.dataset.productId pro data-product-id="42"?
Přístupnost (Accessibility / a11y)
Přístupný web mohou používat všichni — včetně lidí se zdravotním postižením. V EU je navíc od 2025 zákonná povinnost pro komerční weby (European Accessibility Act).
ARIA atributy
ARIA (Accessible Rich Internet Applications) doplňuje sémantiku pro dynamické prvky:
<!-- role: definuje typ prvku -->
<div role="alert">Formulář byl odeslán!</div>
<!-- aria-label: popis pro čtečky (bez viditelného textu) -->
<button aria-label="Zavřít dialog">✕</button>
<!-- aria-expanded: stav rozbalení (menu, accordion) -->
<button aria-expanded="false" onclick="toggleMenu(this)">
Menu
</button>
<!-- aria-hidden: skryje prvek před čtečkami -->
<span aria-hidden="true">🎉</span> Gratulujeme!
alt text u obrázků
<!-- Informativní obrázek: popis obsahu -->
<img src="graf.png" alt="Sloupcový graf tržeb 2024: Q1 120tis, Q2 145tis, Q3 132tis, Q4 178tis">
<!-- Dekorativní obrázek: prázdné alt (čtečka přeskočí) -->
<img src="dekorace.svg" alt="">
<!-- Nikdy nevynechávejte atribut alt úplně! -->
🧠 Kvíz: Dekorativní obrázek (pouze vizuální ornament) má mít atribut alt nastaven na:
Praktické cvičení
Napište sémantické HTML pro jednoduchou stránku blogu. Musí obsahovat: správnou kostru, header s navigací, main s article (nadpis, datum, 2 odstavce, obrázek s figcaption), aside se seznamem nejnovějších článků, a footer.
<!DOCTYPE html>, lang="cs", <meta charset>, <meta viewport>, <title>, <header><nav>, <main><article>, <time datetime>, <figure><figcaption>, <aside>, <footer>Odznak: Sémantický Architekt
Dokončili jste Lekci 1 — zvládáte správnou strukturu HTML5 dokumentů.
Taháček — rychlá reference
Přehled nejdůležitějšího z Lekce 1 na jednom místě.
Sémantické tagy — přehled
| Tag | Účel | Poznámka |
|---|---|---|
<header> | Záhlaví stránky/sekce | Může se opakovat |
<nav> | Navigační menu | Pro hlavní navigaci |
<main> | Hlavní obsah | Pouze 1× na stránce! |
<article> | Samostatný obsah | Blogpost, karta, komentář |
<section> | Tematická skupina | Vždy s nadpisem |
<aside> | Vedlejší obsah | Sidebar, poznámky |
<footer> | Zápatí stránky/sekce | Může se opakovat |
<figure> | Obrázek/graf s popisem | S <figcaption> |
<time> | Datum a čas | datetime="YYYY-MM-DD" |
<mark> | Zvýraznění | Relevantní, ne jen styling |
Zlatá pravidla
- ✅
<main>je pouze jednou na celé stránce - ✅
<section>vždy obsahuje nadpis (h2–h6) - ✅
<article>dává smysl i vytrhnutý z kontextu - ✅ Každý
<img>má atributalt(i prázdný pro dekorativní) - ✅
<html>má vždylang="cs"(nebo příslušný jazyk) - ✅
data-*pro custom data, neclassneboid - ❌
<div>pro strukturu stránky (jen pro CSS wrappery) - ❌ Vynechávat
<!DOCTYPE html>nebocharset