Novinky v Google Fonts CSS API v2

Petr Bulánek
SUPERKODERS
Published in
6 min readJun 30, 2020

Pár týdnů zpátky došlo k modernizaci designu Google Fonts a funkčnosti hlavního webu a současně s ním i ke spuštění nového CSS API ve verzi 2, s nímž bych vás na následujících řádcích rád seznámil.

Hned na začátek si dovolím jednu radu z ranku „zjištěno za vás“. Pokud budete jako já několik dlouhých minut hledat, kde se sakra na tom novém webu zaškrtává subset (například latin extended pro českou znakovou sadu), tak vám ušetřím čas a rovnou poradím: nikde. Pojďme rovnou na všechny novinky.

Co je nového?

V prvé řadě se nám změnila základní URL adresa, kam posíláme request s našimi parametry. Nově vypadá takto:

https://fonts.googleapis.com/css2

Od původní varianty adresy se tak liší jen onou dvojkou na konci. V dalších ukázkách pak budu pro jednoduchost používat již jen část za lomítkem.

Parametr family

Konkrétní dotaz na font Roboto, který nám bez dalších nastavení vrátí řez normal (400), by mohl vypadat následovně:

/css2?family=Roboto

Základní parametr family vypadá na první pohled beze změny, opak je ale pravdou.

První odlišnosti oproti původnímu API si lze všimnout hned při dotazu na jiný než výchozí řez. Dejme tomu, že chceme tučný text (700), pak musíme naši adresu upravit takto:

/css2?family=Roboto:wght@700

Axisy a jejich hodnoty

Výraz mezi dvojtečkou a zavináčem představuje tzv. axis. Těchto axisů je několik druhů a korespondují s CSS vlastností font-variant-settings, která poskytuje kontrolu nad zobrazováním variabilních fontů.

Různé fonty podporují různé axisy, my se spokojíme pouze s wght, který říká, že nás zajímá tloušťka řezu (font-weight), a s ital, kterým pro změnu určujeme, zda chceme (hodnota 1) či nechceme (hodnota 0) kurzívu (font-style: italic). Tyto axisy nás budou pravděpodobně zajímat nejčastěji a hlavně je jejich podpora napříč jednotlivými rodinami písem nejrozšířenější.

Při definici více axisů je oddělujeme čárkami, korespondující hodnoty pak vypíšeme v adrese za zavináčem a oddělujeme je pomocí středníků. Pokud se rozhodneme, že kromě tučného fontu chceme ještě normální řez včetně kurzívy, použijeme tuto podobu adresy:

/css2?family=Roboto:ital,wght@0,400;0,700;1,400

Důležité: Jednotlivé axisy je nutné vypisovat v abecedním pořadí a jejich hodnoty (vždy po skupinkách — tzv. tuples) numericky vzestupně. Následující adresa, kde je výše zmíněné pravidlo kvůli ukázce záměrně porušené, nám tedy nebude fungovat.

/css2?family=Roboto:ital,wght@0,400;1,400;0,700

Google je naštěstí dostatečně chytrý a na chybu nás upozorní vrácením stavového kódu 400 a chybovou hláškou: Tuples must be sorted.

Více rodin písem

Jednotlivé rodiny fontů se nově definují pomocí samostatného family parametru (s ampersandem mezi nimi), ačkoli dříve stačilo oddělení pomocí svislítka („pajpy“), následovně:

/css2?family=Roboto&family=Open+Sans

Parametry display a text

Co naopak zůstalo beze změny jsou parametry text a display, takže tato část je pouze pro zopakování.

Pomocí parametru display určujeme, co se bude dít, když font není k dispozici (zpravidla se ještě načítá). Hodnoty jsou totožné s hodnotami CSS vlastnosti font-display. Google Fonts ve svém GUI defaultně navrhují hodnotu swap (prohlížeč velmi krátkou dobu čeká na stažení fontu, jestliže se to nestihne, zobrazí nejprve náhradní písmo a námi zvolený font až následně po stažení):

/css2?family=Roboto&display=swap

Pomocí parametru text můžeme dosáhnout datové úspory tím, že Google Fonts řekneme, že si přejeme, aby nám do fontu zahrnul pouze konkrétní znaky. Například jestliže víme, že nás zajímají jenom malá písmena anglické abecedy, potom můžeme použít tuto adresu:

/css2?family=Roboto&text=abcdefghijklmnopqrstuvwxyz

Tím se dostáváme k další důležité změně oproti původnímu API, která se týká subsetů.

Subsety

Doposud jsme se blíže vůbec nepodívali, co na námi sestavené URL adrese Google Fonts zobrazí. Zkusíme to s naším oblíbeným Robotem. Směle do toho.

https://fonts.googleapis.com/css2?family=Roboto

V tomto kroku bude záležet na tom, jaký prohlížeč používáme. Modernější prohlížeče jako je třeba Chrome by nám měli zobrazit něco podobného tomuto:

/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

/* + dalších 5 definic @font-face */

Pozorný čtenář si teď bude říkat: počkat, počkat, já mám ale přece web v češtině a nechci, aby mi prohlížeč stahoval cyrilici, vietnamskou abecedu a další znaky, které vůbec nepotřebuji — co mám dělat, aby mi Google Fonts poslaly jenom latinku?

Jistě si vzpomenete, že jsem hned v úvodu upozorňoval, že vlastní subset v novém API nastavit nelze. To by nám ale nemělo vadit, v CSS si totiž všimněme vlastnosti unicode-range.

