Kurs HTML i CSS · Moduł 11: Narzędzia deweloperskie

Web Fonts - czcionki godne faraona

6 min czytania
W tej lekcji8

Nagłówki Twojej strony mają wyglądać jak kamienne inskrypcje. Otwierasz ją jednak na komputerze znajomego i widzisz zwykły, systemowy krój, bo wybranej czcionki nie ma na jego dysku. Przeglądarka użyje tylko tych czcionek, które zna - chyba że dostarczysz je razem ze stroną. Hieroglify w Starożytnym Egipcie miały swój unikalny styl. Tak samo Twoja strona internetowa może użyć niestandardowych czcionek dzięki Web Fonts. Domyślne czcionki systemowe są ograniczone, ale dzięki Google Fonts i regule @font-face możesz używać tysięcy różnych krojów pisma.

Google Fonts - biblioteka czcionek

Google Fonts to darmowa biblioteka ponad 1500 czcionek. Aby użyć czcionki z Google Fonts:

Wybierasz krój na fonts.google.com, a serwis podaje gotowe linki do wklejenia w <head> - najpierw połączenia wstępne, potem arkusz z czcionką:

1<head>
2  <!-- Dodaj link do Google Fonts -->
3  <link rel="preconnect" href="https://fonts.googleapis.com">
4  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
5  <link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&display=swap"
6        rel="stylesheet">
7</head>

Adres w trzecim linku mówi, czego chcesz: krój family=Cinzel, grubości 400 i 700 oraz display=swap. Sam link niczego jednak nie zmienia na stronie - czcionkę trzeba jeszcze wskazać w CSS:

1/* Użyj czcionki w CSS */
2h1 {
3  font-family: 'Cinzel', serif;
4  font-weight: 700;
5}

Nazwę kroju piszesz w cudzysłowie, a po przecinku podajesz rodzinę zapasową. Kolejność kroków jest więc zawsze taka: preconnect, link z czcionką i dopiero font-family w CSS.

Metoda 2: @import w CSS

Tę samą czcionkę możesz też wczytać prosto z pliku CSS regułą @import, która musi stać na samej górze arkusza:

1/* Na początku pliku CSS */
2@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&display=swap');
3
4body {
5  font-family: 'Cinzel', serif;
6}

To działa, ale wolniej: przeglądarka dowiaduje się o czcionce dopiero po pobraniu Twojego arkusza. Dlatego polecam metodę z <link>.

@font-face - własne czcionki

Jeśli masz własny plik czcionki, na przykład kupiony krój, zarejestruj go w arkuszu regułą @font-face:

1@font-face {
2  font-family: 'EgyptianFont';
3  src: url('/fonts/egyptian.woff2') format('woff2'),
4       url('/fonts/egyptian.woff') format('woff');
5  font-weight: 400;
6  font-style: normal;
7  font-display: swap;
8}
9
10h1 {
11  font-family: 'EgyptianFont', serif;
12}

font-family nadaje czcionce nazwę do użycia w CSS, a src wymienia pliki od najlepszego formatu - przeglądarka weźmie pierwszy obsługiwany. Czcionka z własnego serwera nie przekazuje też adresów IP odwiedzających do Google, co w UE bywa ważne ze względu na RODO.

Formaty czcionek:

  • WOFF2 - najlepsza kompresja, wspierany przez nowoczesne przeglądarki
  • WOFF - szersze wsparcie, nieco większy rozmiar
  • TTF/OTF - tradycyjne formaty, bez kompresji webowej

font-display: swap

Czcionka z sieci zawsze dociera z opóźnieniem. Właściwość font-display decyduje, co przeglądarka pokaże, zanim plik się załaduje:

1@font-face {
2  font-family: 'MojaFont';
3  src: url('/fonts/font.woff2') format('woff2');
4  /* swap: pokaż tekst systemową czcionką, zamień po załadowaniu */
5  font-display: swap;
6}
  • swap - od razu wyświetl tekst czcionką zapasową, podmień po załadowaniu
  • block - ukryj tekst na krótko (zwykle do ok. 3 s), czekając na czcionkę
  • fallback - bardzo krótki block (ok. 100 ms), potem ok. 3 s na podmianę, a jeśli czcionka nie zdąży, zostaje zapasowa
  • optional - jeśli czcionka nie załaduje się błyskawicznie, zostań przy zapasowej

