Zde si představíme pár konceptů k CSS Box Alignment Module.
Nebojte se, nebudu to s teorií přehánět. Vybral jsem jen takové části teorie, bez kterých se nemůžete obejít.
Jde o jakousi zobecněnou esenci referenční příručky k jednotlivým vlastnostem. Pokud to tady vstřebáte, nemusíte zase tak moc studovat konkrétní vlastnosti zarovnání boxů v CSS.
Důležité pojmy
Podíváme se na pojmy jako „směr rozvržení“, „kontejner“ a „předmět“ nebo „náhradní řešení zarovnání“.
Směr rozvržení: bloková a řádková osa
Prohlížeče nám při tvorbě běžného layoutu umožňují jen dvourozměrný zážitek, a tak naštěstí zarovnáváme na dvě osy. Vzhledem ke složitosti téhle oblasti v CSS je to moc dobrá zpráva.
Dvě osy v rozvržení.
Osy pro potřeby layoutu v CSS:
- Hlavní neboli řádková osa (inline axis), ve středoevropských podmínkách obvykle vodorovná.
- Příčná neboli bloková osa (block axis), u nás obvykle svislá.
Osy se nejmenují „vodorovná“ a „svislá“, protože se jejich směr může v různých situacích měnit, když upravíme mód psaní (writing-mode) nebo jazyk dokumentu. Taková arabština nebo některé asijské jazyky se čtou ve zcela odlišných směrech.
O směru psaní dokumentu a tvorbě layoutu pro jazyky sázené v jiných směrech píšu více v textu o CSS logical properties, logických vlastnostech a hodnotách.
Výchozí směr rozvržení můžeme změnit například pomocí vlastnosti flex-direction. Zdroj: vrdl.in/uy9of.
Ze stejného důvodu nemůžeme například říci, že zarovnáváme „vlevo nahoru“, ale vždy na začátek nebo na konec určité osy. K tomu se ještě dostaneme.
Předmět a kontejner
Pro potřeby dalších textů budeme ještě potřebovat rozlišit mezi dvěma pojmy:
- Předmět zarovnání (alignment subject) je samotný boxík, který zarovnáváme. Zde mu občas budeme říkat také „položka“.
- Kontejner zarovnání (alignment container) je rámec, ve kterém předmět zarovnáváme. Obvykle jde o rodičovský element.
Kontejner a položky neboli předměty zarovnání.
Náhradní řešení zarovnání
„Fallback alignment“, nebo také náhradní zarovnání řeší situace, kdy nejsou splněny podmínky, které určité zarovnání vyžaduje.
Například pro to, aby vůbec platila hodnota space-between u vlastnosti justify-content (tedy rozprostření volného prostoru spravedlivě mezi položky), je nutné v kontejneru mít více než jeden předmět neboli položku.
Pokud tato podmínka není splněna, specifikace předepisuje jako náhradní řešení hodnotu flex-start nebo start.
To asi dává smysl, že?
Klíčová slova pro zarovnání
Už víme, že vlastnosti CSS Box Alignment je možné dělit podle toho, zda ovlivňují všechny položky, jednu položku, anebo prostor mezi nimi.
Druhý typ rozdělení vlastností pro zarovnávání se zaměřuje nikoliv na vlastnosti, ale jejich hodnoty – klíčová slova.
Poziční zarovnání
Určí polohu položky vzhledem ke kontejneru. (Ve specifikaci je používán pojem „Positional Alignment“.)
Týká se to už uvedených vlastností:
- Zarovnání všech položek (
justify-items,align-itemsaplace-items). - Zarovnání samostatné položky (
justify-self,align-selfaplace-self). - Distribuce obsahu (
justify-content,align-contentaplace-content).
V obecné rovině můžeme použít tyto hodnoty:
center(použitelné pro-selfi-content)
Centruje předmět doprostřed kontejneru zarovnání.start(-selfi-content)
Zarovnává předmět k hraně začátku kontejneru na patřičné ose.end(-selfi-content)
Zarovnává předmět k hraně konce kontejneru na patřičné ose.self-start(-self)
Zarovnává předmět k hraně začátku kontejneru, která odpovídá začátku předmětu na patřičné ose.self-end(-self)
Zarovnává předmět k hraně konce kontejneru, která odpovídá konci předmětu na patřičné ose.flex-start(-selfi-content, jen pro flexbox)
Totéž jakostart, jen pro položky flexboxu. Mimo flexbox se hodnota chová jakostart.flex-end(-selfi-content, jen pro flexbox)
Totéž jakoend, jen pro položky flexboxu. Mimo flexbox se hodnota chová jakoend.left(jenjustify-*)
Pokud hodnotu použijeme na řádkové ose, chová se jakostart.right(jenjustify-*)
Pokud hodnotu použijeme na řádkové ose, chová se jakoend.
Troufám si tvrdit, že naprostá většina z možností praktického použití CSS Box Alignment se týká právě pozičního zarovnání.
Mrkněme se na jednoduchý příklad. Máme následující HTML připravené pro třísloupcové rozvržení:
<div class="container">
<div class="item item--1">Item 1</div>
<div class="item item--2">Item 2</div>
<div class="item item--3">Item 3</div>
</div>
Layout je s pomocí CSS gridu definovaný následovně:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1em;
height: 5em;
}
Jen pro pořádek: Každá položka layoutu bude mít výšku 5em, spravedlivě si rozdělí prostor (1fr) a mezera mezi nimi bude 1em.
A teď přichází ke slovu ono zarovnání:
.container {
align-items: start;
}
.item--3 {
align-self: end;
}
Na nic nečekejme a vše vysvětleme:
- Kontejneru rozvržení (
.container) nastavíme po příčné ose (align-) zarovnání všech položek (-items) k horní hraně kontejneru (start). Dohromady tedyalign-items:start. - Třetí položce
.item--3udělíme výjimku. Bude zarovnaná ke spodní hraně kontejneru –align-self:end.
Pokud si to neumíte představit, podívejte se na živý CodePen, ale asi to nebude těžké.
CodePen: vrdl.in/i3v7a
Zarovnání na účaří
Zarovnání na účaří určuje polohu účaří položky nebo skupiny položek tím, že nad ni nebo nad ně přidává vnější okraj.
Zní to asi trochu zašmodrchaně, že? Ještě to chvíli vydržte, ono to není úplně neužitečné.
Při sazbě dokumentů v češtině (nebo jiných evropských jazycích) to funguje jen pro zarovnání položek vedle sebe, kde lze jednotlivá účaří porovnávat. (Ve specifikaci se mluví o „Baseline Alignment“, pokud byste to chtěli hledat.)
Týká se těchto vlastností:
- Zarovnání sebe sama (
justify-self,align-selfaplace-self). - Distribuce obsahu (
justify-content,align-contentaplace-content).
Můžete použít tyto hodnoty:
first baseline
Zarovnání na účaří prvního řádku. Pokud ale v daném kontextu nelze použít, zarovná se jakostart.last baseline
Zarovnání na účaří posledního řádku. Pokud ale v daném kontextu nelze použít, zarovná se jakoend.baseline
Zkratka profirst baseline.
V demíčku navážeme na strukturu HTML z předchozí ukázky.
Tentokrát ovšem přidáme tuto deklaraci:
.item--2,
.item--3 {
align-self: baseline;
}
.item--2 {
padding-top: 3em;
}
Čili:
- Na rozdíl od první položky zarovnáme druhou a třetí na účaří (
align-self:baseline). - Druhé položce přidáme vnitřní okraj (
padding-top:3em), takže prohlížeči zkomplikujeme jeho snahu o zarovnání.
CodePen: vrdl.in/9etio
Zarovnání zbylého prostoru
Určuje, co se stane s prostorem, který zbude mezi položkami na řádkové ose. (Ve specifikaci hledejte jako „Distributed Alignment“.)
Týká se to jen vlastností pro nastavení distribuce obsahu, tedy volného místa uvnitř kontejneru – justify-content, align-content a place-content.
Můžete použít tyto hodnoty:
stretch(výchozí)
Položky rozšíří své rozměry tak, aby v kontejneru nezbylo žádné volné místo. Pokud jsou položky menší než kontejner, jejich velikost se zvětší rovnoměrně (nikoli proporcionálně), přičemž stále respektují omezení uložená vlastnostmi jakomax-width/max-height.space-between
Volné místo se rovnoměrně rozdělí mezi položky, přičemž první a poslední je zarovnaná s hranou kontejneru.space-around
Volné místo se rovnoměrně rozdělí mezi položky a polovina mezery mezi položkami se vloží mezi hrany kontejneru a první a poslední položku.space-evenly
Volné místo se rovnoměrně rozdělí mezi položky i mezi první a poslední položku a okraje kontejneru.
Účinek je možné vidět v ukázce, která využívá stejné HTML jako ty předchozí. CSS jsme změnili, využijeme tentokrát flexbox:
.container {
display: flex;
justify-content: space-between;
}
.item {
width: 100px;
}
Jdeme na vysvětlování:
- Tím, že jsme omezili šířku položky na
100px, vznikne při roztažení rodiče (.container) volné místo. - Jak se s volným místem vedle položek naloží, určí právě vlastnost
justify-content. Hodnotaspace-betweendeklaruje, aby se volný prostor rovnoměrně rozpočítal do prostoru mezi položkami.
Účinek zarovnání zbylého prostoru pomocí vlastnosti justify-content.
CodePen: vrdl.in/f5vsg
Zarovnání pro přetečení (bez podpory prohlížečů)
Jde o vlastnosti a hodnoty, které pomáhají definovat chování prohlížečů, když je předmět zarovnání větší než jeho kontejner.
Co se má stát po přetečení obsahu z kontejneru, definuje vlastnost overflow-position, která má podle specifikace dvě možné hodnoty:
safe
Pokud má položka v daném způsobu zarovnání přetéct z obou stran, bude zarovnání změněno takovým způsobem, aby byl vidět začátek položky, například tak, aby bylo možné přečíst začátek textu.unsafe
Vždy dostane přednost poziční zarovnání, bez ohledu na to, zda bude oříznutý obsah čitelný nebo ne.
V případě hodnoty unsafe se použije poziční zarovnání. Alespoň teoreticky.
V době dokončování textu (únor 2022) se zdá, že naše milé prohlížeče se s implementací této vlastnosti úplně nepřetrhnou. Zatím tedy užitečná overflow-position zůstává jen „na papíře“ specifikace od W3C. Dřív to u moderních vlastnostní bylo pravidlem, dnes už naštěstí jen výjimkou, která možná potvrzuje nové pravidlo.
Definování mezer mezi položkami
Vlastnosti a hodnoty umožňují nastavení konzistentní mezery mezi položkami v řádku nebo sloupci a hlavně uvnitř CSS gridu.
Jde o různé varianty vlastnosti gap:
row-gap– mezera mezi řádky (na blokové ose)column-gap– mezera mezi sloupci (na řádkové ose)gap– zkratka pro vlastnosticolumn-gaparow-gap
Dříve se tytéž vlastnosti používaly pod stejnými názvy, jen s prefixem grid- (grid-row-gap, grid-column-gap, grid-gap). Prohlížeče je dodnes umí, jako synonyma pro výše uvedené. Nicméně vám doporučuji řídit se novou verzí specifikace a používat gap, například takto:
.container {
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr;
gap: 1em 0.5em;
}
Uvedené vytvoří odkaz na mřížku o třech sloupcích a dvou řádcích. Mezery mezi položkami layoutu budou 1em ve svislém směru a 0.5em ve vodorovném. Jako hodnoty bere vlastnost gap všechny možné délkové jednotky a také procenta, přičemž ty se vztahují na délku kontejneru layoutu.