Sprawdzone metody dotyczące czcionek

Optymalizuj czcionki internetowe pod kątem podstawowych wskaźników internetowych.

W tym artykule omawiamy sprawdzone metody dotyczące czcionek. Rodzajów wpływu czcionek internetowych na wydajność jest wiele:

Ten artykuł jest podzielony na 3 sekcje: wczytywanie czcionek, dostarczanie czcionekrenderowanie czcionek. Każda sekcja wyjaśnia, jak działa dany aspekt cyklu życia czcionek, i podaje odpowiednie sprawdzone metody.

Wczytywanie czcionki

Czcionki są zwykle ważnymi zasobami, ponieważ bez nich użytkownik może nie widzieć treści strony. Dlatego sprawdzone metody dotyczące wczytywania czcionek koncentrują się na tym, aby czcionki były wczytywane jak najwcześniej. Zachowaj szczególną ostrożność w przypadku czcionek wczytywanych z witryn innych firm, ponieważ ich pobranie wymaga oddzielnej konfiguracji połączenia.

Jeśli nie masz pewności, czy czcionki na Twojej stronie są wysyłane na czas, więcej informacji znajdziesz na karcie Czas w panelu Sieć w Narzędziach deweloperskich w Chrome.

Zrzut ekranu karty Czas w Narzędziach deweloperskich

@font-face

Zanim zapoznasz się z najlepszymi rozwiązaniami dotyczącymi wczytywania czcionek, musisz zrozumieć, jak działa @font-face i jak wpływa to na wczytywanie czcionek.

Deklaracja @font-face jest niezbędna do pracy z dowolną czcionką internetową. Zawiera ona co najmniej nazwę, która będzie używana do odwoływania się do czcionki, oraz wskazuje lokalizację odpowiedniego pliku czcionki.

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

Bardzo często błędnie uważa się, że żądanie dotyczące czcionki jest wysyłane, gdy napotykamy deklarację @font-face. Sama deklaracja @font-face nie powoduje pobrania czcionki. Czcionka jest pobierana tylko wtedy, gdy odwołuje się do niej styl użyty na stronie. Na przykład:

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

h1 {
  font-family: "Open Sans"
}

Innymi słowy, w przykładzie powyżej element Open Sans zostałby pobrany tylko wtedy, gdyby strona zawierała element <h1>.

Dlatego, gdy myślisz o optymalizacji czcionek, pamiętaj, że style sheet są równie ważne jak same pliki czcionek. Zmiany zawartości lub sposobu wyświetlania arkuszy stylów mogą mieć znaczny wpływ na dostępność czcionek. Podobnie usunięcie nieużywanego kodu CSS i podzielenie arkuszy stylów może zmniejszyć liczbę czcionek wczytywanych przez stronę.

Deklaracje czcionek w tekście

Większość witryn zyskałaby na umieszczeniu deklaracji czcionek i innych ważnych stylów w <head> dokumentu głównego zamiast umieszczania ich w zewnętrznym arkuszu stylów. Dzięki temu przeglądarka może szybciej wykryć deklaracje czcionek, ponieważ nie musi czekać na pobranie zewnętrznego arkusza stylów.

<head>
  <style>
    @font-face {
        font-family: "Open Sans";
        src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    }

    body {
        font-family: "Open Sans";
    }

    ...etc.

  </style>
</head>

Umieszczenie kodu CSS w kodzie strony może być bardziej zaawansowaną techniką, której nie wszystkie witryny będą mogły użyć. Korzyści związane ze wzrostem wydajności są oczywiste, ale wymaga to dodatkowych procesów i narzędzi do kompilacji, aby zapewnić prawidłowe wstawianie niezbędnego kodu CSS (a najlepiej tylko kodu krytycznego) i przekazywanie dodatkowego kodu CSS w sposób, który nie blokuje renderowania.

Wstępne łączenie z ważnymi źródłami w innych domenach

Jeśli Twoja witryna wczytuje czcionki ze strony innej firmy, zdecydowanie zalecamy użycie wskazówki dotyczącej zasobu preconnect, aby nawiązać połączenia z źródłem w innej domenie. Wskazówki dotyczące zasobów należy umieszczać w sekcji <head> dokumentu. Podpowiedź dotycząca zasobu poniżej konfiguruje połączenie do wczytania arkusza stylów czcionki.

<head>
  <link rel="preconnect" href="https://fonts.com">
</head>

Aby wstępnie połączyć połączenie używane do pobierania pliku czcionki, dodaj osobny preconnect zasób za pomocą atrybutu crossorigin. W odróżnieniu od arkuszy stylów pliki czcionek muszą być wysyłane przez połączenie CORS.

