// csstahak/ · 02 z 10

Flexbox

Jednorozměrný layout systém — řada nebo sloupec. Ideální pro navigaci, karty v řadě, centrování obsahu a distribuci prostoru.

// Flex vlastnosti — přehled: co platí kde
Na flex kontejneru (parent):
display: flex / inline-flex
flex-direction
flex-wrap
justify-content
align-items
align-content
gap / row-gap / column-gap
Na flex itemu (child):
flex-grow
flex-shrink
flex-basis
flex (shorthand)
order
align-self
margin: auto (speciální!)
Flexbox vs Grid: Flexbox = jednorozměrný (řada nebo sloupec). Grid = dvourozměrný (řady a sloupce zároveň). Kombinujte: Grid pro celostránkový layout, Flex uvnitř grid cells pro komponenty.
display: flex

Flex kontejner

Aktivuje Flexbox. Přímí potomci se stávají flex items a řadí se do řady.

KONTEJNER

display: flex aktivuje Flexbox na elementu. Přímí potomci (flex items) se automaticky řadí do řady (default). display: inline-flex = flexbox kontejner který se chová jako inline element. Flexbox funguje jen na přímé potomky.

// Flex vs Inline-flexflex = block-level kontejner (zabírá celý řádek). inline-flex = inline kontejner (teče s textem, šířka dle obsahu). Příklad: tlačítko s ikonou a textem vedle sebe = inline-flex.
Hodnoty
flex inline-flex
Živá ukázka — co display: flex udělá
Bez flex (block elementy):
Item A
Item B
Item C
S display: flex (řada):
Item A
Item B
Item C
  • Funguje jen na přímé potomky (ne vnuky)
  • Default: flex-direction: row, flex-wrap: nowrap
  • Flex items: defaultně flex: 0 1 auto
  • Absolutně pozicovaní potomci nejsou flex items
Nejčastější vzory
CSS
/* Základní flex */
.container { display: flex; }

/* Perfektní centrování */
.center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

/* Navigace */
.nav {
  display: flex;
  align-items: center;
  gap: 1rem;
}
.nav-right { margin-left: auto; }

