// htmltahak/ · 03 z 09

Sémantické HTML5

header, main, footer, nav, section, article, aside, address — elementy se značením, které prohlížečům, vyhledávačům a screen readerům říká co obsah znamená.

// Typický sémantický layout stránky
<header> — logo, navigace, herolandmark: banner
<nav>
navigace
landmark: navigation
<main> landmark: main
<section> — tematická sekce
<article> — samostatný obsah
<article> — samostatný obsah
<aside>
sidebar
landmark: complementary

Landmark role umožňují screen reader uživatelům přeskakovat přímo na hlavní části stránky pomocí klávesových zkratek.

<main>

Hlavní obsah

Jedinečný hlavní obsah stránky. Pouze jeden na stránku. "Skip to content" pro klávesnici.

BLOCKHTML5SEMANTIC

main označuje obsah, který je unikátní pro danou stránku — ne opakující se prvky jako navigace nebo footer. Screen readery umožňují přeskočit přímo na main. Jen jeden main na stránku a nesmí být vnořen do header, footer, nav, aside nebo article.

// "Skip to content" odkazPřidejte na začátek stránky skrytý odkaz <a href="#main-content" class="skip-link">Přeskočit na obsah</a>. Uživatelé klávesnice a screen readerů ho uvidí při focusu a mohou přeskočit celou navigaci. Jeden z nejdůležitějších accessibility vzorů.
Alternativy
<div id="main" role="main"> — nouzové
  • Jen jeden main na celou stránku
  • Nesmí být v header, footer, nav, aside, article
  • Google ho identifikuje jako hlavní obsah stránky
  • Přidejte id="main-content" pro skip link
Příklad se skip linkem
HTML + CSS
<!-- Skip link — první element v body -->
<a href="#main-content" class="skip-link">
  Přeskočit na obsah
</a>

<header>...</header>

<main id="main-content">
  <h1>Hlavní nadpis stránky</h1>
  <section>...</section>
  <article>...</article>
</main>

<footer>...</footer>

<!-- CSS pro skip link -->
<style>
.skip-link {
  position: absolute;
  top: -100%;
  left: 1rem;
  background: #000;
  color: #fff;
  padding: .5rem 1rem;
  border-radius: 0 0 4px 4px;
  text-decoration: none;
  z-index: 9999;
}
.skip-link:focus {
  top: 0; /* zobrazí se při focusu */
}
</style>
<section>

Tematická sekce

Tematicky soudržná část dokumentu. Měla by mít nadpis (h2–h6).

BLOCKHTML5SEMANTIC

section je tematicky soudržná část obsahu — jako kapitola v knize. Kdy použít: obsah tvoří logický celek a dává smysl v obsahu dokumentu. Kdy nepoužít: pro čistě layoutové skupení — k tomu slouží div.

// section vs div vs articlesection = část webu/dokumentu která patří k celku. article = samostatný obsah fungující bez kontextu. div = čistě layout bez sémantiky. Ptejte se: "Přidal bych to do osnovy dokumentu?" Ano → section. "Funguje to samo o sobě?" Ano → article. Jinak → div.
Alternativy
<div> pro čistě layoutové skupiny <article> pro samostatný obsah
Atributy
aria-labelPopis sekce (pokud nemá nadpis)string
aria-labelledbyID nadpisu sekceid
  • Každá section by měla mít nadpis (h2–h6)
  • Vnořené sections jsou OK — hierarchie
  • section ≠ article: section je část webu, article je samostatný
  • Bez nadpisu: použijte aria-label nebo raději div
Příklady
HTML
<main>
  <section id="o-nas">
    <h2>O nás</h2>
    <p>Jsme firma...</p>
  </section>

  <section id="produkty">
    <h2>Naše produkty</h2>
    <ul>...</ul>
  </section>

  <section id="reference">
    <h2>Co říkají zákazníci</h2>
    <!-- Každá recenze = article uvnitř section -->
    <article>
      <p>"Skvělý produkt!"</p>
      <footer>— Jan Novák</footer>
    </article>
    <article>
      <p>"Doporučuji!"</p>
      <footer>— Jana Dvořák</footer>
    </article>
  </section>

  <section id="kontakt">
    <h2>Kontakt</h2>
    <form>...</form>
  </section>
</main>
<article>

Samostatný obsah

Nezávislý obsah fungující bez okolního kontextu: blogový příspěvek, novinový článek, recenze, karta produktu.

BLOCKHTML5SEMANTIC

article označuje obsah, který dává smysl sám o sobě — dal by se vytáhnout a syndikovat na jiný web (RSS), přeposlat nebo zobrazit mimo kontext. Google může zobrazit v rich results. RSS čtečky ho automaticky rozpoznají.

