display, position, z-index, float, object-fit, aspect-ratio, clip-path — komplexní přehled layoutových nástrojů CSS.
block, inline, inline-block, flex, grid, none, contents — definuje jak se element chová v layoutu.
display určuje jak element participuje v layoutu. none odstraní z dokumentu úplně (na rozdíl od visibility: hidden). contents je moderní hodnota — element sám zmizí z boxového modelu, ale jeho děti zůstanou ve flow.
| block | Nový řádek, plná šířka, přijímá width/height/margin |
| inline | Teče s textem, ignoruje width/height, vertikální margin |
| inline-block | Teče s textem, ALE přijímá width/height/margin |
| none | Odstraní z DOM layoutu úplně (ne visibility: hidden) |
| contents | Odstraní box, zachová children ve flow |
/* Skrýt / zobrazit */
.hidden { display: none; }
.visible { display: block; }
/* inline-block galerie */
.thumbnail {
display: inline-block;
width: 100px;
height: 100px;
vertical-align: top;
}
/* Toggle menu */
.menu { display: none; }
.menu.open { display: flex; }
/* display: contents pro přístupnost */
.nav ul {
display: contents; /* ul box zmizí */
}
/* li jsou nyní přímé děti flex nav */
/* Responsive hide */
@media (max-width: 768px) {
.desktop-only { display: none; }
}
@media (min-width: 768px) {
.mobile-only { display: none; }
}
static, relative, absolute, fixed, sticky. absolute je relativní k nejbližšímu positioned rodiči.
static (default): normální flow, top/left/etc. nemají efekt. relative: posune se relativně ke své normální pozici, zachová místo v layoutu. absolute: vytáhne z flow, pozicuje k nejbližšímu positioned rodiči (ne-static). fixed: relativní k viewportu. sticky: kombinace relative + fixed.
/* Sticky navigace */
.nav {
position: sticky;
top: 0;
z-index: 100;
}
/* Overlay přes celý rodič */
.card { position: relative; }
.card-overlay {
position: absolute;
inset: 0; /* top:0 right:0 bottom:0 left:0 */
background: rgba(0, 0, 0, 0.5);
}
/* Badge na kartě */
.card { position: relative; }
.badge {
position: absolute;
top: 8px;
right: 8px;
}
/* Fixed modal overlay */
.modal-backdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
.modal {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1001;
}
/* Centered absolute child */
.parent { position: relative; }
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* Sticky sidebar */
.sidebar {
position: sticky;
top: 1rem;
align-self: flex-start;
/* align-self: flex-start nutné v Flex! */
}
Vyšší číslo = vpředu. Funguje jen na positioned nebo flex/grid items. Stacking context záludnost!
z-index řídí vrstvení overlappujících elementů. Funguje pouze na: positioned elementy (relative, absolute, fixed, sticky), flex items a grid items. Stacking context: každý positioned element s z-index != auto tvoří nový stacking context — jeho děti se porovnávají jen uvnitř kontextu.
| 1–9 | Normální elevated prvky (karty, dropdowns) |
| 10–99 | Sticky header, sidebary |
| 100–999 | Modaly, dialogy, overlay |
| 1000+ | Toast notifikace, tooltips, system UI |
/* Definujte systém z-index hodnot */
:root {
--z-below: -1;
--z-base: 0;
--z-raised: 1;
--z-dropdown: 10;
--z-sticky: 20;
--z-overlay: 30;
--z-modal: 40;
--z-toast: 50;
--z-tooltip: 60;
}
/* Použití */
.dropdown { z-index: var(--z-dropdown); }
.nav-sticky { z-index: var(--z-sticky); }
.modal { z-index: var(--z-modal); }
/* isolation: isolate = stacking bez z-index */
.card {
isolation: isolate;
/* Děti karty se nebudou prolínat s okolím */
}
/* Záporný z-index — za rodiče */
.card-bg {
position: absolute;
z-index: -1;
/* Bude za rodičem ale před jeho rodiči */
}
Jak img nebo video vyplní svůj kontejner. cover = vyplnit (ořízne). contain = celý viditelný. object-position pro výřez.
object-fit funguje na <img>, <video> a dalších replaced elements. cover: vyplní celý kontejner, ořízne přesahující části (zachová poměr stran). contain: celý obsah viditelný, mohou být letterboxové pruhy. fill: roztáhne (deformuje).
/* Karta s obrázkem — cover */
.card-img {
width: 100%;
height: 200px;
object-fit: cover;
object-position: center;
}
/* Avatar — kruhový, cover */
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
object-fit: cover;
object-position: center top; /* hlava nahoře */
}
/* Produktový obrázek — contain */
.product-img {
width: 100%;
aspect-ratio: 1;
object-fit: contain;
background: #f9f9f9;
padding: 1rem;
}
/* Logo — scale-down (nepřekročí přirozený rozměr) */
.logo-img {
max-width: 200px;
height: 60px;
object-fit: scale-down;
}
/* Video background */
.video-bg {
width: 100%;
height: 100%;
object-fit: cover;
position: absolute;
inset: 0;
}
Zachová proporce bez fixní výšky. 16/9, 4/3, 1/1. Nahrazuje padding-top hack pro video embeddy.
aspect-ratio zachová poměr stran elementu — výška se dopočítá automaticky z šířky. Nahrazuje starý padding-top hack (padding-top: 56.25% pro 16:9). Funguje i na flex/grid items. Pokud obsah přesáhne výpočtenou výšku, element se zvětší.
/* Čtverec */
.square { aspect-ratio: 1; }
/* nebo: aspect-ratio: 1 / 1; */
/* Video embed 16:9 */
.video-wrap {
aspect-ratio: 16 / 9;
width: 100%;
}
.video-wrap iframe {
width: 100%;
height: 100%;
border: 0;
}
/* Produktová karta */
.product-img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
}
/* Avatar */
.avatar {
width: 48px;
aspect-ratio: 1;
border-radius: 50%;
object-fit: cover;
}
/* Thumbnail grid */
.gallery-item {
aspect-ratio: 1;
overflow: hidden;
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* ❌ Starý padding hack */
.old { padding-top: 56.25%; position: relative; }
.old > * { position: absolute; inset: 0; }
/* ✅ Moderní */
.new { aspect-ratio: 16 / 9; }
Ořízne element na tvar: inset, circle, ellipse, polygon, path. Animovatelné pro reveal efekty.
clip-path ořízne viditelnou oblast elementu na definovaný tvar — zbytek je neviditelný a neklikatelný. Tvary: inset(), circle(), ellipse(), polygon(), path(). Animovatelné — skvělé pro reveal efekty.
/* Kruh */
.circle {
clip-path: circle(50% at 50% 50%);
}
/* Trojúhelník */
.triangle {
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
}
/* Šikmý hero section */
.hero {
clip-path: polygon(
0 0, 100% 0, 100% 90%, 0 100%
);
}
/* Odříznutý roh */
.cut-corner {
clip-path: polygon(
0 0, calc(100% - 20px) 0,
100% 20px, 100% 100%,
0 100%
);
}
/* Reveal animace */
.reveal {
clip-path: circle(0% at 50% 50%);
transition: clip-path 0.5s ease;
}
.reveal.active {
clip-path: circle(150% at 50% 50%);
}
/* Hover reveal na kartě */
.card-img { clip-path: inset(0 0 0 0); }
.card:hover .card-img {
clip-path: inset(5px 5px 5px 5px round 8px);
}
/* Polygon hover morph */
.shape {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
transition: clip-path 0.4s ease;
}
.shape:hover {
clip-path: polygon(10% 0, 90% 0, 100% 100%, 0 100%);
}
Dnes převážně pro text obtékající obrázek. Pro layout: použijte Flex nebo Grid místo float!
float byl původní nástroj pro layout (před Flexbox/Grid). Dnes: jen pro text obtékající obrázek nebo prvek. Pro layout vždy použijte Flex nebo Grid — jsou prediktabilní, přístupné a nezpůsobují "clearfix" problémy.
/* ✅ Správné: text obtékající obrázek */
.article img {
float: left;
margin: 0 1.5rem 1rem 0;
shape-outside: circle(50%);
/* Text obtéká kulatý tvar! */
}
/* Clearfix — moderní způsob */
.clearfix { display: flow-root; }
/* nebo: overflow: hidden; */
/* ❌ Float pro layout — špatně */
.sidebar { float: left; width: 30%; }
.main { float: left; width: 70%; }
/* ✅ Flex místo float layoutu */
.layout { display: flex; gap: 2rem; }
.sidebar { flex: 0 0 280px; }
.main { flex: 1; }
/* shape-outside pro fancy obtékání */
.img-left {
float: left;
shape-outside: polygon(
0 0, 100% 0, 100% 75%, 0 100%
);
margin-right: 1rem;
}