Skip to content

1 • HTML5 a sémantika

Struktura stránky, sémantické tagy v HTML5, typografie na webu

Formát zkoušky: 30 minut příprava praktické úlohy, 15 minut obhajoba + náhodná teorie. Tady je teorie hutně, ale ne tryhardně, a celá praktická úloha s řešením.


Část 1: Teorie

Co je sémantické HTML

Sémantické HTML znamená používat elementy podle významu obsahu, ne podle vizuálního efektu. Element popisuje, co je jeho obsah, ne jak vypadá. Styling je práce CSS.

NesémantickySémantickyRozdíl
<div class="header"><header>Prohlížeč, čtečka i vývojář ví, co to je
<div class="nav"><nav>Navigace je jasně označená
<b>důležité</b><strong>důležité</strong>Sděluje důležitost, ne jen tučnost
<i>název</i><em>název</em>Sděluje důraz, ne jen kurzívu

Proč na tom záleží

  • Přístupnost (accessibility): čtečky obrazovky pro nevidomé se orientují podle sémantiky
  • SEO: vyhledávače lépe pochopí strukturu obsahu
  • Čitelnost kódu: vývojář vidí strukturu bez čtení class atributů
  • Standardizace: konzistentní napříč projekty a vývojáři

Základní struktura HTML5 stránky

html
<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Popis stránky pro SEO">
    <title>Název stránky</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>Název webu</h1>
        <nav>
            <ul>
                <li><a href="/">Domů</a></li>
                <li><a href="/o-nas">O nás</a></li>
                <li><a href="/kontakt">Kontakt</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <article>
            <header>
                <h2>Název článku</h2>
                <time datetime="2026-05-13">13. května 2026</time>
            </header>
            <section>
                <h3>První část</h3>
                <p>Obsah...</p>
            </section>
        </article>

        <aside>
            <h2>Související články</h2>
            <ul><li><a href="#">Článek 67</a></li></ul>
        </aside>
    </main>

    <footer>
        <p>&copy; 2026 Název webu</p>
        <address>
            Kontakt: <a href="mailto:info@example.com">info@example.com</a>
        </address>
    </footer>
</body>
</html>

Povinné části <head>

ElementÚčel
<!DOCTYPE html>Říká prohlížeči "jde o HTML5", bez něj quirks mode
<meta charset="UTF-8">Kódování znaků, bez toho nefunguje diakritika
<meta name="viewport"...>Responzivita, správné zobrazení na mobilu
<title>Text v záložce + nadpis v Google výsledcích

<meta name="viewport">

html
<meta name="viewport" content="width=device-width, initial-scale=1.0">

width=device-width: šířka stránky se přizpůsobí šířce zařízení. initial-scale=1.0: výchozí zoom 100 %.

Bez tohoto meta tagu mobilní prohlížeče zobrazí stránku jakoby na desktopu (zoom out) a text bude maličký.


Sémantické strukturní elementy

Záhlaví: může být globální (celá stránka) nebo lokální (uvnitř <article> nebo <section>).

html
<!-- Globální -->
<header>
    <h1>Logo</h1>
    <nav>...</nav>
</header>

<!-- Lokální v článku -->
<article>
    <header>
        <h2>Název článku</h2>
        <p>Autor: axo | <time datetime="2026-05-13">13. 5. 2026</time></p>
    </header>
</article>

Hlavní navigační bloky. Ne pro každý seznam odkazů, jen pro významné navigace (menu, breadcrumbs, footer links).

html
<nav aria-label="Hlavní menu">
    <ul>
        <li><a href="/" aria-current="page">Domů</a></li>
        <li><a href="/blog">Blog</a></li>
    </ul>
</nav>

<main>

Hlavní obsah stránky. Jednou na stránku, přímo v <body>. Obsahuje to, co je unikátní pro danou stránku (ne logo, nav, footer, ty se opakují).

<article>

Samostatný, přenositelný kus obsahu: dával by smysl i vyjmutý z kontextu stránky.

  • Blogový příspěvek
  • Novinový článek
  • Produktová karta
  • Komentář uživatele

<section>

Tematická skupina obsahu uvnitř stránky nebo článku. Obvykle začíná nadpisem.

html
<main>
    <section>
        <h2>Novinky</h2>
        <article>...</article>
        <article>...</article>
    </section>
    <section>
        <h2>Populární</h2>
        <article>...</article>
    </section>
</main>

