// csstahak/ · 01 z 10

Box Model

Každý HTML element je obdélník. box-sizing, width, height, padding, margin, border, outline, overflow — základ CSS layoutu.

// Anatomie box modelu — každý element je box
margin
border
padding
content
width × height
margin — Průhledný prostor vně elementu. Vždy průhledný, nedá se barvit.
border — Rámeček. Zabírá místo (v box modelu). Viditelný.
padding — Vnitřní odsazení. Background barva ho pokrývá.
content — Samotný obsah: text, obrázky... Width a height nastavují tuto oblast.
// Zlaté pravidlo Vždy nastavte * { box-sizing: border-box; } — pak width zahrnuje padding i border, výpočty jsou intuitivní.
box-sizing

Výpočet rozměrů

Jak se počítá width a height. border-box = zlatý standard, vždy nastavte globálně.

inherit

content-box (default): width NEzahrnuje padding a border — element je fyzicky širší než nastavená width. border-box: width zahrnuje vše — padding a border jsou uvnitř zadané šířky. border-box je výrazně intuitivnější.

// Konkrétní rozdílcontent-box: width: 200px + padding: 20px = fyzická šířka 240px. border-box: width: 200px + padding: 20px = fyzická šířka stále 200px. Content se zmenší aby se padding vešel.
Hodnoty
content-box border-box ← používejte toto
  • Globálně: *, *::before, *::after { box-sizing: border-box; }
  • Tailwind CSS nastavuje border-box automaticky
  • Výrazně zjednodušuje výpočty layoutu
  • Dědí se — stačí nastavit na *
Příklad
CSS
/* ✅ ZLATÉ PRAVIDLO — vždy nastavit */
*, *::before, *::after {
  box-sizing: border-box;
}

/* content-box (default) — NEINTUITIVNÍ */
.box-content {
  box-sizing: content-box;
  width: 200px;
  padding: 20px;
  /* Fyzická šířka: 240px! */
}

/* border-box — INTUITIVNÍ */
.box-border {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;
  /* Fyzická šířka: stále 200px */
  /* Content: 160px (200 - 20 - 20) */
}
Živá ukázka
content-box (width:100px)
⬅ 126px →
border-box (width:100px)
⬅ 100px →
Obě mají width:100px + padding:12px + border:3px
width / height

Rozměry elementu

auto, px, %, vw/vh, min-content, max-content, fit-content. min-width/max-width pro responzivitu.

auto: prohlížeč dopočítá (block = plná šířka rodiče, inline = dle obsahu). %: relativní k rodiči. vw/vh: viewport. fit-content: jako obsah ale nepřekročí dostupný prostor. min-content/max-content: minimální/maximální šířka dle obsahu.

// height: 100% záludnostheight: 100% funguje jen pokud rodič má explicitně nastavenou výšku. Lepší alternativa: min-height: 100vh na body, nebo CSS Grid s grid-template-rows: auto 1fr auto pro sticky footer.
Hodnoty
auto px % em / rem vw / vh dvh / svh min-content max-content fit-content
Longhand varianty
min-widthMinimální šířka — nepůjde pod tuto hodnotu
max-widthMaximální šířka — nepřekročí tuto hodnotu
min-heightMinimální výška
max-heightMaximální výška
  • max-width: 100% na img = responzivní obrázky
  • aspect-ratio: 16/9 místo padding-top hacku
  • dvh/svh pro mobilní viewporty (Dynamic/Small viewport)
  • width: min(90%, 1200px) = max-width zkratka
Příklady
CSS
/* Pevné */
.box { width: 300px; height: 200px; }

/* Responzivní kontejner */
.container {
  width: 90%;
  max-width: 1200px;
  margin: 0 auto;
}

/* Moderní zkratka */
.container {
  width: min(90%, 1200px);
  margin: 0 auto;
}

/* Viewport výška */
.hero { min-height: 100vh; }
.hero { min-height: 100dvh; } /* mobilní */

/* Podle obsahu */
.chip {
  width: fit-content;
  padding: 4px 12px;
}

/* Čtverec bez height */
.avatar {
  width: 60px;
  aspect-ratio: 1; /* = height: 60px */
}

/* 16:9 video container */
.video-wrap {
  width: 100%;
  aspect-ratio: 16 / 9;
}

/* Responsive img */
img {
  max-width: 100%;
  height: auto;
}
padding

Vnitřní odsazení

Prostor mezi obsahem a borderem. Background barva ho pokrývá. Shorthand: top right bottom left (TRouBLe).

padding je prostor uvnitř elementu. Background barva zasahuje do paddingu. Margin je vždy průhledný. Mnemotechnická pomůcka pro pořadí: TRouBLe = Top, Right, Bottom, Left.