swap to najbezpieczniejszy wybór dla treści: tekst da się czytać od pierwszej chwili, a zamiana kroju to tylko krótkie mrugnięcie.

Preconnect i preload - przyspieszenie ładowania

Gdy wiesz, że czcionka na pewno będzie potrzebna, możesz uprzedzić przeglądarkę dwiema wskazówkami w <head>:

1<head>
2  <!-- Preconnect - nawiąż połączenie z serwerem wcześniej -->
3  <link rel="preconnect" href="https://fonts.googleapis.com">
4  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
5
6  <!-- Preload - zacznij pobierać czcionkę jak najszybciej -->
7  <link rel="preload" as="font" type="font/woff2"
8        href="/fonts/egyptian.woff2" crossorigin>
9</head>

preconnect tylko otwiera połączenie z serwerem, a preload od razu pobiera konkretny plik. Przy czcionkach crossorigin jest potrzebny nawet dla plików z własnego serwera - bez niego przeglądarka pobierze plik dwa razy.

Stos czcionek (Font Stack)

Zawsze definiuj czcionki zapasowe na wypadek, gdyby główna czcionka nie załadowała się. Przeglądarka sprawdza listę od lewej i bierze pierwszą dostępną:

1body {
2  /* Kolejność: preferowana -> zapasowa -> generyczna */
3  font-family: 'Cinzel', 'Georgia', 'Times New Roman', serif;
4}

Ogólna zasada: zawsze kończ stos czcionek rodziną generyczną. Klasyczna piątka to serif, sans-serif, monospace, cursive i fantasy, a nowsze specyfikacje dodały m.in. system-ui. Dzięki temu przeglądarka zawsze będzie miała czcionkę zapasową. Dla tekstu bezszeryfowego typowy stos to Arial, Helvetica, sans-serif, a dla kodu 'Courier New', monospace.

Optymalizacja Web Fonts

Czcionki webowe mogą znacząco wpływać na wydajność strony. Oto kilka wskazówek optymalizacyjnych:

1. Ładuj tylko potrzebne grubości

Każda zamówiona grubość to dodatkowe dane do pobrania, więc zamawiaj tylko te, których faktycznie używasz:

1/* ŹLE - ładujesz wszystkie grubości */
2@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;500;600;700;800;900&display=swap');
3
4/* DOBRZE - ładujesz tylko te, których używasz */
5@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&display=swap');

Wygląd strony się nie zmienia, a przeglądarka ma mniej do pobrania - zwłaszcza przy klasycznych czcionkach, gdzie każda grubość to osobny plik.

2. Ładuj tylko potrzebne znaki (subsetting)

Jeśli strona jest tylko po polsku, nie musisz ładować znaków chińskich czy arabskich:

1<!-- Załaduj tylko łacińskie znaki z polskimi diakrytykami -->
2<link href="https://fonts.googleapis.com/css2?family=Cinzel&subset=latin-ext&display=swap"
3      rel="stylesheet">

Litery ą, ę czy ł należą do zestawu latin-ext, kluczowego na polskiej stronie. W praktyce Google Fonts i tak dzieli czcionkę na podzbiory za pomocą unicode-range, więc przeglądarka pobiera tylko pliki ze znakami, które występują na stronie.

3. Używaj zmiennych czcionek (Variable Fonts)

Nowoczesne czcionki zmienne (variable fonts) pozwalają mieć wszystkie grubości w jednym pliku zamiast w kilku osobnych:

1@font-face {
2  font-family: 'CinzelVariable';
3  src: url('/fonts/cinzel-variable.woff2') format('woff2');
4  font-weight: 100 900; /* Zakres grubości */
5  font-display: swap;
6}
7
8h1 {
9  font-family: 'CinzelVariable', serif;
10  font-weight: 650; /* Dowolna wartość z zakresu! */
11}

Zakres 100 900 mówi przeglądarce, jakie grubości zawiera plik, a w regułach możesz użyć dowolnej wartości pośredniej, np. 650.

Typografia - kilka dodatkowych właściwości

Sama czcionka to nie wszystko. Czytelność zależy też od odstępów, które znasz z lekcji o dostępnej typografii:

