body, div, span — základní stavební kameny každé stránky. Kdy použít div a kdy sémantický tag. Jak se vyhnout "div polévce".
Obaluje veškerý viditelný obsah stránky. Jen jeden body na stránku.
body je kontejner pro veškerý obsah, který uživatel vidí na stránce. Vše co chcete zobrazit — texty, obrázky, formuláře, navigace — musí být uvnitř body. Je pouze jeden body na stránku.
data-theme="dark" na body a přepínejte JS — celá stránka změní téma jednou CSS změnou. Uložte preferenci do localStorage.| class / id | Pro globální stylování a JS targeting | string |
| data-theme | Oblíbený vzor pro přepínání motivu | dark / light |
| onload | Spustí JS po načtení (raději addEventListener) | JS |
data-theme="dark" na body = snadné přepínání motivuclass="no-js" na body, JS odstraní = detekce bez JSdocument.body.classList.add("loaded")<body data-theme="light">
...
</body>
<!-- CSS -->
<style>
[data-theme="light"] {
--bg: #ffffff;
--text: #111111;
}
[data-theme="dark"] {
--bg: #0A0A0F;
--text: #E8E8F0;
}
body {
background: var(--bg);
color: var(--text);
}
</style>
<!-- JS přepínač -->
<script>
const btn = document.getElementById('theme-btn');
btn.addEventListener('click', () => {
const t = document.body.dataset.theme;
document.body.dataset.theme =
t === 'dark' ? 'light' : 'dark';
localStorage.setItem('theme',
document.body.dataset.theme);
});
</script>
Nejpoužívanější tag. Blokový kontejner bez sémantického významu — čistě pro layout a stylování.
div (division) nemá žádnou sémantiku — screen readery ho ignorují, Googlu nic neříká. To je v pořádku pro čistě layoutové kontejnery. Ale pokud existuje sémantický tag (section, article, nav, header...), použijte ho místo div.
| class | CSS třídy pro stylování (Flexbox/Grid kontejner) | string |
| id | Unikátní identifikátor pro JS nebo anchor | string |
| data-* | Vlastní datové atributy pro JS | string |
div.container = centrovat obsah (max-width + margin auto)<!-- ✅ div pro layout grid --> <div class="grid"> <div class="card">...</div> <div class="card">...</div> <div class="card">...</div> </div> <!-- ✅ div.container pro centrování --> <div class="container"> <header>...</header> <main>...</main> </div> <!-- ✅ div pro wrapper s data atributy --> <div class="modal" data-modal-id="confirm" aria-modal="true" role="dialog" > ... </div> <!-- ❌ div místo sémantického tagu --> <div class="header"> <div class="nav">...</div> </div> <!-- ✅ Správně --> <header> <nav>...</nav> </header>
/* Centrování obsahu */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 1rem;
}
/* Flex layout */
.flex { display: flex; gap: 1rem; }
/* Grid layout */
.grid {
display: grid;
grid-template-columns:
repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}
/* Karta */
.card {
background: #fff;
border: 1px solid #eee;
border-radius: 8px;
padding: 1.5rem;
}
Inline verze div. Pro stylování části textu nebo inline elementů bez přerušení toku textu.
span je neviditelný dokud mu nepřidáte CSS nebo JS. Nezalamuje na nový řádek — teče s okolním textem. Podobně jako div nemá sémantiku, ale je inline. Preferujte sémantické alternativy pokud existují.
| class | CSS třída pro stylování | string |
| id | Unikátní identifikátor | string |
| data-* | Vlastní datové atributy pro JS | string |
span[data-user-id] = oblíbený vzor pro JS targeting<!-- ✅ Stylování části textu -->
<p>Cena:
<span class="price">299 Kč</span>
</p>
<!-- ✅ Ikona v textu tlačítka -->
<button type="button">
<span class="icon" aria-hidden="true">
🛒
</span>
Do košíku
</button>
<!-- ✅ Data atribut pro JS -->
<p>Uživatel:
<span data-user-id="42"
class="username">
Jana Nováková
</span>
</p>
<!-- ✅ Barevné zvýraznění syntaxe -->
<pre><code>
<span class="keyword">function</span>
<span class="fn-name">greet</span>() {}
</code></pre>
<!-- ❌ span místo sémantického tagu -->
<span class="important">POZOR!</span>
<!-- ✅ Správně -->
<strong>POZOR!</strong>
display: block, display: inline, display: inline-block, display: flex, display: grid.