Klasický chyták <article> vs <section>:

  • <article> = samostatný (smysl bez kontextu)
  • <section> = tematická skupina (smysl jen v kontextu stránky)

<aside>

Vedlejší obsah nepřímo související s hlavním obsahem. Postranní panel, "související články", reklama.

Zápatí: copyright, kontakty, SEO odkazy, mapa webu. Stejně jako <header> může být globální i lokální.

<figure> a <figcaption>

Obrázek (nebo jiná ilustrace) s popiskem.

html
<figure>
    <img src="diagram.png" alt="Schéma struktury HTML stránky">
    <figcaption>Obr. 1: Typická struktura HTML5 stránky</figcaption>
</figure>

<time>

Strojově čitelné datum nebo čas. Atribut datetime je v ISO 8601 formátu.

html
<time datetime="2026-05-13">13. května 2026</time>
<time datetime="14:30">14:30</time>
<time datetime="2026-05-13T14:30">13. 5. 2026 v 14:30</time>

<address>

Kontaktní informace vztahující se k dokumentu nebo autorovi, ne pro libovolnou poštovní adresu.

html
<address>
    Napsal <a href="mailto:axo@example.com">axo</a>.<br>
    Sídlo: Náměstí 67, Liberec.
</address>

Sémantické inline elementy

ElementVýznamDefault styl
<strong>Důležitý textTučně
<em>ZdůrazněníKurzívou
<mark>Zvýraznění (relevantní pro kontext)Žluté pozadí
<abbr title="...">Zkratka s vysvětlenímPodtrženo, tooltip
<cite>Název díla nebo citaceKurzívou
<code>Kód v textuMonospace
<kbd>Klávesa / vstupMonospace s rámečkem
<small>Drobné tiskyMenší text
<del> / <ins>Smazaný / vloženýPřeškrtnuto / podtrženo
<sup> / <sub>Horní / dolní indexx² / H₂O
html
<p>
    <strong>Důležité</strong>: Přečti si <em>celý dokument</em>.
    Zkratka <abbr title="HyperText Markup Language">HTML</abbr> znamená...
    Spusť <code>npm install</code> a stiskni <kbd>Enter</kbd>.
</p>

Nesémantické: <div> a <span>

Neutrální kontejnery bez sémantického významu. Použij jen pokud žádný sémantický element neodpovídá.

html
<!-- ❌ Špatně: div místo sémantiky -->
<div class="header">
    <div class="nav">...</div>
</div>

<!-- ✓ Správně -->
<header>
    <nav>...</nav>
</header>

<!-- ✓ OK: div jako layout wrapper -->
<div class="container">
    <main>...</main>
</div>

<!-- ✓ OK: span pro stylování části textu -->
<p>Cena: <span class="price">299 Kč</span></p>

Typografie na webu

Základní vlastnosti

css
body {
    font-family: 'Roboto', Arial, sans-serif;
    font-size: 16px;
    font-weight: 400;       /* 400 = normal, 700 = bold */
    line-height: 1.6;       /* doporučeno 1.5 až 1.8 */
    color: #333;
    letter-spacing: 0.02em;
}

Jednotky velikosti

JednotkaVýznamKdy použít
pxAbsolutní pixelyBordery, malé fixní rozměry
emRelativní k rodičovskému font-sizePadding, margin u textu
remRelativní k root <html>Velikosti fontů, nejlepší volba
%Procento z rodičeŠířky layoutu
vw / vh% šířky / výšky viewportuHero sekce, fullscreen
chŠířka znaku "0"max-width pro čitelnost textu
css
html { font-size: 16px; }    /* 1rem = 16px */

h1 { font-size: 2.5rem; }    /* 40px */
h2 { font-size: 1.75rem; }   /* 28px */
h3 { font-size: 1.25rem; }   /* 20px */
p  { font-size: 1rem; }      /* 16px */
small { font-size: 0.875rem; } /* 14px */

Zlaté pravidlo čitelnosti

css
p {
    max-width: 65ch;   /* optimální délka řádku 60 až 75 znaků */
    line-height: 1.7;  /* dostatek prostoru mezi řádky */
}

Delší řádky ztěžují čtení: oko musí "hledat" začátek dalšího řádku.

Zarovnání

css
p { text-align: left; }            /* default, nejčtivější pro dlouhé texty */
h1 { text-align: center; }         /* středové nadpisy */
.legal { text-align: justify; }    /* do bloku, pozor na "rivers of white" */

Dekorace a transformace

css
a { text-decoration: none; }
a:hover { text-decoration: underline; }