// % padding záludnostProcentuální padding (i padding-top a padding-bottom!) je vždy relativní k ŠÍŘCE rodiče, ne výšce. To se využívá pro aspect-ratio hack: padding-top: 56.25% = 16:9 poměr (dnes nahrazen aspect-ratio vlastností).
Shorthand pořadí (TRouBLe)
padding: 16px padding: 8px 16px padding: 4px 8px 12px 16px
Longhand
padding-topHorní odsazení
padding-rightPravé odsazení
padding-bottomDolní odsazení
padding-leftLevé odsazení
padding-blockTop + bottom (logical property)
padding-inlineLeft + right (logical property)
  • TRouBLe = Top Right Bottom Left (pořadí 4 hodnot)
  • em padding škáluje s font-size
  • Nikdy záporný padding (jen margin může být záporný)
  • padding-inline a padding-block = moderní logical properties
Příklady
CSS
/* 1 hodnota = všechny strany */
.box { padding: 16px; }

/* 2 hodnoty: top/bottom, left/right */
.box { padding: 8px 16px; }

/* 3 hodnoty: top, left/right, bottom */
.box { padding: 4px 16px 8px; }

/* 4 hodnoty: top right bottom left */
.box { padding: 4px 8px 12px 16px; }

/* Longhand */
.box {
  padding-top: 16px;
  padding-right: 24px;
  padding-bottom: 16px;
  padding-left: 24px;
}

/* em = škáluje s font-size (doporučeno pro tlačítka) */
.btn {
  font-size: 1rem;
  padding: 0.6em 1.2em;
  /* Roste automaticky s font-size */
}

/* Logical properties (RTL-friendly) */
.box {
  padding-block: 1rem;   /* top + bottom */
  padding-inline: 1.5rem; /* left + right */
}
margin

Vnější odsazení

Průhledný prostor vně elementu. auto = centrovat. Pozor na margin collapsing! Záporné hodnoty jsou OK.

margin je průhledný prostor vně elementu. margin: 0 auto centruje blokový element horizontálně. Margin collapsing: vertikální marginy sousedních blokových elementů se slučují — bere se větší z nich. Záporné marginy jsou validní a užitečné.

// Margin collapsing — záludnosth1 s margin-bottom: 32px a p s margin-top: 16px → výsledná mezera 32px (ne 48px!). Collapsing se neděje v: Flexbox/Grid kontextu, při overflow: hidden/auto, mezi parent a first/last child (s paddingem nebo borderem na parentu).
Hodnoty
0 px em / rem % auto ← pro centrování záporné hodnoty ← OK!
Longhand
margin-top/right/bottom/leftJednotlivé strany
margin-blockTop + bottom (logical)
margin-inlineLeft + right (logical)
  • margin: 0 auto centruje blok (musí mít width)
  • Collapsing: Flex/Grid zabrání, overflow: hidden zabrání
  • margin-left: auto v flex = přitlačit vpravo
  • Záporné marginy = legitimní CSS technika (pull efekty)
Příklady
CSS
/* Centrovat blokový element */
.container {
  max-width: 1200px;
  margin: 0 auto;
}

/* Margin collapsing demo */
h1 { margin-bottom: 32px; }
p  { margin-top: 16px; }
/* Mezera = 32px (ne 48px!) */

/* Zabránit collapsing */
.parent {
  display: flex;         /* zabrání */
  flex-direction: column;
}

/* Margin auto v Flexboxu */
.nav { display: flex; }
.nav-right { margin-left: auto; }
/* nav-right se přitlačí doprava */

/* Záporný margin */
.pull-up {
  margin-top: -20px; /* posunout nahoru */
}

/* Logical properties */
.box {
  margin-block: 1.5rem;   /* top + bottom */
  margin-inline: auto;     /* centrovat */
}
margin: 0 auto; (s width nebo max-width)
margin: 0 auto; bez width na inline elementu
border

Rámeček

Shorthand: šířka styl barva. border-radius pro zaoblení. Různé styly: solid, dashed, dotted, double.

border shorthand: border: width style color. Zabírá místo v box modelu. border-radius zaoblí rohy — 50% na čtverci = kruh. outline je podobný ale nezabírá místo a je vně box modelu — ideální pro focus indikátory.

// border vs outlineborder = uvnitř box modelu, zabírá místo, ovlivní layout. outline = vně box modelu, nezabírá místo, neovlivní layout. Proto outline používáme pro :focus-visible — nezpůsobí posunutí ostatních elementů. NIKDY nevymažte outline bez náhrady!
Border styly
solid dashed dotted double groove ridge none
Longhand
border-widthŠířka: thin, medium, thick nebo px
border-styleStyl: solid, dashed, dotted...
border-colorBarva rámečku
border-top/right/bottom/leftJedna strana
border-radiusZaoblení rohů
outlineJako border ale vně box modelu
outline-offsetMezera mezi elementem a outline
  • border-radius: 50% + equal width/height = kruh
  • border-radius: 9999px = pill shape
  • NIKDY outline: none bez náhrady (přístupnost!)
  • Gradient border: background-clip: padding-box trik
