Lekce 3 — CSS: jak stránka vypadá

Webové aplikace · navazuje na lekci 2 (struktura HTML)

Minule jste postavili stránku, která má kostru: hlavičku, menu, hlavní obsah, patičku. Vypadá ale pořád jako dokument z roku 1995 — černý text na bílém, modré podtržené odkazy. Dnes se naučíte, jak prohlížeči říct, jak má stránka vypadat. Na to je CSS (Cascading Style Sheets, kaskádové styly).

Rozdělení práce je jednoduché a stojí za to si ho pamatovat:

Proto jste minule nevybírali nadpis podle velikosti. Velikost je věc CSS.

1. Jak vypadá CSS pravidlo

CSS se skládá z pravidel. Každé pravidlo říká „těmhle prvkům nastav tohle“:

h1 {
    color: darkblue;
    font-size: 40px;
}
částv příkladuco to je
selektorh1Koho pravidlo stylí — tady všechny <h1> na stránce.
složené závorky{ … }Začátek a konec pravidla.
vlastnostcolorCo měníte — barvu textu, velikost, okraj…
hodnotadarkblueNa co to měníte.
dvojtečka a středník: a ;Dvojtečka odděluje vlastnost od hodnoty, středník ukončuje řádek (deklaraci).

Pravidel můžete mít za sebou kolik chcete a v každém kolik chcete deklarací. Komentář se v CSS píše /* takhle */ — žádné <!-- --> ani //.

Past č. 1: CSS vám chybu neřekne C# se při chybě nepřeloží a HTML vám aspoň zkontroluje validátor. CSS je jiné: když napíšete nesmysl, prohlížeč ho potichu přeskočí a jede dál. Žádná hláška, jen se „to nechce projevit“. Chybějící středník, překlep ve vlastnosti (colour místo color), mezera v 40 px — všechno vypadá stejně: nic se nestane. Jak takovou chybu najít, je v kapitole 7.

2. Kam CSS napsat

Jsou tři možnosti. Budete je potkávat všechny, ale používat budete hlavně třetí.

a) Přímo ke značce atributem style:

<p style="color: red;">Červený odstavec.</p>

Funguje, ale jen pro ten jeden prvek. Deset červených odstavců = deset stejných atributů, a když se rozhodnete pro modrou, přepisujete deset míst. Hodí se na rychlé zkoušení, ne na web.

b) Do značky <style> v <head>:

<head>
    <meta charset="UTF-8">
    <title>Moje stránka</title>
    <style>
        p { color: red; }
    </style>
</head>

Lepší — platí pro celou stránku. Ale jen pro tuhle stránku. Web o pěti stránkách by měl pět kopií stylů.

c) Do samostatného souboru — tohle je správná cesta. Vedle index.html vytvořte soubor styl.css:

/* styl.css — tady žádné <style>, jen pravidla */
p {
    color: red;
}

a v HTML ho připojte značkou <link> v <head>:

<head>
    <meta charset="UTF-8">
    <title>Moje stránka</title>
    <link rel="stylesheet" href="styl.css">
</head>

Jeden soubor stylů, na který odkazují všechny stránky webu. Změníte barvu na jednom místě a změní se všude. A HTML zůstane čisté — jen obsah a struktura.

Past č. 2: styl se vůbec nenačetl Když se na stránce neprojeví nic, ani to nejjednodušší pravidlo, skoro vždycky je chyba v <link>: soubor se jmenuje jinak (styly.css, Styl.css, styl.css.txt — Windows rády skrývají přípony), leží v jiné složce, nebo chybí rel="stylesheet". Rychlá kontrola: v prohlížeči zobrazte zdroj stránky (Ctrl+U) a klikněte na styl.css v odkazu. Když se neotevře váš soubor, cesta je špatně.
Změnil jsem CSS a nic se neděje Prohlížeč si CSS soubory ukládá do mezipaměti, aby je nemusel pořád stahovat. Když se změna neprojeví, zkuste nejdřív obnovit stránku natvrdo: Ctrl+F5 (nebo Ctrl+Shift+R). A zkontrolujte, že jste soubor opravdu uložili.

3. Selektory — koho stylujeme

Selektor vybírá, na které prvky pravidlo platí. Tady se vrací atributy class a id z minula:

