Obraz v rámu

O čem to je

Nastavíš tlačítku šířku 200 px, a ono je na obrazovce širší. Nastavíš dvěma odstavcům mezeru 20 px a mezi nimi je zase jen 20 px, ne 40. Obojí má jedno vysvětlení: box model.

Prohlížeč vidí každý element jako obdélníkovou krabici. Kdo ví, z čeho se krabice skládá, umí přesně spočítat rozměry a rozložení stránky.

Nové pojmy

Box modelZpůsob, jak CSS chápe každý element: jako krabici ze čtyř vrstev zevnitř ven – obsah, vnitřní okraj, rámeček, vnější okraj.Odstavec, obrázek i tlačítko jsou krabice.
px (pixel)Základní jednotka délky v CSS. Jeden CSS pixel je pevná malá délka na obrazovce.width: 200px;

Obraz v rámu na zdi

Představ si zarámovaný obraz. Uprostřed je malba. Kolem ní bílá paspartu. Pak dřevěný rám. A obrazy na zdi mezi sebou mají volné místo.

ObrazCSSVlastnost
malbaobsah (content)width, height
paspartuvnitřní okraj (padding)padding
rámrámeček (border)border
místo mezi obrazyvnější okraj (margin)margin
padding (vnitřní okraj)Prostor mezi obsahem a rámečkem. Má barvu pozadí elementu.padding: 10px; – 10 px ze všech čtyř stran.
border (rámeček)Čára kolem paddingu. Má tloušťku, styl a barvu.border: 2px solid black;
margin (vnější okraj)Průhledné místo vně rámečku. Odsouvá od elementu sousedy.margin: 20px auto; – nahoře a dole 20 px, vlevo a vpravo automaticky (vycentruje blok).

Proč je tlačítko širší

box-sizingŘíká, k čemu se vztahuje width. Výchozí content-box: šířka jen obsahu, padding a border se přičtou. border-box: šířka včetně paddingu a borderu.Mnoho webů nastaví * { box-sizing: border-box; }, aby se rozměry počítaly snadno.
width: 200px; padding: 20px; border: 5px solid; a výchozí content-box. Jak široký je element na obrazovce?
Obsah 200 + padding vlevo i vpravo 2 · 20 = 40 + border 2 · 5 = 10. Celkem 250 px. Margin se do šířky elementu nepočítá, jen kolem něj zabírá místo.
Totéž, ale s box-sizing: border-box. Jak široký je element a kolik zbude na obsah?
Celá krabice včetně paddingu a borderu má 200 px. Na obsah zbude 200 − 40 − 10 = 150 px.

Doplň vlastnost, která danou věc nastavuje.

✗Dva odstavce pod sebou s margin: 20px mají mezi sebou 40 px.
✓Mají mezi sebou 20 px. Svislé vnější okraje sousedních blokových elementů se slučují a platí ten větší.

Tomu se říká slučování okrajů (margin collapsing). Vodorovné okraje se neslučují.

Každý element je krabice: obsah, padding, border, margin. Při výchozím content-box se padding a border k width přičítají, při border-box jsou v ní. Svislé marginy sousedních bloků se slučují.

Počítáme

O čem to je

Grafik pošle návrh: karta široká 300 px, uvnitř odsazení 16 px, rámeček 1 px a mezi kartami 24 px. Ty to musíš převést do CSS tak, aby rozměry seděly na pixel. Naučíme se to spočítat.

Nové pojmy

Obsah (content)Vnitřek krabice: text nebo obrázek. Jeho rozměry jsou width a height (při výchozím nastavení).width: 300px;
Padding, border, marginPadding = vnitřní okraj (uvnitř rámečku, s barvou pozadí). Border = rámeček. Margin = vnější okraj (průhledný, odsouvá sousedy).padding: 16px; border: 1px solid #ccc; margin: 24px;
Zkrácený zápisJedna vlastnost pro čtyři strany. Čtyři hodnoty jdou po směru hodinových ručiček od horní: nahoře, vpravo, dole, vlevo. Dvě hodnoty = svisle, vodorovně.margin: 10px 20px 30px 40px; / padding: 8px 16px;
Blokový a řádkový elementBlokový (div, p, h1) začíná na novém řádku a zabere celou šířku rodiče. Řádkový (span, a, strong) teče v textu a width, height ani svislé marginy na něj nepůsobí.display: inline-block; je kompromis: teče v řádku, ale rozměry mu nastavit jde.

Vzorce

box-sizingŠířka na obrazovceŠířka obsahu
content-box (výchozí)width + padding L + P + border L + Pwidth
border-boxwidthwidth − padding L + P − border L + P
Zjisti, jaký je box-sizing.
Rozepiš padding a border na levou a pravou stranu.
Sečti podle tabulky.
Margin přičti zvlášť, jen když počítáš celkové místo, které krabice zabere.
width: 300px; padding: 16px; border: 1px solid; (content-box). Šířka na obrazovce?
300 + 2 · 16 + 2 · 1 = 300 + 32 + 2 = 334 px.
Grafik chce, aby celá karta měla 300 px. Jak to zařídíš a jak široký pak bude obsah?
Nastavím box-sizing: border-box; a width: 300px;. Obsah: 300 − 32 − 2 = 266 px. Druhá možnost bez border-box: width: 266px.
Kolik místa vodorovně zabere karta 334 px s margin: 0 12px?
334 + 12 + 12 = 358 px. Margin je vně rámečku, ale místo v řádku zabírá.
  • padding: 10px 20px – nahoře a dole 10 px, vlevo a vpravo 20 px
  • margin: 5px 10px 15px 20px – nahoře 5, vpravo 10, dole 15, vlevo 20 px
  • margin: 0 auto – svisle 0, vodorovně auto: blok s danou šířkou se vycentruje
  • border: 3px dashed red – červený přerušovaný rámeček 3 px

Rozlušti zkrácený zápis a teprve pak kartu otoč.

Slučování marginů

Když jsou dva blokové elementy pod sebou, jejich svislé marginy se nesečtou. Výsledná mezera je větší z nich. Horní odstavec margin-bottom: 30px, dolní margin-top: 20px → mezera 30 px.

✗margin: 10px 20px = vlevo 10 px, vpravo 20 px.
✓margin: 10px 20px = nahoře a dole 10 px, vlevo a vpravo 20 px.

Zkrácený zápis začíná vždy nahoře. Se dvěma hodnotami je první svislá, druhá vodorovná.

Při content-box je skutečná šířka = width + padding + border; při border-box je to přímo width. Margin je místo kolem krabice a svislé marginy sousedních bloků se slučují na ten větší. Zkrácený zápis jde od horní strany po směru hodinových ručiček.