<head>
  <link rel="preconnect" href="https://fonts.com">
  <link rel="preconnect" href="https://fonts.com" crossorigin>
</head>

Gdy korzystasz ze wskazówki dotyczącej zasobu preconnect, pamiętaj, że dostawca czcionek może udostępniać arkusze stylów i czcionki z różnych źródeł. Tak na przykład wskazówka dotycząca zasobu preconnect będzie używana w przypadku Google Fonts.

<head>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>

Zachowaj ostrożność podczas korzystania z elementu preload do wczytywania czcionek

Chociaż preload bardzo skutecznie sprawia, że czcionki są dostępne na wczesnym etapie wczytywania strony, wiąże się to z tym, że zasoby przeglądarki są odbierane innym zasobom.

Wstawianie deklaracji czcionek i dostosowywanie arkuszy stylów może być skuteczniejszym podejściem. Te zmiany pozwalają lepiej rozwiązać problem z późno odkrytymi czcionkami, a nie tylko podać obejście.

Ponadto należy ostrożnie używać preload jako strategii ładowania czcionek, ponieważ pomija ona niektóre wbudowane strategie negocjowania treści przeglądarki. Na przykład dyrektywa preload ignoruje deklaracje unicode-range, a używając jej z rozwagą, należy używać tylko jednego formatu czcionki.

Jednak w przypadku korzystania z zewnętrznych arkuszy stylów wstępne wczytywanie najważniejszych czcionek może być bardzo skuteczne, ponieważ w przeciwnym razie przeglądarka nie będzie wiedzieć, czy czcionka jest potrzebna, dopóki nie będzie za późno.

Dostawa czcionek

Szybsze dostarczanie czcionek umożliwia szybsze renderowanie tekstu. Poza tym, jeśli czcionka zostanie dostarczona odpowiednio wcześnie, może to pomóc w eliminowaniu przesunięć układu wynikających ze zmiany czcionki.

Korzystanie z czcionek hostowanych samodzielnie

Teoretycznie stosowanie czcionek hostowanych samodzielnie powinno przynieść lepsze wyniki, ponieważ eliminuje to konieczność konfigurowania połączenia z usługą zewnętrzną. W praktyce różnice w wydajności między tymi 2 opcjami są jednak mniej oczywiste: na przykład z raportu Web Almanac wynika, że witryny korzystające z czcionek innych firm renderują się szybciej niż tego typu czcionki.

Jeśli rozważasz używanie czcionek hostowanych samodzielnie, sprawdź, czy Twoja witryna korzysta z sieci dystrybucji treści (CDN) i protokołu HTTP/2. Bez tych technologii jest znacznie mniej prawdopodobne, że czcionki hostowane we własnym zakresie będą działać lepiej. Więcej informacji znajdziesz w artykule Content Delivery Networks.

Jeśli używasz czcionek hostowanych lokalnie, zalecamy też zastosowanie niektórych optymalizacji plików czcionek, które dostawcy czcionek zwykle zapewniają automatycznie, np. kompresji WOFF2. Wysiłek wymagany do zastosowania tych optymalizacji będzie w pewnym stopniu zależał od języków obsługiwanych przez Twoją witrynę. Zwróć uwagę, że optymalizacja czcionek pod kątem języków CJK może być szczególnie trudna.

Używaj WOFF2

Spośród nowoczesnych czcionek WOFF2 jest najnowszym czcionką, obsługuje najszersze możliwości przeglądarki i zapewnia najlepszą kompresję. Korzysta on z Brotli, dzięki czemu kompresuje dane o 30% lepiej niż WOFF, co powoduje mniejszy rozmiar pobieranych danych i w konsekwencji większą wydajność.

Biorąc pod uwagę obsługę przeglądarek, eksperci zalecają teraz tylko używanie WOFF2:

Uważamy, że nadszedł czas, aby ogłosić: używaj tylko WOFF2 i zapomnij o wszystkim innym.

To znacznie uprości CSS i proces pracy, a także zapobiegnie przypadkowemu podwójnemu lub błędnemu pobieraniu czcionek. WOFF2 jest teraz obsługiwany wszędzie. Jeśli nie musisz obsługiwać bardzo starych przeglądarek, używaj tylko WOFF2. Jeśli nie możesz tego zrobić, rozważ niewyświetlanie żadnych czcionek internetowych w tych starszych przeglądarkach. Jeśli masz solidną strategię awaryjnego działania, nie będzie to problemem. Użytkownicy starszych przeglądarek zobaczą tylko czcionki zastępcze.

Bram Stein, z Almanachu internetowego na rok 2022