.tag { text-transform: uppercase; }       /* VELKÁ */
.title { text-transform: capitalize; }    /* Každé Slovo */

Web fonty

Google Fonts (nejjednodušší):

html
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Lora&display=swap" rel="stylesheet">
css
body { font-family: 'Roboto', sans-serif; }
h1, h2 { font-family: 'Lora', serif; }

Vlastní font přes @font-face:

css
@font-face {
    font-family: 'MujFont';
    src: url('fonts/mujfont.woff2') format('woff2');
    font-display: swap;   /* fallback dokud se font nestáhne */
}

Font stack: záchranná síť

Vždy uveď víc fontů. Pokud první není k dispozici, použije se další:

css
font-family: 'Inter', 'Segoe UI', Arial, sans-serif;  /* sans */
font-family: 'Lora', 'Georgia', 'Times New Roman', serif;  /* serif */
font-family: 'Fira Code', 'Consolas', 'Courier New', monospace;  /* mono */

font-display: swap říká prohlížeči: "dokud se nestáhne web font, zobraz fallback, pak prohoď". Bez toho můžeš mít několik sekund neviditelný text (FOIT).


Část 2: Praktická úloha

Co může praktická úloha obsahovat

Zadání pro tuhle teoretickou oblast typicky:

  • Nahradit <div> sémantickými HTML5 elementy v rozdělaném kódu
  • Doplnit chybějící HTML elementy podle TODO komentářů (často <header>, <figure>, <time>, <address>)
  • Přidat meta tagy do <head> (charset, viewport, description, title)
  • Importovat Google Fonts a aplikovat fonty
  • Doplnit CSS typografii: velikosti, řádkování, max-width pro čitelnost
  • Doplnit responzivní viewport meta tag
  • Validovat HTML (žádné <div> tam, kde patří sémantický element)

Příklad zadání: Blog s článkem

Dostaneš rozdělanou HTML stránku jednoduchého blogu napsanou nesémanticky pomocí <div> tagů a s chybějící typografií. Úkol:

  1. Nahradit <div> správnými sémantickými HTML5 elementy
  2. Doplnit chybějící elementy tam, kde jsou <!--TODO--> komentáře
  3. Doplnit CSS typografii: fonty, velikosti, řádkování, Google Fonts

Startovací kód: index.html

html
<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Můj blog</title>
    <!--TODO: přidej odkaz na Google Fonts (Roboto 400, 700 a Lora 400) -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <!--TODO: nahraď div správným sémantickým elementem pro záhlaví -->
    <div class="header">
        <h1>Můj blog</h1>
        <!--TODO: nahraď div správným sémantickým elementem pro navigaci -->
        <div class="nav">
            <ul>
                <li><a href="/">Domů</a></li>
                <li><a href="/kategorie">Kategorie</a></li>
                <li><a href="/o-mne">O mně</a></li>
            </ul>
        </div>
    </div>

    <!--TODO: nahraď div správným sémantickým elementem pro hlavní obsah -->
    <div class="main">
        <!--TODO: nahraď div správným sémantickým elementem pro článek -->
        <div class="article">
            <!--TODO: přidej sémantický header článku obsahující:
                       - h2 s názvem "Jak jsem se naučil HTML5"
                       - odstavec s autorem a datem pomocí <time datetime="2026-05-10"> -->

            <!--TODO: nahraď div správným sémantickým elementem pro sekci -->
            <div class="section">
                <h3>Začátky</h3>
                <p>Všechno začalo, když jsem poprvé otevřel editor a napsal svůj první
                <code>Hello World</code>. Byl to <strong>zlomový moment</strong>.</p>
            </div>

            <!--TODO: nahraď div správným sémantickým elementem pro sekci -->
            <div class="section">
                <h3>Sémantika</h3>
                <p>Postupně jsem pochopil, že <em>jak</em> píšeš HTML je stejně důležité
                jako <em>co</em> píšeš.</p>
                <!--TODO: přidej obrázek s popiskem pomocí <figure> a <figcaption>
                           src="img/html-schema.png", alt="Schéma struktury HTML5 stránky"
                           popisek: "Obr. 1: Typická struktura HTML5 stránky" -->
            </div>

            <!--TODO: nahraď div správným sémantickým elementem pro sekci -->
            <div class="section">
                <h3>Závěr</h3>
                <p>Kontaktovat mě můžeš na
                <!--TODO: obal e-mail správným sémantickým elementem pro kontakt -->
                <a href="mailto:jan@blog.cz">jan@blog.cz</a>.</p>
            </div>
        </div>

        <!--TODO: nahraď div správným sémantickým elementem pro postranní panel -->
        <div class="aside">
            <h2>O autorovi</h2>
            <p>axo: webový vývojář z Liberce.</p>
            <h2>Populární články</h2>
            <ul>
                <li><a href="#">CSS Grid za 10 minut</a></li>
                <li><a href="#">Flexbox pro začátečníky</a></li>
            </ul>
        </div>
    </div>

    <!--TODO: nahraď div správným sémantickým elementem pro zápatí -->
    <div class="footer">
        <p>&copy; 2026 Můj blog. Všechna práva vyhrazena.</p>
    </div>