Příklady
CSS
/* Shorthand */
.box { border: 2px solid #333; }

/* Jen jedna strana */
.underlined {
  border-bottom: 2px solid blue;
}

/* Zaoblení */
.card    { border-radius: 8px; }
.pill    { border-radius: 9999px; }
.circle  {
  border-radius: 50%;
  /* Potřebuje stejnou width a height! */
}

/* Různé rohy (TL TR BR BL) */
.custom { border-radius: 16px 4px 16px 4px; }

/* Outline pro focus */
:focus-visible {
  outline: 2px solid blue;
  outline-offset: 2px;
  /* NIKDY outline: none; bez náhrady! */
}

/* Gradient border (trik) */
.gradient-border {
  border: 2px solid transparent;
  background:
    linear-gradient(white, white) padding-box,
    linear-gradient(135deg, #818CF8, #F472B6)
      border-box;
}

/* border-image */
.fancy {
  border: 3px solid transparent;
  border-image:
    linear-gradient(to right, red, blue) 1;
}
Živá ukázka border-radius
0
4px
12px
pill
50%
mix
overflow

Přetékající obsah

Co se stane když obsah je větší než kontejner. visible, hidden, scroll, auto, clip.

visible (default): obsah přetéká, nezořízne se. hidden: ořízne přetékající obsah + clearuje floaty (vytvoří BFC). auto: scrollbar jen pokud obsah přetéká. scroll: scrollbar vždy. clip: ořízne bez BFC (modernější).

// overflow: hidden a BFCoverflow: hidden nebo auto vytvoří nový Block Formatting Context (BFC). Vedlejší efekty: clearuje floaty uvnitř, zabrání margin collapsingu s children. Toto bylo klasický způsob clearfix před Flexboxem.
Hodnoty
visible hidden scroll auto ← nejčastěji clip
Longhand
overflow-xHorizontální přetečení
overflow-yVertikální přetečení
text-overflow (bonus)
text-overflow: ellipsisOřízne text s "..." — potřebuje overflow: hidden + white-space: nowrap
  • auto/hidden = vytvoří BFC (clearuje floaty)
  • overflow-x: auto na tabulkách = responzivní
  • overflow: clip = jako hidden ale bez BFC
  • Scrollbar styling: scrollbar-width, scrollbar-color (Firefox), ::-webkit-scrollbar (Chrome)
Příklady
CSS
/* Oříznutí pro hover efekt */
.card { overflow: hidden; }
.card img:hover { transform: scale(1.1); }
/* Bez overflow: hidden by obrázek přetekl */

/* Responzivní tabulka */
.table-wrap { overflow-x: auto; }

/* Scrollovatelný sidebar */
.sidebar {
  height: 100vh;
  overflow-y: auto;
}

/* Text s "..." (ellipsis) */
.truncate {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
}

/* Víceřádkový ellipsis */
.clamp-3 {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Vlastní scrollbar */
.scroll-area {
  overflow-y: auto;
  scrollbar-width: thin;  /* Firefox */
  scrollbar-color: #888 transparent;
}
/* Chrome */
.scroll-area::-webkit-scrollbar { width: 6px; }
.scroll-area::-webkit-scrollbar-thumb {
  background: #888;
  border-radius: 3px;
}
outline

Obrys (nezabírá místo)

Jako border ale VNĚ box modelu — nezabírá místo, neovlivní layout. Povinné pro :focus-visible.

outline je obrys vně box modelu. Klíčový rozdíl od border: outline nezabírá místo — přidání outline neposune okolní elementy. Shorthand stejný jako border: width style color. Nikdy nevymažte outline bez náhrady — je to hlavní indikátor focusu pro klávesnicové uživatele.

// Přístupnost focusuMnoho vývojářů dělá: :focus { outline: none; } pro "čistší" design — tím znemožní navigaci klávesnicí pro uživatele se zdravotním postižením. Správně: :focus-visible { outline: 2px solid blue; } — zobrazí outline jen pro klávesnicový focus, ne pro myš.
Hodnoty
none 2px solid blue auto
Doplňující vlastnosti
outline-widthŠířka outlinespx
outline-styleStyl: solid, dashed, dottedsolid
outline-colorBarva outlinesbarva
outline-offsetMezera mezi elementem a outlinepx
  • NIKDY outline: none bez :focus-visible náhrady
  • :focus-visible = jen klávesnicový focus (ne myš)
  • outline-offset: 2px = mezera vypadá lépe
  • outline nezabírá místo → neovlivní layout
Správný focus pattern
CSS
/* ✅ Správně: :focus-visible */
:focus-visible {
  outline: 2px solid #2563EB;
  outline-offset: 2px;
}

/* ✅ Odstranit jen pro myš */
:focus:not(:focus-visible) {
  outline: none;
}

/* ✅ Vlastní focus pro tlačítka */
.btn:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 3px;
  border-radius: 4px; /* outline respektuje */
}

/* ❌ NIKDY toto! */
* { outline: none; }
:focus { outline: none; }
/* Znemožní navigaci klávesnicí! */

/* Outline nezabírá místo */
.box {
  width: 100px;
  outline: 10px solid red;
  /* Element stále zabírá jen 100px */
  /* Outline je navíc, vně */
}
← Přehled 01 / 10 — Box Model 02 Flexbox →