Podzbiór czcionek

Pliki czcionek zawierają zwykle dużą liczbę glifów dla wszystkich obsługiwanych znaków. Możesz jednak nie potrzebować wszystkich znaków na stronie i możesz zmniejszyć rozmiar plików czcionek, tworząc ich podzbiór.

Deskryptor unicode-range w deklaracji @font-face informuje przeglądarkę, do jakich znaków można używać czcionki.

@font-face {
    font-family: "Open Sans";
    src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    unicode-range: U+0025-00FF;
}

Plik czcionki zostanie pobrany, jeśli strona zawiera co najmniej 1 znak pasujący do zakresu Unicode. unicode-range jest często używany do wyświetlania różnych plików czcionek w zależności od języka używanego w treści strony.

unicode-range jest często używany w połączeniu z metodą tworzenia podzbioru. Podzbiór czcionek zawiera mniejszą część znaków, które były zawarte w pliku oryginalnego czcionki. Zamiast wyświetlać wszystkie znaki wszystkim użytkownikom, witryna może wygenerować osobne czcionki dla znaków łacińskich i cyrylicy. Liczba znaków w poszczególnych czcionkach jest bardzo zróżnicowana: czcionki z alfabetu łacińskiego zawierają zwykle od 100 do 1000 znaków, a czcionki CJK mogą zawierać ponad 10 tysięcy znaków. Usunięcie nieużywanych glif może znacznie zmniejszyć rozmiar pliku czcionki.

Niektórzy dostawcy czcionek mogą automatycznie udostępniać różne wersje plików czcionek z różnymi podzbiorami. Na przykład Google Fonts robi to domyślnie:

/* devanagari */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJbecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* latin-ext */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJnecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

Podczas przenoszenia na własny serwer łatwo można przeoczyć tę optymalizację, która może spowodować większe pliki czcionek na komputerze lokalnym.

Możesz też ręcznie wybrać podzbiór czcionek, jeśli dostawca czcionek na to zezwala. Możesz to zrobić za pomocą interfejsu API (Google Fonts obsługuje to za pomocą parametru text) lub ręcznie edytując pliki czcionek, a następnie hostując je samodzielnie. Narzędzia do generowania podzbiorów czcionek to subfontglyphanger. Sprawdź jednak, czy licencja na używane przez Ciebie czcionki zezwala na użycie podzbioru i hostingu przez Ciebie.

Używaj mniej czcionek internetowych

Najszybciej można dostarczyć czcionkę, o którą nie ma prośby. Czcionki systemowe i czcionki zmienne to 2 sposoby na zmniejszenie liczby czcionek internetowych używanych w Twojej witrynie.

Czcionka systemowa to domyślna czcionka używana przez interfejs użytkownika na jego urządzeniu. Czcionki systemu zwykle różnią się w zależności od systemu operacyjnego i wersji. Ponieważ czcionka jest już zainstalowana, nie trzeba jej pobierać. Czcionki systemowe mogą się szczególnie dobrze sprawdzać w przypadku tekstu głównego.

Aby użyć czcionki systemowej w CSS, jako font-family podaj system-ui:

font-family: system-ui

Założeniem czcionek zmiennych jest to, że jedna czcionka zmienna może zastąpić wiele plików czcionek. Czcionki zmienne działają poprzez definiowanie „domyślnego” stylu czcionki i zapewniania „osi” do manipulowania czcionką. Czcionka zmienna z osią Weight może na przykład służyć do implementacji liternictwa, które wcześniej wymagało osobnych czcionek w wersji cienkiej, normalnej, pogrubionej i bardzo pogrubionej.

Nie każdy skorzysta na przejściu na czcionki zmienne. Czcionki zmiennych obejmują wiele stylów, więc zwykle mają większy rozmiar niż pojedyncze czcionki niezmienne, które zawierają tylko jeden styl. Witryny, które dzięki czcionkom zmiennym będą wyglądać najlepiej, to te, które używają (i muszą używać) różnych stylów i grubości czcionek.

Renderowanie czcionek

Gdy przeglądarka napotyka czcionkę internetową, która nie została jeszcze załadowana, staje przed dylematem: czy ma wstrzymać renderowanie tekstu, dopóki czcionka internetowa nie zostanie pobrana? Czy też powinien renderować tekst przy użyciu czcionki zastępczej, dopóki nie pojawi się czcionka internetowa?

Różne przeglądarki obsługują ten scenariusz w różny sposób. Domyślnie przeglądarki oparte na Chromium i Firefox blokują renderowanie tekstu na czas do 3 sekund, jeśli powiązana czcionka internetowa nie została załadowana. Safari blokuje renderowanie tekstu na czas nieokreślony.