selektorvyberepříklad v HTML
pvšechny značky <p><p>…</p>
.upozornenivšechny prvky s třídou upozorneni (tečka = třída)<p class="upozorneni">
#o-mneten jeden prvek s id="o-mne" (mřížka = id)<section id="o-mne">
nav aodkazy, které jsou někde uvnitř <nav> (mezera = „uvnitř“)<nav>…<a>…</a>…</nav>
h1, h2všechny <h1> a všechny <h2> (čárka = „a taky“)
p.upozornenijen <p>, které mají třídu upozorneni (bez mezery = „zároveň“)<p class="upozorneni">
.upozorneni {
    background-color: lightyellow;
    font-weight: bold;
}

nav a {
    color: white;
    text-decoration: none;   /* bez podtržení */
}

Rozdíl mezi nav a a nav, a je jedna čárka a úplně jiný význam: první jsou „odkazy v menu“, druhé „menu a k tomu všechny odkazy na stránce“. Čtěte selektory pozorně.

Prvek může mít víc tříd najednou, oddělených mezerou: <p class="upozorneni velke">. Platí na něj pak pravidla pro .upozorneni i pro .velke.

Past č. 3: tečka patří jen do CSS
<p class=".upozorneni">    <!-- špatně: tečka v HTML -->
<p class="upozorneni">     <!-- správně -->

upozorneni { … }           /* špatně: hledá značku <upozorneni> */
.upozorneni { … }          /* správně */
V HTML je jen jméno třídy. V CSS před ním musí být tečka (u id mřížka). A velikost písmen se počítá: Upozorneni a upozorneni jsou dvě různé třídy.
Třída, nebo id? Na stylování používejte třídy. id je jedinečné, takže styl na něm nejde použít podruhé, a jak uvidíte v kapitole 6, přebíjí skoro všechno ostatní — pak se s ním špatně pere. id si nechte na kotvy (href="#o-mne") a později na JavaScript.

4. Barvy, písmo, text

Vlastností jsou stovky. Na začátek vám stačí tyhle:

vlastnostco dělápříklad
colorbarva textucolor: #1e3a5f;
background-colorbarva pozadíbackground-color: #f4f4f4;
font-familypísmofont-family: Arial, sans-serif;
font-sizevelikost písmafont-size: 1.2rem;
font-weighttučnostfont-weight: bold;
text-alignzarovnání: left, center, righttext-align: center;
line-heightvýška řádku (bez jednotky = násobek velikosti písma)line-height: 1.5;
text-decorationpodtržení; none ho vypnetext-decoration: none;

Barvy se dají zapsat několika způsoby:

color: red;                  /* jménem — asi 140 jmen, na zkoušení dobré */
color: #c0392b;              /* hex: červená, zelená, modrá, každá 00–ff */
color: rgb(192, 57, 43);     /* totéž desítkově, každá složka 0–255 */

V praxi uvidíte nejčastěji hex. Nemusíte ho umět číst z hlavy — ve VS Code se vedle barvy v CSS objeví čtvereček, a když na něj najedete, otevře se výběr barev.

Písmo se píše jako seznam záloh. Prohlížeč použije první, které má počítač nainstalované:

font-family: "Segoe UI", Arial, sans-serif;

Název s mezerou patří do uvozovek. Na konci má vždycky být obecná rodina — sans-serif (bezpatkové), serif (patkové) nebo monospace (strojopis) — ta existuje všude.

Jednotky velikosti, zatím stačí tři:

Past č. 4: mezera mezi číslem a jednotkou
font-size: 20 px;    /* neplatí — prohlížeč to potichu zahodí */
font-size: 20px;     /* správně */
margin: 0;           /* nula jediná jednotku nepotřebuje */
Čitelnost má přednost Světle šedý text na bílém pozadí vypadá elegantně na vašem monitoru a nečitelně na mobilu na slunci. Text musí mít s pozadím dostatečný kontrast. Když si nejste jistí, tmavý text na světlém pozadí je vždycky bezpečná volba.

5. Každý prvek je krabice

Tohle je nejdůležitější myšlenka celé lekce. Pro prohlížeč je každý prvek obdélník — nadpis, odstavec, odkaz, obrázek. A každý ten obdélník má čtyři vrstvy:

margin — vnější okraj
border — rámeček
padding — vnitřní okraj
obsah (text)
vrstvaco to jejakou má barvu
paddingmezera mezi obsahem a rámečkemstejnou jako pozadí prvku
borderrámečekvlastní
marginmezera mezi rámečkem a sousedyžádnou — je průhledný
.karta {
    background-color: white;
    padding: 16px;                 /* text neleží na rámečku */
    border: 1px solid #cccccc;     /* tloušťka, styl, barva */
    border-radius: 8px;            /* zakulacené rohy */
    margin: 20px 0;                /* nahoře a dole 20px, vlevo a vpravo 0 */
}
Tohle je <article class="karta">. Text má kolem sebe vzduch díky padding.
A tohle je druhá karta. Mezera mezi nimi je margin.

