font-display
: Kompletny przewodnik po wartościach i wpływie na FOUT w Next.jsRozwiązywanie problemu migotania tekstu: wprowadzenie do font-display
Czy kiedykolwiek podczas przeglądania strony internetowej zauważyłeś nagłe przeskakiwanie tekstu? To, co widzisz, to często efekt FOUT (Flash of Unstyled Text), czyli migotania nieostylowanego tekstu. Problem ten występuje, gdy przeglądarka próbuje wyświetlić tekst używający niestandardowej czcionki, ale czcionka ta jeszcze się nie załadowała. Zamiast czekać w nieskończoność, przeglądarka wyświetla tekst czcionką systemową, a gdy niestandardowa czcionka w końcu się załaduje, następuje nagła zmiana. To może być irytujące i negatywnie wpływać na wrażenia użytkownika, szczególnie jeśli strona ma sporo tekstu.
Na szczęście istnieje proste, ale potężne rozwiązanie: właściwość CSS font-display
. Ta właściwość daje nam kontrolę nad tym, jak przeglądarka renderuje tekst, zanim załaduje się niestandardowa czcionka. Używając odpowiedniej wartości font-display
, możemy zminimalizować, a nawet całkowicie wyeliminować problem FOUT, poprawiając płynność i szybkość ładowania strony.
Dostępne wartości font-display
: dogłębna analiza
font-display
oferuje pięć różnych wartości, każda z własnym zachowaniem i wpływem na to, jak przeglądarka radzi sobie z ładowaniem czcionek. Wybór odpowiedniej wartości zależy od konkretnych potrzeb i priorytetów Twojego projektu. Przyjrzyjmy się im bliżej:
auto
: To wartość domyślna. Oznacza, że przeglądarka sama decyduje, jak zarządzać ładowaniem czcionki. Zazwyczaj zachowuje się podobnie doblock
w nowszych przeglądarkach. Nie jest to jednak zalecane, ponieważ nie daje nam kontroli.block
: Daje przeglądarce krótki okres blokowania. Podczas tego okresu tekst jest niewidoczny. Jeśli czcionka załaduje się w tym czasie, zostanie użyta. Jeśli nie, przeglądarka przejdzie do okresu zamiany (swap). Domyślnie okres blokowania jest bardzo krótki (zazwyczaj 3 sekundy).swap
: Daje przeglądarce okres zamiany (swap). Jeśli czcionka nie załadowała się od razu, przeglądarka wyświetli tekst czcionką systemową. Kiedy czcionka niestandardowa się załaduje, tekst zostanie natychmiast przełączony na tę czcionkę. To powoduje FOUT, ale zapewnia, że użytkownik od razu zobaczy treść.fallback
: Podobne doswap
, ale oferuje krótszy okres blokowania i dłuższy okres zamiany. Przeglądarka ma krótki czas na załadowanie czcionki. Jeśli się nie uda, przechodzi do czcionki systemowej. Jeśli czcionka załaduje się później, np. po kilkunastu sekundach, przeglądarka nie przełączy już tekstu. Ma to sens, gdy używamy czcionki dekoracyjnej, która nie jest kluczowa dla treści.optional
: To najbardziej liberalna opcja. Przeglądarka decyduje, czy załadować czcionkę w zależności od szybkości połączenia i innych czynników. Jeśli uzna, że ładowanie czcionki zajmie zbyt dużo czasu, zrezygnuje z niej i wyświetli tekst czcionką systemową. Jest to dobre rozwiązanie dla czcionek dekoracyjnych, które nie są niezbędne, szczególnie na wolnych połączeniach.
font-display
w praktyce: konfiguracja w Next.js
Integracja font-display
z Next.js jest stosunkowo prosta. Możemy to zrobić na kilka sposobów, w zależności od sposobu, w jaki importujemy czcionki.
1. Import czcionek bezpośrednio w CSS/SCSS:
Jeśli używasz @font-face
w swoich plikach CSS lub SCSS, możesz po prostu dodać właściwość font-display
do definicji czcionki:
@font-face {
font-family: 'MyCustomFont';
src: url('/fonts/MyCustomFont-Regular.woff2') format('woff2'),
url('/fonts/MyCustomFont-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap; /* Użyj wartości, która najlepiej pasuje do Twojego przypadku */
}
body {
font-family: 'MyCustomFont', sans-serif;
}
2. Użycie Google Fonts:
Jeśli korzystasz z Google Fonts, możesz dodać parametr &display=swap
do adresu URL czcionki:
<link rel=stylesheet href=https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap>
Lub, jeśli używasz @import
w swoim CSS:
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');
3. Next.js next/font
(od Next.js 13):
Next.js 13 wprowadził next/font
, który oferuje zoptymalizowany sposób ładowania czcionek. next/font
automatycznie umieszcza czcionki i dodaje font-display: swap
domyślnie. Możesz to skonfigurować. Poniższy przykład używa Google Fonts:
import { Roboto } from 'next/font/google'
const roboto = Roboto({
weight: ['400', '700'],
subsets: ['latin'],
display: 'swap', // Można zmienić na inną wartość, jeśli potrzebujesz
})
export default function Component() {
return (
<div className={roboto.className}>
This is using Roboto font.
</div>
)
}
Pamiętaj, aby wybrać wartość font-display
, która najlepiej pasuje do Twoich potrzeb. swap
jest często dobrym kompromisem, ale w przypadku czcionek dekoracyjnych fallback
lub optional
mogą być lepsze.
Wybór odpowiedniej wartości font-display
: czynniki do rozważenia
Wybór optymalnej wartości font-display
to decyzja, która powinna uwzględniać kilka kluczowych czynników. Nie ma uniwersalnego rozwiązania, które sprawdzi się we wszystkich przypadkach. Musisz rozważyć wagę czcionki dla UX, rodzaj czcionki (tekstowa vs. dekoracyjna), oraz potencjalne problemy z wydajnością.
Czcionki kluczowe dla treści: Jeśli czcionka jest używana do wyświetlania głównej treści strony, np. tekstu artykułu, warto rozważyć użycie swap
. Dzięki temu treść będzie widoczna jak najszybciej, nawet kosztem FOUT. Alternatywnie, możesz użyć fallback
, aby uniknąć FOUT, ale ryzykujesz, że użytkownik zobaczy czcionkę systemową, jeśli czcionka niestandardowa załaduje się po pewnym czasie. block
jest rzadko dobrym wyborem, ponieważ krótki okres blokowania może prowadzić do niepotrzebnego ukrywania tekstu.
Czcionki dekoracyjne: W przypadku czcionek dekoracyjnych, używanych np. w nagłówkach lub logo, fallback
lub optional
są często lepszym wyborem. Pozwalają uniknąć FOUT, a jeśli czcionka nie załaduje się szybko, użytkownik i tak zobaczy treść, choć może w nieco innej formie. Użycie swap
w przypadku czcionek dekoracyjnych może być irytujące, ponieważ nagła zmiana czcionki w nagłówku może odwracać uwagę.
Wpływ na wydajność: Należy pamiętać, że ładowanie czcionek ma wpływ na wydajność strony. Zbyt wiele czcionek lub duże pliki czcionek mogą spowalniać ładowanie strony. Warto zoptymalizować pliki czcionek, używać tylko tych, które są naprawdę potrzebne, i rozważyć użycie podzbiorów czcionek (subsetting), aby zmniejszyć ich rozmiar. optional
może pomóc w uniknięciu ładowania zbędnych czcionek na wolnych połączeniach.
Dodatkowo warto przetestować różne wartości font-display
w różnych warunkach sieciowych, aby zobaczyć, jak wpływają na wrażenia użytkownika. Narzędzia takie jak PageSpeed Insights mogą pomóc w identyfikacji potencjalnych problemów z wydajnością związanymi z ładowaniem czcionek.
Eliminowanie FOUT: i dalsze kroki
Właściwe użycie font-display
jest kluczowe dla optymalizacji wrażeń użytkownika i eliminowania problemów związanych z FOUT w aplikacjach Next.js. Wybór odpowiedniej wartości zależy od charakteru czcionki i priorytetów projektu. Pamiętaj, aby testować różne konfiguracje i analizować ich wpływ na wydajność strony.
Oprócz font-display
, istnieje kilka innych strategii, które mogą pomóc w zminimalizowaniu FOUT. Należą do nich m.in. ne ładowanie czcionek za pomocą <link rel=preload>
, optymalizacja plików czcionek i użycie CDN do szybszego dostarczania czcionek użytkownikom. Integracja z next/font
w Next.js 13 i nowszych wersjach automatycznie optymalizuje wiele z tych aspektów.
Eksperymentuj, analizuj i dopasowuj swoje ustawienia, aby zapewnić płynne i szybkie ładowanie czcionek dla wszystkich użytkowników Twojej aplikacji Next.js. Im lepiej zrozumiesz wpływ font-display
, tym lepsze doświadczenie użytkownika będziesz w stanie zapewnić.