To zachowanie można skonfigurować za pomocą atrybutu font-display. Ten wybór może mieć istotne konsekwencje: font-display może wpłynąć na LCP, FCP i stabilność układu.

Wybierz odpowiednią strategię font-display

font-display informuje przeglądarkę, jak ma postępować z renderowaniem tekstu, gdy powiązana czcionka internetowa nie została załadowana. Jest ona definiowana dla każdego kroju czcionki.

@font-face {
  font-family: Roboto, Sans-Serif
  src: url(/fonts/roboto.woff) format('woff'),
  font-display: swap;
}

Wartość font-display może mieć 5 możliwych wartości:

Wartość Okres blokady Okres wymiany
Automatycznie Różne w zależności od przeglądarki Zależy od przeglądarki
Zablokuj 2–3 sekundy Bez końca
Swap 0ms Bez końca
Wycofanie 100 ms 3 sekundy
Opcjonalnie 100 ms Brak
  • Okres blokowania: okres blokowania rozpoczyna się, gdy przeglądarka zażąda czcionki internetowej. Jeśli w okresie blokady czcionka internetowa jest niedostępna, jest renderowana w niewidocznym czcionce zastępczej, dzięki czemu tekst nie będzie widoczny dla użytkownika. Jeśli czcionka nie będzie dostępna pod koniec okresu blokady, zostanie wyświetlona czcionka zastępcza.
  • Okres wymiany: następuje po okresie blokady. Jeśli czcionka internetowa stanie się dostępna w okresie wymiany, zostanie zastąpiona.

font-display odzwierciedlają różne punkty widzenia dotyczące kompromisu między skutecznością a estetyką. Trudno jest więc podać zalecane podejście, ponieważ zależy ono od indywidualnych preferencji, tego, jak ważna jest czcionka internetowa dla danej strony i marki oraz jak czcionka, z którą współpracujesz, może być różnie odbierana.

W przypadku większości witryn najlepiej sprawdzają się następujące trzy strategie:

  • Jeśli priorytetem jest skuteczność: użyj font-display: optional. Jest to najbardziej wydajne podejście: renderowanie tekstu jest opóźnione o maksymalnie 100 ms, a zapewniamy, że nie będzie żadnych zmian układu związanych ze zmianą czcionki. Minusem jest jednak to, że jeśli czcionka internetowa dotrze za późno, nie będzie można jej użyć.

  • Jeśli szybkie wyświetlanie tekstu jest priorytetem, ale mimo to chcesz mieć pewność, że jest używana czcionka internetowa: użyj font-display: swap, ale pamiętaj, by dostarczyć czcionkę na tyle wcześnie, by nie powodować przesunięcia układu. Wadą tej opcji jest przesunięcie różnicy w przypadku spóźnienia się czcionki.

  • Jeśli wyświetlanie tekstu w czcionce internetowej jest dla Ciebie najważniejsze: użyj atrybutu font-display: block, ale pamiętaj, aby przesłać czcionkę odpowiednio wcześnie, aby zminimalizować opóźnienie tekstu. Minusem jest to, że początkowe wyświetlanie tekstu będzie opóźnione. Pamiętaj, że pomimo tego przesunięcia może to spowodować przesunięcie układu, ponieważ w rzeczywistości tekst stanie się niewidoczny, a zastępcza czcionka zostanie wykorzystana do zarezerwowania przestrzeni reklamowej. Po załadowaniu czcionki internetowej może to wymagać różnicy i konieczności przesunięcia. Może to być jednak mniej dyskretne przesunięcie niż w font-display: swap, ponieważ sam tekst nie będzie widać.

Pamiętaj też, że te 2 metody można łączyć: na przykład użyj font-display: swap do elementów marki i innych wizualnie wyróżniających się elementów strony, a czcionki font-display: optional do tekstu głównego.

Zmniejsz różnicę między czcionką zastępczą a czcionką internetową

Aby zmniejszyć wpływ na CLS, możesz użyć nowych atrybutów size-adjust. Więcej informacji znajdziesz w artykule o usłudze porównywania cen size-adjust. Jest to bardzo nowy element naszego zestawu narzędzi, więc jest bardziej zaawansowany i obecnie wymaga nieco ręcznej pracy. Zdecydowanie warto go wypróbować i śledzić, jak będzie się rozwijał w przyszłości.

Podsumowanie

Chociaż czcionki internetowe nadal są wąskim gardłem pod względem wydajności, mamy coraz większy wybór opcji, które pozwalają nam je optymalizować, aby w jak największym stopniu zmniejszyć to wąskie gardło.