margin a padding jdou zapsat zkráceně:

margin: 10px;                  /* všechny čtyři strany */
margin: 10px 20px;             /* nahoře+dole, vlevo+vpravo */
margin: 10px 20px 30px 40px;   /* nahoře, vpravo, dole, vlevo — po směru hodinových ručiček */
margin-top: 10px;              /* jen jedna strana: -top, -right, -bottom, -left */

Užitečný trik — vycentrovaný obsah. Text přes celou šířku širokého monitoru se špatně čte. Tohle ho omezí a posadí doprostřed:

main {
    max-width: 800px;     /* nejvýš 800px, na mobilu klidně méně */
    margin: 0 auto;       /* auto vlevo a vpravo = rozděl zbylé místo napůl */
}

Blokové a řádkové prvky. Pamatujete si <div> a <span> z minula? To byl právě tenhle rozdíl. Blokové prvky (div, p, h1, section, li…) začínají na novém řádku a roztáhnou se na celou šířku. Řádkové (span, a, strong…) teče s textem. Vlastnost display to umí přepnout — a tak se dělá menu v řádku:

nav ul {
    list-style: none;     /* pryč s odrážkami */
    padding: 0;
}

nav li {
    display: inline;      /* položky seznamu vedle sebe místo pod sebou */
    margin-right: 16px;
}

HTML zůstalo pořád stejné — sémantický seznam odkazů v <nav>. Změnil se jen vzhled. Přesně kvůli tomu jsme minule trvali na správné struktuře.

Proč je krabice širší, než jsem napsal? Normálně se width počítá jen pro obsah a padding s border se k tomu přičtou: width: 200px + padding: 20px + border: 1px = krabice široká 242 px. To mate každého. Tohle na začátek CSS souboru to přepne na „šířka je včetně paddingu a rámečku“:
* { box-sizing: border-box; }   /* * = všechny prvky */
Dělá to skoro každý web na světě. Dělejte to taky.

6. Když platí víc pravidel najednou — kaskáda

„Cascading“ v názvu CSS znamená, že na jeden prvek často míří víc pravidel a prohlížeč musí rozhodnout, které vyhraje. Stačí znát tři zásady:

1. Dědičnost. Některé vlastnosti — hlavně ty o textu (color, font-family, font-size, line-height) — se dědí z rodiče na všechno uvnitř. Proto stačí nastavit písmo jednou na body:

body {
    font-family: Arial, sans-serif;   /* zdědí všechno na stránce */
    color: #333333;
}

Vlastnosti o krabici (border, padding, margin, background-color) se nedědí. Kdyby se rámeček z <body> dědil, měl by ho každý odstavec.

2. Specifičtější selektor vyhraje. Čím přesněji selektor míří, tím má větší váhu: id > třída > značka.

p            { color: black; }
.upozorneni  { color: red; }     /* vyhraje nad p — třída je přesnější než značka */

<p class="upozorneni"> bude červený, i když pravidlo p by bylo napsané až pod ním.

3. Při shodě vyhraje to pozdější. Dvě pravidla se stejně přesným selektorem — platí to, které je v souboru níž:

h1 { color: blue; }
h1 { color: green; }   /* nadpis bude zelený */
Na !important zapomeňte Až budete hledat „proč se mi to nepoužije“, internet i AI vám poradí dopsat !important. Funguje to — přebije to všechno. A právě proto je to past: za týden potřebujete přebít to, tak přidáte další !important, a za měsíc máte soubor, ve kterém nikdo neví, co platí. Když pravidlo prohrává, zjistěte proč (kapitola 7) a opravte selektor.

7. Hledání chyb: Prozkoumat → Styles

Z minula znáte pravý klik → Prozkoumat (Inspect) a záložku Elements se stromem stránky. Když v něm kliknete na prvek, vpravo (nebo dole) uvidíte panel Styles. Je to nejlepší nástroj na CSS, jaký máte:

Úplně dole v panelu (nebo v záložce Computed) je navíc nakreslená krabice prvku s čísly — kolik má obsah, padding, border a margin. Najeďte myší na prvek ve stromu a prohlížeč tyhle vrstvy obarví přímo na stránce.