</body>
</html>

Řešení: hotové index.html

html
<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Můj blog</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Lora&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>Můj blog</h1>
        <nav>
            <ul>
                <li><a href="/">Domů</a></li>
                <li><a href="/kategorie">Kategorie</a></li>
                <li><a href="/o-mne">O mně</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <article>
            <header>
                <h2>Jak jsem se naučil HTML5</h2>
                <p>Napsal axo, <time datetime="2026-05-10">10. května 2026</time></p>
            </header>

            <section>
                <h3>Začátky</h3>
                <p>Všechno začalo, když jsem poprvé otevřel editor a napsal svůj první
                <code>Hello World</code>. Byl to <strong>zlomový moment</strong>.</p>
            </section>

            <section>
                <h3>Sémantika</h3>
                <p>Postupně jsem pochopil, že <em>jak</em> píšeš HTML je stejně důležité
                jako <em>co</em> píšeš.</p>
                <figure>
                    <img src="img/html-schema.png" alt="Schéma struktury HTML5 stránky">
                    <figcaption>Obr. 1: Typická struktura HTML5 stránky</figcaption>
                </figure>
            </section>

            <section>
                <h3>Závěr</h3>
                <p>Kontaktovat mě můžeš na
                <address style="display: inline">
                    <a href="mailto:jan@blog.cz">jan@blog.cz</a>
                </address>.</p>
            </section>
        </article>

        <aside>
            <h2>O autorovi</h2>
            <p>axo: webový vývojář z Liberce.</p>
            <h2>Populární články</h2>
            <ul>
                <li><a href="#">CSS Grid za 10 minut</a></li>
                <li><a href="#">Flexbox pro začátečníky</a></li>
            </ul>
        </aside>
    </main>

    <footer>
        <p>&copy; 2026 Můj blog. Všechna práva vyhrazena.</p>
    </footer>
</body>
</html>

Řešení: doplněné style.css

css
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Roboto', Arial, sans-serif;
    font-size: 16px;
    line-height: 1.6;
    color: #333;
    max-width: 1100px;
    margin: 0 auto;
    padding: 0 1rem;
}