Google Fonts za nás nově font automaticky rozdělí po různých znakových sadách a pomocí této vlastnosti se zajistí, že se použijí právě ty soubory, které obsahují znaky používané na našem webu. Pokud si web vystačí pouze s latinkou, dostaneme jen tu a kromě pár řádků CSS navíc se nic dalšího stahovat nebude.

To „zbytečné“ CSS navíc v sobě skrývá jednu relativně důležitou výhodu. Máme zajištěno, že pokud se nám někdy v budoucnu na webu objeví nějaký text ve znakové sadě, se kterou jsme původně nepočítali, tak se nám zobrazí korektně (za předpokladu, že ji konkrétní font zahrnuje), aniž bychom museli cokoli upravovat.

No jo, ale starší prohlížeče přece unicode-range nepodporují, ne? To je naprosto validní otázka. Co se nám tedy zobrazí na stejné adrese třeba v IE11? Můžeme to vyzkoušet:

@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Me5g.woff) format('woff');
}

Ano, hádáte správně. Všechny znakové sady, které naše písmo podporuje jsou zahrnuté v jednom souboru. Google se v novém API rozhodl v duchu graceful degradation uživatele legacy prohlížečů penalizovat a nutí je stahovat více dat. To může být pro změnu dost velká nevýhoda, jestliže víme, že značná část naší uživatelské základny přistupuje k webu právě ze starších prohlížečů.

Tady je pak na zvážení každého, zda se mu případně vyplatí používat původní verzi API, u níž se, dle mého názoru, nedá předpokládat, že by ji Google v dohledné době vypnul, neboť ji v současné chvíli jistě používají miliony webů.

Variabilní fonty

Jedné novince jsme se doposud úplně vyhnuli, jsou to variabilní fonty, jejichž podpora v prohlížečích je již velmi dobrá, a je tedy nasnadě, že je konečně umí servírovat i Google Fonts. Pro studium variabilních fontů doporučuji tento skvělý materiál Introduction to variable fonts, kde je vše podstatné vysvětleno.

My se ale rovnou vrhneme na to, jak je můžeme používat, pokud je tedy zrovna námi zvolený font ten variabilní. V době psaní článku (červen 2020) jich takových je pouze 39 z 991. Jedním z nich je třeba Roboto Slab, který se nyní rozhodneme použít v zrovna ne úplně standardním řezu 442:

/css2?family=Roboto+Slab:wght@442

Jestliže náš prohlížeč variabilní fonty podporuje, není to žádný problém a dostaneme, co jsme si přáli:

/* cyrillic-ext */
@font-face {
font-family: 'Roboto Slab';
font-style: normal;
font-weight: 442;
src: url(https://fonts.gstatic.com/s/robotoslab/v11/BngMUXZYTXPIvIBgJJSb6ufA5qWr4xCCQ_k.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* + další znakové sady */

V prohlížečích bez podpory variabilních fontů nám Google pošle nejbližší možné řezy směrem na obě strany, v našem případě 400 a 500:

@font-face {
font-family: 'Roboto Slab';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/robotoslab/v11/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISWaw.woff) format('woff');
}
@font-face {
font-family: 'Roboto Slab';
font-style: normal;
font-weight: 500;
src: url(https://fonts.gstatic.com/s/robotoslab/v11/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjovoSWaw.woff) format('woff');
}

Jelikož u variabilního fontu nám na hodnotě weight už z principu jejich fungování nezáleží, vypisujeme tak konkrétní řez de facto jen kvůli fallbacku pro starších prohlížeče.

Pokud chceme používat více řezů, můžeme místo jednotlivého vypsání specifikovat rovnou celý rozsah pomocí dvou teček mezi jeho hranicemi:

/css2?family=Roboto+Slab:wght@300..500

Toto děláme rovněž jen kvůli fallbacku (dostaneme k dispozici řezy v definovaném rozsahu po násobcích stovek, v našem případě 300, 400 a 500). V moderním prohlížeči máme ověřeno, že se opravdu jedná o jeden a tentýž soubor, který sám o sobě obsahuje všechny řezy a šetří nám tak datový přenos.

Rozsahů můžeme teoreticky použít neomezené množství (včetně kurzívy), Google nám jen stanovuje pravidlo, že se nesmí překrývat, nebo dotýkat. Požadavek na rozsah 300 až 500 v normálním řezu a 400 až 500 v kurzívě na font Crimson Pro (Roboto Slab nemá kurzívu) může vypadat klidně takto:

/css2?family=Crimson+Pro:ital,wght@0,300..500;1,400..500

Závěr

Gratuluji, jestliže jste dočetli až sem, budete umět perfektně používat Google Fonts bez webového rozhraní. Většinu zde zmíněných věcí lze samozřejmě udělat i v něm, ale některé (například stanovení rozsahů a variabilních fontů) je nutné vyřešit ručně.

Pakliže nemáte dost, chcete se dozvědět něco o performance a naučit se, jak je možné načítání webfontů od Googlu ještě zrychlit, doporučuji skvělý článek od Harryho Robertse The Fastest Google Fonts.

A pokud to všechno znáš a bylo to pro Tebe jenom opakování, budeme rádi, když se k nám přidáš na pozici front-end kodéra a pomůžeš nám budovat samé super weby.

--

--