Past č. 5: chybějící středník nebo závorka
body {
    font-family: Arial, sans-serif     /* ← chybí středník */
    color: #333333;
}
Tohle nerozbije jen písmo. Prohlížeč čte Arial, sans-serif color: #333333 jako jednu (nesmyslnou) hodnotu a zahodí obě deklarace. Chybějící } je ještě horší — rozbije i pravidla pod sebou. Když „přestalo fungovat všechno od určitého místa dolů“, hledejte nad tím místem.

8. Úkoly

Pracujte na své stránce z minulé lekce. HTML měňte jen tam, kde to úkol říká — o to právě jde.

Úkol 1 · zahřívací

Připojte styl

Vedle svého index.html vytvořte styl.css a připojte ho přes <link>. Jako první pravidlo nastavte na body barvu pozadí, na kterou se nedá nevšimnout (třeba yellow). Uvidíte ji? Pak funguje připojení a můžete ji změnit na něco rozumného. Nastavte na body písmo a barvu textu a přidejte * { box-sizing: border-box; }.

Úkol 2

Hlavička a menu

Dejte <header> barevné pozadí, světlý text a padding. Menu v <nav> udělejte v řádku, bez odrážek, odkazy bez podtržení a v barvě, která jde na pozadí hlavičky přečíst. Patička: menší písmo, text na střed, nahoře tenká čára (border-top).

Úkol 3

Karty a obsah

Obsah stránky omezte na rozumnou šířku a vycentrujte (max-width + margin: 0 auto). Oba <article> ze sekce „co mě baví“ udělejte jako karty: pozadí, rámeček, zakulacené rohy, padding, mezera mezi nimi. Použijte na to třídu — přidejte do HTML class="karta" — ne selektor article. Proč je to lepší, budete umět vysvětlit?

Úkol 4

Oprava

Tohle HTML je v pořádku:

<head>
    <meta charset="UTF-8">
    <title>Opravna kol</title>
    <link rel="stylesheet" href="styl.css">
</head>
<body>
    <header>
        <h1>Opravna kol U Řetězu</h1>
        <nav>
            <ul>
                <li><a href="#cenik">Ceník</a></li>
                <li><a href="#kontakt">Kontakt</a></li>
            </ul>
        </nav>
    </header>
    <main>
        <p class="upozorneni">V srpnu máme zavřeno.</p>
    </main>
    <footer>&copy; 2026 U Řetězu</footer>
</body>

Tohle CSS ne. Je v něm 7 chyb a prohlížeč vám o žádné z nich neřekne. Přepište si oba soubory, otevřete stránku a najděte všechny — pomocí panelu Styles, ne hádáním. U každé chyby umějte říct, co přesně prohlížeč s tím řádkem udělal.

body {
    font-family: Arial, sans-serif
    color: #333333;
}

.hlavicka {
    background-color: #1e3a5f;
    color: white;
    padding: 16px;
}

h1 {
    font-size: 32 px;
}

#upozorneni {
    background-color: #fff3cd;
    padding: 10px;

nav a {
    colour: white;
    text-decoration: none;
}

footer {
    text-align: centre;
}
Úkol 5 · pro rychlé

Stejné HTML, jiný web

Zkopírujte styl.css jako styl2.css, v <link> ho přepněte a udělejte z té samé stránky něco úplně jiného — tmavé pozadí a světlý text, jiné písmo, jiné barvy, menu vpravo (text-align: right na nav). V HTML nesmíte změnit nic kromě toho jednoho href. Když to jde, máte HTML napsané správně. Když ne, zjistěte, co vám chybí — nejspíš třída, nebo sémantická značka místo <div>.

Bonus: najděte si, co dělá a:hover, a udělejte, ať se odkaz v menu změní, když na něj najedete myší.

Shrnutí — co byste měli umět říct vlastními slovy

Pravidlo pro AI platí pořád: klidně se ptejte „jaký je rozdíl mezi margin a padding?“ nebo si nechte vysvětlit, proč je deklarace přeškrtnutá. Ale u kontroly vám řeknu „zvětši mezeru mezi kartami, ale ne mezeru uvnitř nich“ nebo „proč je tenhle nadpis modrý?“ — a to musíte umět vy, ne chatbot. A pozor: AI ráda strčí do každé odpovědi !important a vygeneruje stovku řádků CSS, když stačí deset. Každý řádek, který odevzdáte, musíte umět vysvětlit nebo smazat.