Měnit velikost stránky i jednotlivých komponent už umíme díky předchozí podkapitole a díky jednotkám em a rem. Při změně velikosti okna se to děje skokově.
Co kdybychom ale stránku a komponenty chtěli zvětšovat plynule? Prostě elasticky se změnou šířky nebo výšky okna.
K tomu si přizveme dříve už také zmíněné jednotky viewportu, hlavně vw (setina šířky okna) a vh (setina výšky okna).
Elastická (nebo také plně responzivní) typografie je v době psaní textu spíše v počátcích bádání. Nevyřeší zdaleka všechny situace, pro které byste je možná chtěli nadšeně použít. Ale je cool i tak. A já ji tady uvedu, i kdyby mě natahovali na elastický skřipec.
Elastická typografie pomocí vw
Představte si, že nadpis článku chcete na stránce zvětšovat a zmenšovat podle šířky okna. To je jednoduché:
.heading {
font-size: 7vw;
}
Velikost písma bude na sedmi procentech šířky viewportu. Zmenšíme okno, a vše se zmenší. Zvětšíme ho, a vše se zvětší. Jupí! Zkuste si to na CodePenu. cdpn.io/e/mAAOLa
Kód je jednoduchý, funguje ve všech moderních prohlížečích a náhradní řešení pro ty starší bude jednoduché:
.heading {
font-size: 2em; /* Starší prohlížeče */
font-size: 7vw; /* Moderní prohlížeče */
}
Tak proč jsem tedy bručel o nějakých nevýhodách? Nerad kazím oslavu, ale pojďme si představit dvě situace:
- Jednotka
vwnezná váš layout. Neví, že jsou v něm fixně nastavené okraje nebo rámečky. Šířka.headingtak nemusí být vyjádřitelná v procentech ze šířky okna, na kterou sevwodkazuje. A text se prostě na některých viewportech zalomí jinak než na jiných. To vám může vadit. - Můžete chtít nastavit minimální a maximální velikost písma. Na mobilech bude sedm procent šířky okna už tak trochu trpasličí velikost, že ano?
První problém dokážu (za jistých podmínek) vyřešit v dalším textu. Ten druhý je zčásti řešitelný nastavením minimální velikosti v rem:
.heading {
font-size: calc(2rem + 7vw);
}
Velikost písma v ukázce nikdy neklesne pod 2rem. Nadpis se bude při změně šířky okna chovat elasticky. Pokud byste ale chtěli mít typografii důsledně pod kontrolou a zabránit různým zalomením textu na různých velikostech okna, bude se vám více líbit řešení následující.
Elastická typografie podle výšky komponenty
Moje řešení v zásadě nahrazuje jednotku, která v CSS neexistuje, ale pevně doufám, že jednou existovat bude: setinu výšky rodičovského elementu.
Jakmile se totiž odkážeme na rozměry rodiče, při výpočtu velikosti elementu se vezme v potaz layout konkrétní komponenty a text se nám na žádném viewportu nezalomí jinak, než bychom chtěli.
Pokud si onu výšku rodiče představíte jako fiktivní hodnotu heading-height-percent, kód by vypadal takto:
.heading {
font-size: 7 * heading-height-percent;
}
Počítáme teď sedm procent z výšky rodiče, nikoliv šířky stránky. Takže se nám text nezalomí, ani když šířku .heading nebude možné vyjádřit v procentech ze šířky okna.
A jak jsme vypočetli tu magickou hodnotu?
heading-height-percent =
(100vw - 2em) /* 1. Layout .heading */
/ 16 * 9 /* 2. Poměr stran .heading */
/ 100; /* 3. Získáme jedno procento */
Popíšu to ještě v textu:
- Layout
.heading: Prostě ze šířky stránky odečteme postranní okraje komponenty. Tím získáme její přesnou šířku. - Šířku
.headingpak vydělíme poměrem stran komponenty. Díky tomu máme vypočtenou výšku. - Výšku
.headinguž pak stačí vydělit stem, abychom získali procentuální údaj.
Ano, řešení to není triviální, a navíc vychází z toho, že znáte poměr stran komponenty. Ale já vám to říkal: Elastická typografie je složitější, než jste si možná mysleli. Jenže ty výsledky za to stojí, že?
Podrobněji to rozepisuji na Vzhůru dolů v článku „CSS řešení: Elastická typografie počítaná v procentech z výšky komponenty“. vrdl.cz/p/reseni-elasticka-typografie
Pokud jde o tipy na další možná řešení, můžete se obrátit na kolegy ze Smashing Magazine, konkrétně do jejich článku „Truly Fluid Typography With vh And vw Units“. vrdl.in/4g9xs
Máme tedy všechny nezbytné znalosti o typografii a jednotkách v CSS. A máme připravený grafický styl našeho e-shopu. Můžeme tedy začít stavět kód. I ten budeme samozřejmě vrstvit. Ne každý kousek kódu musíme u každého projektu napsat znovu. Proto si ukážeme sadu nástrojů, které ty nejzákladnější vrstvy obstarají za nás.