// Kdy je obsah "article"Zeptejte se: "Mohl bych tento obsah zkopírovat na jiný web a dával by tam stále smysl?" Ano → article. Blogový příspěvek, novinový článek, recenze produktu, komentář, karta produktu, tweet/příspěvek = article. Sekce stránky "O nás" = section, ne article.
  • article může mít vlastní header a footer
  • Produktová karta = article
  • Komentář pod článkem = vnořený article
  • Google: article → kandidát na rich results
  • RSS čtečky identifikují article automaticky
Příklady
HTML
<!-- Blogový příspěvek -->
<article>
  <header>
    <h2>
      <a href="/clanek/html-tahak">
        HTML Taháček pro začátečníky
      </a>
    </h2>
    <p>
      Autor:
      <a href="/autor/jana">Jana</a>
      ·
      <time datetime="2024-03-15">
        15. 3. 2024
      </time>
    </p>
  </header>

  <p>Text článku...</p>

  <footer>
    <p>Tagy:
      <a href="/tag/html">HTML</a>,
      <a href="/tag/css">CSS</a>
    </p>
  </footer>
</article>

<!-- Karta produktu -->
<article class="product-card">
  <img src="nuz.jpg" alt="Victorinox Classic">
  <h3>Victorinox Classic</h3>
  <p class="price">299 Kč</p>
  <button type="button">Do košíku</button>
</article>
<aside>

Vedlejší obsah

Obsah volně související s hlavním obsahem: sidebar, callout box, reklama, biografie autora.

BLOCKHTML5SEMANTIC

aside označuje obsah, který je jen volně související s hlavním obsahem — sidebar, citáty vytrhovací (pull quotes), reklamy, widgety, biografie autora. Screen reader označuje jako "complementary" landmark.

// aside vs sectionPtejte se: "Mohl bych tento obsah odstranit a stránka by stále dávala smysl?" Ano → aside. Sidebar s doporučenými články, reklamy, widget počasí = aside. Hlavní obsah sekce = section.
Alternativy
<div class="sidebar"> — bez sémantiky
  • Sidebar mimo article = aside jako landmark
  • Pull-quote uvnitř article = aside
  • Reklamy patří do aside, ne main
  • SEO: Google identifikuje vedlejší obsah
Příklady
HTML
<!-- Layout s main + aside -->
<div class="layout">
  <main>
    <article>
      <h1>Název článku</h1>
      <p>Text...</p>

      <!-- Pull-quote uvnitř article -->
      <aside>
        <blockquote>
          "Nejlepší investice je vzdělání."
        </blockquote>
      </aside>

      <p>Pokračování...</p>
    </article>
  </main>

  <!-- Sidebar -->
  <aside aria-label="Sidebar">
    <section>
      <h3>Související články</h3>
      <ul>...</ul>
    </section>
    <section>
      <h3>O autorovi</h3>
      <p>Jana Nováková...</p>
    </section>
  </aside>
</div>
<address>

Kontaktní informace

Kontaktní info autora nebo organizace. Zobrazuje se kurzívou. Patří do footer nebo article.

BLOCKHTML5SEMANTIC

address poskytuje kontaktní informace pro nejbližší article nebo body. Může obsahovat email, telefon, fyzickou adresu, sociální sítě. Prohlížeče ho zobrazují kurzívou. Pozor: není pro fyzické adresy obecně — jen kontakt autora/organizace.

// Schema.org a addressKombinujte s Schema.org JSON-LD pro rich results. Google může zobrazit kontaktní informace přímo ve výsledcích vyhledávání (Knowledge Panel). address element je sémantický základ, Schema.org přidá strojové čtení.
Alternativy
<p> s kontakty — bez sémantiky
  • Patří do footer nebo article — ne jako obecná adresa
  • Prohlížeče zobrazují kurzívou (lze přebít CSS)
  • Schema.org crawleři ho rozpoznají
  • Jen pro kontakt autora/organizace, ne pro mapu
Příklady
HTML
<!-- V footer stránky -->
<footer>
  <address>
    <a href="mailto:info@web.cz">
      info@web.cz
    </a><br>
    <a href="tel:+420123456789">
      +420 123 456 789
    </a><br>
    Novákova 1, Praha 1, 110 00
  </address>
</footer>

<!-- V article (autor) -->
<article>
  <p>Text článku...</p>
  <footer>
    <address>
      Napsala:
      <a href="/jana">Jana Nováková</a>
    </address>
  </footer>
</article>

<!-- CSS: zrušit kurzívu -->
<style>
address { font-style: normal; }
</style>
← 02 Struktura 03 / 09 — Sémantické HTML5 04 Text →