/* === HEADER === */
header {
    background: #1a1a2e;
    color: white;
    padding: 1.5rem 2rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

header h1 {
    font-family: 'Lora', serif;
    font-size: 2rem;
    color: white;
}

/* === NAV === */
nav ul {
    list-style: none;
    display: flex;
    gap: 1.5rem;
}

nav a {
    color: white;
    text-decoration: none;
    font-weight: 500;
}

nav a:hover {
    text-decoration: underline;
}

/* === MAIN === */
main {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: 2rem;
    padding: 2rem 0;
}

/* === ČLÁNEK === */
article {
    max-width: 70ch;
}

article h2,
article h3 {
    font-family: 'Lora', serif;
    color: #1a1a2e;
    margin-bottom: 0.75rem;
}

article h2 { font-size: 1.75rem; }
article h3 { font-size: 1.25rem; margin-top: 1.5rem; }

article p {
    font-size: 1rem;
    line-height: 1.8;
    margin-bottom: 1.25rem;
}

/* === FIGURE === */
figure {
    margin: 1.5rem 0;
    text-align: center;
}

figure img {
    max-width: 100%;
    border-radius: 4px;
}

figcaption {
    font-size: 0.875rem;
    color: #666;
    margin-top: 0.5rem;
}

/* === ASIDE === */
aside {
    background: #f8f9fa;
    padding: 1.5rem;
    border-radius: 8px;
    align-self: start;
}

aside h2 {
    font-size: 1.1rem;
    color: #1a1a2e;
    margin-bottom: 0.5rem;
    margin-top: 1rem;
}

aside h2:first-child { margin-top: 0; }

aside ul {
    list-style: none;
    margin-top: 0.5rem;
}

aside li {
    padding: 0.4rem 0;
    border-bottom: 1px solid #dee2e6;
}

aside a {
    color: #0066cc;
    text-decoration: none;
}

aside a:hover {
    text-decoration: underline;
}

/* === FOOTER === */
footer {
    background: #1a1a2e;
    color: #aaa;
    text-align: center;
    padding: 1.5rem;
    font-size: 0.875rem;
    margin-top: 2rem;
}

Část 3: Tipy pro obhajobu

Co u obhajoby říct

Začni přehledem, co jsi udělal:

"V zadání jsem dostal blog napsaný nesémanticky přes divy. Nahradil jsem je sémantickými HTML5 elementy: header pro záhlaví, nav pro navigaci, main pro hlavní obsah, article pro článek, section pro tematické bloky, aside pro postranní panel a footer pro zápatí. Doplnil jsem header článku s nadpisem h2 a time elementem pro datum. Přidal jsem figure s figcaption pro obrázek a address pro kontakt. V CSS jsem importoval Google Fonts (Roboto pro text, Lora pro nadpisy) a nastavil typografii: line-height 1.6, max-width 70ch pro čitelnost."

Klíčové pojmy pro teorii (co se zkoušející ptá)

PojemOdpověď
SémantikaHTML elementy popisují, co je obsah, ne jak vypadá
AccessibilityPřístupnost pro lidi se zdravotním postižením (čtečky obrazovky)
SEOSearch Engine Optimization, sémantika zlepšuje indexaci
<main>Jedinečný obsah stránky, použít jednou na stránku
<article> vs <section>article = přenositelný (smysl bez kontextu), section = tematická skupina
<header>Záhlaví, může být globální i lokální
<nav>Hlavní navigační bloky, ne pro každý seznam odkazů
<figure> + <figcaption>Obrázek s popiskem
<time datetime="...">Strojově čitelné datum v ISO 8601
<address>Kontakt vztažený k dokumentu nebo autorovi
rem vs emrem = relativní k root html, em = relativní k rodiči
max-width: 65chOptimální délka řádku 60-75 znaků pro čitelnost
line-height: 1.6Výška řádku, 1.5-1.8 doporučená
Web fontFont stažený ze serveru (Google Fonts, @font-face)
Font stackSeznam fontů, první dostupný se použije
font-display: swapFallback font dokud se web font nestáhne
<meta viewport>Responzivita, bez něj mobilní zoom out

Časté chytáky

OtázkaOdpověď
Proč nestačí styling pomocí divů?Čtečky pro nevidomé, vyhledávače a další vývojáři nepoznají strukturu jen z CSS tříd.
Kdy section a kdy article?Article: blogový post, produkt, komentář (přenositelné). Section: skupiny obsahu uvnitř stránky (Novinky, Galerie).
Může být víc <main> na stránce?Ne. Jen jeden <main> na stránku, drží unikátní obsah.
Co dělá <meta charset="UTF-8">?Nastaví kódování. Bez něj se diakritika zobrazí jako otazníky nebo čtverečky.
Proč <time datetime="...">?Strojově čitelný formát, čtečky a vyhledávače to umí pochopit. Text uvnitř je pro lidi.
*<strong> vs <b>?*<strong> má sémantický význam důležitosti. <b> je jen vizuální tučnost bez významu.
Co je font-display: swap?Když se web font načítá, zobrazí se fallback font. Po načtení se prohodí. Bez toho je text 1-3 sekundy neviditelný.
Kdy <address>?Jen pro kontaktní info k dokumentu (autor článku, kontakt na firmu v patičce). Ne pro libovolnou poštovní adresu v textu.

Časté chyby v praktické úloze

  • Zapomenuté <main> (typicky student nahradí jen vnitřní divy)
  • <nav> použitý pro každý <ul> s odkazy (např. patičkové linky uvnitř <footer> v pohodě, ale ne pro každý seznam)
  • <section> bez nadpisu (sekce by měla začínat h2/h3)
  • <article> použitý jako prostý wrapper bez vlastního obsahu
  • Zapomenutý <figcaption> u <figure>
  • <time> bez datetime atributu (ztrácí strojovou čitelnost)
  • font-display: swap chybí (text "blikne" když se font načte)
  • max-width pro text na příliš velkém čísle (60-75ch je optimum)
  • Hardcoded velikosti v px místo rem (horší pro accessibility)
  • Chybějící font fallback (jen font-family: 'Roboto' bez fallbacku)