/* Karty v řadě */
.cards {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

/* Sidebar + main */
.layout {
  display: flex;
  gap: 2rem;
}
.sidebar { flex: 0 0 240px; }
.main    { flex: 1; }

/* Inline tlačítko */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
flex-direction

Směr hlavní osy

row (vodorovně), column (svisle), row-reverse, column-reverse. Mění co je hlavní a křížová osa.

KONTEJNER

Definuje hlavní osu flexboxu. row = zleva doprava. column = shora dolů. Reverse varianty obrátí pořadí. Zásadní: justify-content pracuje podél hlavní osy, align-items podél křížové — s column se jejich "směry" prohodí.

// column pro komponentyflex-direction: column = layout jako tradiční blokové elementy, ale s mocí flexboxu. Skvělé pro: karta s tlačítkem vždy dole (flex-grow na prostředním elementu), chat bubbles (column-reverse pro správné pořadí).
Hodnoty
row row-reverse column column-reverse
Živá ukázka
row (default)
A
B
C
row-reverse
A
B
C
column
A
B
C
column-reverse
A
B
C
  • S column: justify-content = svislé, align-items = vodorovné
  • column-reverse: chat zprávy (nejnovější dole)
  • row-reverse: RTL layout nebo přehodit pořadí
Příklady
CSS
/* Karta: tlačítko vždy dole */
.card {
  display: flex;
  flex-direction: column;
  height: 100%;
}
.card-content { flex: 1; }
.card-btn { margin-top: auto; }

/* Chat: nejnovější zprávy dole */
.chat {
  display: flex;
  flex-direction: column-reverse;
  overflow-y: auto;
}

/* Mobilní: svislý layout */
.nav {
  flex-direction: column;
}
@media (min-width: 768px) {
  .nav {
    flex-direction: row;
  }
}
justify-content

Zarovnání na hlavní ose

Distribuuje prostor podél hlavní osy. space-between = nejčastější pro navigaci.

KONTEJNER

Zarovná flex items podél hlavní osy (row = horizontálně, column = vertikálně). flex-start = u začátku. center = uprostřed. space-between = mezery mezi items (krajní k okraji). space-around = mezery kolem. space-evenly = všechny mezery stejné.

// space-between vs space-evenlyspace-between: první item vlevo, poslední vpravo, mezery mezi — ideální pro navigaci logo/menu. space-evenly: všechny mezery stejné včetně krajů — ideální pro rovnoměrné rozmístění karet.
Hodnoty
flex-start flex-end center space-between space-around space-evenly stretch
Živá ukázka
flex-start
A
B
C
center
A
B
C
space-between
A
B
C
space-evenly
A
B
C
  • space-between: krajní items na okraje (navigace)
  • space-around: každý item má stejné mezery kolem (krajní ½)
  • space-evenly: všechny mezery stejné
  • gap + center = centrovat s pevnými mezerami
Příklady
CSS
/* Navigace: logo vlevo, menu vpravo */
.nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

/* Centrovat tlačítka */
.btn-group {
  display: flex;
  justify-content: center;
  gap: 1rem;
}

/* Karty rovnoměrně */
.cards {
  display: flex;
  justify-content: space-evenly;
}

/* Centrovat vertikálně (s column) */
.hero {
  display: flex;
  flex-direction: column;
  justify-content: center; /* svisle */
  align-items: center;     /* vodorovně */
  min-height: 100vh;
}
align-items

Zarovnání na křížové ose

Zarovná flex items kolmo k hlavní ose. stretch = roztáhne. center = vertikálně centruje (v row).

KONTEJNER

Zarovná flex items podél křížové osy (kolmá k flex-direction). V row = vertikálně. V column = horizontálně. stretch (default) = roztáhne na výšku kontejneru. baseline = zarovná dle textové základny.

// align-self přepíše pro jedno dítěalign-items nastaví zarovnání pro všechny flex items. align-self na konkrétním item přepíše toto nastavení pouze pro něj. Například: většina items align-items: center, ale jeden má align-self: flex-start.
Hodnoty
stretch flex-start flex-end center baseline
Živá ukázka
stretch (default)
A
B
C
flex-start
A
B
C
center
A
B
C
baseline
A
B
C
  • stretch roztáhne item na výšku kontejneru
  • baseline = zarovnání textové základny (různé font-size)
  • align-self na child přepíše align-items
  • stretch vyžaduje aby child neměl pevnou výšku
Příklady
CSS
/* Dokonalé centrování */
.hero {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

/* Navbár s různou výškou items */
.nav {
  display: flex;
  align-items: center; /* vše na střed */
}

/* Baseline zarovnání pro stats */
.stat {
  display: flex;
  align-items: baseline;
  gap: 0.25rem;
}
.stat-number { font-size: 3rem; }
.stat-label  { font-size: 0.8rem; }

/* align-self pro jedno dítě */
.cards {
  display: flex;
  align-items: stretch;
}
.cards .featured {
  align-self: flex-start; /* toto je jiné */
}
flex-wrap

Zalamování flex items

nowrap = přetečou, wrap = zalomí na nový řádek. wrap + flex-basis = responzivní grid bez media queries.

KONTEJNER

nowrap (default): všechny items v jedné řadě, i za cenu překryvu nebo přetečení. wrap: zalomí na nový řádek když se items nevejdou. wrap-reverse: zalomí opačně. Kombinace s flex-basis vytvoří responzivní grid bez media queries.

// Responzivní grid bez media queriesflex-wrap: wrap + flex: 1 1 250px na dětech = items mají min. šířku 250px ale mohou se rozrůst. Při 800px kontejneru: 3 sloupce. Při 500px: 2 sloupce. Automaticky, bez media queries. Praktická alternativa ke Grid pro karty.
Hodnoty
nowrap wrap wrap-reverse
align-content (pro víceřádkový wrap)
stretch flex-start center space-between space-evenly
  • wrap + flex-basis = responzivní bez media queries
  • align-content = zarovnání víceřádkových wrap skupin
  • gap funguje správně i s flex-wrap
  • nowrap s overflow: hidden = skrytí přetékajících items
Responzivní karty bez media queries
CSS
/* ✅ Responzivní grid bez media queries */
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
.card {
  flex: 1 1 250px;
  /* min 250px, může růst i se smrštit */
}
/* Při 800px kontejneru: ~3 sloupce */
/* Při 500px kontejneru: ~2 sloupce  */
/* Při 250px kontejneru: 1 sloupec   */

/* nowrap: karty v řadě, nepřeskakují */
.features {
  display: flex;
  flex-wrap: nowrap;
  overflow-x: auto; /* scroll místo wrap */
  gap: 1rem;
}

/* align-content pro wrap */
.grid {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  /* skupiny řádků začínají nahoře */
}
gap

Mezery mezi items

Nahrazuje margin triky. Mezera JEN mezi items, ne na krajích. Funguje v Flex i Grid.

FLEX + GRID

gap přidá mezeru mezi flex nebo grid items — ne na krajích kontejneru. Před gap: margin: 0 8px na dětech + negativní margin na rodiči. S gap: jedna vlastnost, žádné hacky. gap: row column pro různé mezery v každém směru.

// Proč gap místo marginMargin na flex items: margin se přidá i na krajích (první a poslední item). Gap: mezera pouze mezi items, krajní items jsou u okraje kontejneru. Jednodušší CSS, předvídatelné chování.
Hodnoty
px rem em % gap: row col
Longhand
row-gap column-gap
  • gap = mezera pouze mezi items
  • row-gap a column-gap = longhandy
  • gap: 1rem 2rem = svisle 1rem, vodorovně 2rem
  • Funguje v Flex i Grid
Příklady
CSS
/* Flex s mezerami */
.nav {
  display: flex;
  gap: 1rem; /* mezera mezi všemi items */
}

/* Různé mezery */
.grid {
  display: flex;
  flex-wrap: wrap;
  gap: 2rem 1rem;
  /* row-gap: 2rem; column-gap: 1rem; */
}

/* Jen column gap */
.inline-row {
  display: flex;
  column-gap: 0.5rem;
}

/* ❌ Starý způsob s margin */
.old-nav a { margin: 0 0.5rem; }
.old-nav a:first-child { margin-left: 0; }
.old-nav a:last-child  { margin-right: 0; }

/* ✅ Nový způsob */
.new-nav { display: flex; gap: 1rem; }
display: flex; gap: 1rem;
margin: 0 0.5rem na každém child
flex / flex-grow / flex-shrink / flex-basis

Flex item chování

Jak item roste, smršťuje a jak velký je výchozí. Shorthand: flex: grow shrink basis.

ITEM

flex-grow: poměr růstu (0 = neroste). flex-shrink: poměr smrštění (1 = smršťuje, 0 = nesmršťuje). flex-basis: výchozí velikost před distribucí volného prostoru. Shorthand: flex: grow shrink basis.

// flex: 1 vs flex: auto vs flex: noneflex: 1 = 1 1 0% (roste, smršťuje, začíná od 0). flex: auto = 1 1 auto (roste, smršťuje, začíná od přirozené šířky). flex: none = 0 0 auto (nepružný, zachovává přirozenou šířku). flex: 0 0 200px = pevná šířka 200px.
Nejčastější hodnoty flex shorthand
flex: 1 ← nejčastější flex: auto flex: none flex: 0 0 200px flex: 0 1 auto
Živá ukázka — flex: 1 vs flex: none
flex: 1 (roste rovnoměrně)
flex:1
flex:1
flex:2
sidebar (flex: none) + main (flex: 1)
sidebar: flex none (80px)
main: flex 1
  • flex: 1 = vyplnit dostupný prostor rovnoměrně
  • flex: none = nepružný, zachovává přirozenou šířku
  • flex: 0 0 240px = pevná šířka (sidebar)
  • min-width: 0 na item zabrání overflow textu
Příklady
CSS
/* Sidebar + main layout */
.layout { display: flex; gap: 2rem; }
.sidebar { flex: 0 0 240px; } /* pevná */
.main    { flex: 1; }          /* zbytek */

/* Stejně velké karty */
.cards { display: flex; gap: 1rem; }
.card  { flex: 1; } /* všechny stejně */

/* Logo nepružné, nav roste */
.header { display: flex; gap: 1rem; }
.logo   { flex-shrink: 0; }
.nav    { flex: 1; }

/* Responzivní: min 200px, roste */
.item { flex: 1 1 200px; }

/* flex-grow poměry */
.a { flex-grow: 1; } /* 1 díl */
.b { flex-grow: 2; } /* 2 díly (2× širší) */
.c { flex-grow: 1; } /* 1 díl */
/* 4 díly celkem: 25% / 50% / 25% */

/* Zabránit overflow textu */
.item {
  flex: 1;
  min-width: 0; /* důležité! */
  overflow: hidden;
  text-overflow: ellipsis;
}
order

Vizuální pořadí

Mění pořadí bez změny DOM. Default: 0. Záporné = dřív, kladné = pozdějš. Pozor na přístupnost!

ITEM

order mění vizuální pořadí flex nebo grid items bez změny HTML struktury. Default 0 pro všechny. Záporné číslo = dřív, kladné = pozdějši. Pozor: screen readery čtou originální DOM pořadí, ne vizuální — může způsobit zmatenou navigaci klávesnicí.

// Kdy order použítMobilní layout: důležitý obsah (main) vizuálně první na mobilu ale v HTML za sidebarem (pro SEO). Na desktopu obnovit normální pořadí v media query. Vždy zvažte zda raději nepřepsat HTML pořadí.
Hodnoty
0 -1 ← dřív 1 ← pozdějš libovolné číslo
Živá ukázka
DOM: A B C → order: B=-1, A=0, C=1
A (order:0)
B (order:-1)
C (order:1)
Vizuální pořadí: B A C (B je první díky order:-1)
  • Screen reader čte DOM pořadí, ne vizuální!
  • Klávesnicová navigace Tab sleduje DOM pořadí
  • Raději přepsat HTML pořadí pokud možno
  • Vhodné pro: mobilní layout, hero vs sidebar pořadí
Příklady
CSS
/* Přehodit pořadí na mobilu */
@media (max-width: 768px) {
  .sidebar { order: 2; } /* dole */
  .main    { order: 1; } /* nahoře */
}

/* Na desktopu: obnovit normální */
@media (min-width: 768px) {
  .sidebar { order: 0; }
  .main    { order: 0; }
}

/* Featured card jako první */
.card          { order: 0; }
.card.featured { order: -1; }

/* Poslední item přesunout na začátek */
.badge { order: -999; }
// Praktické Flexbox vzory — copy-paste ready
CSS — nejčastější vzory
/* 1. Dokonalé centrování */
.center {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* 2. Navigace: logo vlevo, nav vpravo */
.navbar {
  display: flex;
  align-items: center;
  gap: 1rem;
}
.navbar .spacer { flex: 1; }
/* nebo: */
.navbar nav { margin-left: auto; }

/* 3. Sidebar + main */
.layout {
  display: flex;
  gap: 2rem;
  align-items: flex-start;
}
.sidebar { flex: 0 0 280px; }
.main    { flex: 1; min-width: 0; }

/* 4. Karty se stejnou výškou tlačítka dole */
.cards { display: flex; flex-wrap: wrap; gap: 1rem; }
.card {
  flex: 1 1 250px;
  display: flex;
  flex-direction: column;
}
.card-body { flex: 1; }
.card-btn  { margin-top: auto; }

/* 5. Responzivní grid bez media queries */
.auto-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
.auto-grid > * { flex: 1 1 200px; }

/* 6. Horizontální scroll (karousel) */
.carousel {
  display: flex;
  gap: 1rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}
.carousel-item {
  flex: 0 0 300px;
  scroll-snap-align: start;
}
← 01 Box Model 02 / 10 — Flexbox 03 Grid →