1p {
2  /* Odstęp między literami - jak hieroglify w równych odstępach */
3  letter-spacing: 0.05em;
4
5  /* Odstęp między wyrazami */
6  word-spacing: 0.1em;
7
8  /* Wysokość linii - czytelność tekstu */
9  line-height: 1.6;
10
11  /* Wcięcie pierwszej linii akapitu */
12  text-indent: 2em;
13}

Odstępy w jednostkach em skalują się razem z czcionką, line-height bez jednostki działa jak mnożnik jej rozmiaru, a text-indent wcina pierwszą linię akapitu.

Tak jak hieroglify w starożytnym Egipcie miały swój unikalny, rozpoznawalny styl, tak dobrze dobrana czcionka webowa nadaje Twojej stronie charakter i profesjonalizm. Moja rada: dwie rodziny na stronę wystarczą - ozdobna do nagłówków i czytelna do treści. W następnej lekcji opublikujesz stronę w internecie.

Praktyka

W edytorze poniżej porównasz Cinzel i Lorę z czcionką systemową - sprawdź w panelu Network, które pliki się pobierają:

Kod do tej lekcji: index.html
1<!DOCTYPE html>
2<html lang="pl">
3<head>
4    <meta charset="UTF-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
6    <title>Web Fonts - Czcionki</title>
7    <link rel="preconnect" href="https://fonts.googleapis.com">
8    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9    <link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&family=Lora:ital,wght@0,400;0,700;1,400&display=swap"
10          rel="stylesheet">
11    <link rel="stylesheet" href="style.css">
12</head>
13<body>
14    <h1>Web Fonts w praktyce</h1>
15
16    <section>
17        <h2>Czcionka Cinzel (Google Fonts)</h2>
18        <p class="cinzel-demo">Ten tekst uzywa czcionki Cinzel -
19           elegancki kroj inspirowany klasycznymi napisami.</p>
20        <p class="cinzel-bold">Wersja pogrubiona (font-weight: 700)</p>
21    </section>
22
23    <section>
24        <h2>Czcionka Lora (Google Fonts)</h2>
25        <p class="lora-demo">Ten tekst uzywa czcionki Lora -
26           nowoczesna czcionka szeryfowa, idealna do dluzszych tekstow.</p>
27        <p class="lora-italic">Wersja kursywa (font-style: italic)</p>
28    </section>
29
30    <section>
31        <h2>Font Stack - czcionki zapasowe</h2>
32        <p class="stack-demo">
33            font-family: 'Cinzel', 'Georgia', 'Times New Roman', serif;
34        </p>
35        <p>Jesli Cinzel nie zaladuje sie, przegladarka uzyje Georgia,
36           potem Times New Roman, a na koncu domyslnej czcionki serif.</p>
37    </section>
38
39    <section>
40        <h2>Porownanie czcionek</h2>
41        <p class="font-system">Czcionka systemowa (Georgia)</p>
42        <p class="font-cinzel">Czcionka Cinzel (Google Fonts)</p>
43        <p class="font-lora">Czcionka Lora (Google Fonts)</p>
44    </section>
45</body>
46</html>

Pamiętaj: czcionka to charakter pisma skryby - zamów tylko to, czego potrzebujesz, i zawsze zostaw zapasowy krój na wypadek burzy piaskowej.

Widzisz błąd w tej lekcji?

Sprawdź się

Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.

  1. 1. Jak dodać czcionkę z Google Fonts do strony HTML?

  2. 2. Co robi właściwość font-display: swap w @font-face?

Zadania praktyczne w grze

  • Układanie w pionie

    Uporządkuj kroki dodawania czcionki Google Fonts do strony:

  • Edytor kodu

    Dodaj preconnect, link do Google Fonts (Cinzel) i ustaw font-family w CSS.

  • Klikanie w kolejności

    Ułóż poprawną składnię elementu link z preconnect do Google Fonts:

  • Klikanie w kolejności

    Jak poprawnie zdefiniować font-family z czcionkami zapasowymi?

  • Edytor kodu

    Dodaj font-family z odpowiednim stosem czcionek do trzech paragrafów: serif, sans-serif i monospace.

Przydatne artykuły