Nowy sposób na zmniejszenie wpływu ładowania czcionek: deskryptory czcionek CSS

Opublikowany: 2022-03-10
Krótkie podsumowanie ↬ Czcionki internetowe często negatywnie wpływają na wydajność sieci i żadna ze strategii ładowania czcionek nie jest szczególnie skuteczna, aby temu zaradzić. Nadchodzące opcje czcionek mogą w końcu spełnić obietnicę ułatwienia wyrównania czcionek zastępczych do czcionek ostatecznych.

Ładowanie czcionek od dawna jest problemem wydajności sieci i tak naprawdę nie ma tutaj dobrych wyborów. Jeśli chcesz używać czcionek internetowych, do wyboru są w zasadzie Flash of Invisible Text (aka FOIT), w którym tekst jest ukryty do czasu pobrania czcionki lub Flash of Unstyled Text (FOUT), w którym początkowo używasz rezerwowej czcionki systemowej, a następnie uaktualniasz ją do czcionka internetowa podczas pobierania. Żadna opcja nie „wygrała”, ponieważ żadna z nich nie jest naprawdę satysfakcjonująca, szczerze mówiąc.

Czy font-display nie miało rozwiązać tego problemu?

Właściwość font-display dla @font-face dała ten wybór twórcy stron internetowych, podczas gdy wcześniej zdecydowała o tym przeglądarka (IE i Edge faworyzowały FOUT w przeszłości, podczas gdy inne przeglądarki preferowały FOIT). Jednak poza tym nie rozwiązało to problemu.

Wiele witryn przeszło na font-display: swap , gdy pojawiło się to po raz pierwszy, a Google Fonts uczyniło go nawet domyślnym w 2019 r. Pomyśleliśmy, że dla wydajności lepiej jest wyświetlać tekst tak szybko, jak to możliwe , nawet jeśli jest w czcionce zastępczej, a następnie zamienić czcionkę, gdy w końcu zostanie pobrana.

Popierałem to również wtedy, ale coraz częściej jestem sfrustrowany „efektem nawodnienia”, gdy pobieranie czcionek internetowych i znaki rozszerzają się (lub kurczą) z powodu różnic między czcionkami. Smashing Magazine, podobnie jak większość wydawców, korzysta z czcionek internetowych, a poniższy zrzut ekranu pokazuje różnicę między renderowaniem początkowym (z czcionkami zastępczymi), a renderowaniem końcowym (z czcionkami internetowymi):

Dwa zrzuty ekranu artykułu w Smashing Magazine z różnymi czcionkami. Tekst ma zauważalnie inny rozmiar, a dodatkowe zdanie może się zmieścić, gdy używane są czcionki internetowe.
Artykuł Smashing Magazine z czcionką zastępczą i pełnymi czcionkami internetowymi. (duży podgląd)

Teraz, gdy zostaną umieszczone obok siebie, czcionki internetowe są znacznie ładniejsze i pasują do marki Smashing Magazine. Ale widzimy też, że istnieje spora różnica w układzie tekstu w przypadku dwóch czcionek. Czcionki mają bardzo różne rozmiary i z tego powodu zawartość ekranu przesuwa się. W dobie kluczowych wskaźników sieciowych i skumulowanych zmian układu, które (całkiem słusznie!) są uznawane za szkodliwe dla użytkowników, font-display: swap jest z tego powodu złym wyborem.

Wróciłem do font-display: block w witrynach, którymi się opiekuję, ponieważ naprawdę uważam, że przesunięcie tekstu jest dość irytujące i denerwujące. Chociaż prawdą jest, że block nie zatrzymuje przesunięć (czcionka nadal jest renderowana w niewidocznym tekście), to przynajmniej sprawia, że ​​są one mniej zauważalne dla użytkownika. Zoptymalizowałem także ładowanie czcionek, wstępnie ładując czcionki, które zrobiłem tak małe, jak to tylko możliwe, przez samodzielne hostowanie podzbiorów czcionek — więc odwiedzający często widzieli czcionki zastępcze tylko przez krótki czas. Dla mnie „okres blokowania” swap był zbyt krótki i szczerze wolałbym poczekać trochę dłużej, aby uzyskać prawidłowe początkowe renderowanie.

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Korzystanie font-display: optional może rozwiązać FOIT i FOUT — za opłatą

Inną opcją jest użycie font-display: optional . Ta opcja zasadniczo sprawia, że ​​czcionki internetowe są opcjonalne lub inaczej mówiąc, jeśli czcionki nie ma w momencie, gdy strona jej potrzebuje, to od przeglądarki zależy, czy jej nie zamienisz. Dzięki tej opcji unikamy zarówno FOIT, jak i FOUT , używając w zasadzie tylko czcionek, które zostały już pobrane.

Jeśli czcionka internetowa nie jest dostępna, wracamy do czcionki zastępczej, ale nawigacja na następnej stronie (lub ponowne ładowanie tej strony) użyje czcionki — ponieważ pobieranie powinno się już zakończyć. Jeśli jednak czcionka internetowa jest tak nieistotna dla witryny, dobrym pomysłem może być jej całkowite usunięcie — co jest jeszcze lepsze dla wydajności sieci!

Liczy się pierwsze wrażenie, a ładowanie początkowe bez czcionek internetowych wydaje się trochę za dużo. Myślę też – nawiasem mówiąc, absolutnie nie ma na to dowodów! — że da ludziom wrażenie, być może podświadomie, że coś jest nie tak w witrynie i może mieć wpływ na to, jak ludzie z niej korzystają.

Tak więc wszystkie opcje czcionek mają swoje wady, w tym opcję nieużywania w ogóle czcionek internetowych lub korzystania z czcionek systemowych (co jest ograniczające — ale być może nie tak ograniczające, jak wielu myśli!).

Dopasowanie czcionki zastępczej do czcionki

Święty Graal ładowania czcionek internetowych polega na tym, aby czcionka zastępcza była bliżej rzeczywistej czcionki internetowej , aby maksymalnie zmniejszyć zauważalne przesunięcie, dzięki czemu użycie swap jest mniej skuteczne. Chociaż nigdy nie będziemy w stanie całkowicie uniknąć zmian, możemy zrobić to lepiej niż na powyższym zrzucie ekranu. Aplikacja Font Style Matcher autorstwa Moniki Dinculescu jest często cytowana w artykułach dotyczących ładowania czcionek i daje fantastyczny wgląd w to, co powinno być tutaj możliwe. Pomaga to nałożyć ten sam tekst dwiema różnymi czcionkami , aby zobaczyć, jak się różnią, i dostosować ustawienia czcionki, aby były bardziej wyrównane:

Zrzuty ekranu dopasowywania stylów czcionek przedstawiające dwa zestawy nałożone na siebie tekstu, przy czym góra ma duże różnice, a dół ma bardzo podobny tekst.
Zrzuty ekranu funkcji Font Style Matcher z domyślnymi, tymi samymi ustawieniami dla dwóch czcionek (u góry) i dostosowanymi ustawieniami, aby zapewnić lepsze dopasowanie (na dole). (duży podgląd)

Niestety, problem z dopasowaniem stylów czcionek polega na tym, że nie możemy zastosować tych stylów CSS tylko do czcionek zastępczych, więc musimy użyć JavaScript i interfejsu API FontFace.load, aby zastosować (lub cofnąć) te różnice w stylach w Internecie ładuje czcionki .

Ilość kodu nie jest duża, ale nadal wydaje się, że jest to trochę więcej wysiłku niż powinno. Chociaż istnieją inne zalety i możliwości korzystania z API JavaScript, jak wyjaśnił Zach Leatherman w tym fantastycznym przemówieniu z 2019 r. — możesz zredukować ponowne przepływy i obsługiwać tryb data-server i wolisz prefers-reduced-motion (pamiętaj jednak, że że obaj byli od tego czasu narażeni na CSS od tamtego przemówienia).

Trudniej jest też obsługiwać czcionki z pamięci podręcznej, które już mamy, nie wspominając o różnicach w różnych stylach zastępczych. W Smashing Magazine próbujemy zastosować kilka rozwiązań, aby jak najlepiej wykorzystać czcionki systemowe, które zainstalowali różni użytkownicy i systemy operacyjne:

 font-family: Mija,-apple-system,Arial,BlinkMacSystemFont,roboto slab,droid serif,segoe ui,Ubuntu,Cantarell,Georgia,serif;

Wiedza o tym, która czcionka jest używana lub posiadanie oddzielnych korekt dla każdej z nich i upewnienie się, że są one stosowane prawidłowo, może szybko stać się dość skomplikowana.

Nadchodzi lepsze rozwiązanie

Tak więc jest to krótkie podsumowanie obecnego stanu rzeczy. Jednak na horyzoncie zaczyna się pojawiać dym.

Jak wspomniałem wcześniej, głównym problemem z zastosowaniem różnic w stylizacji awaryjnej było ich dodanie, a następnie usunięcie. Co by było, gdybyśmy mogli powiedzieć przeglądarce, że te różnice dotyczą tylko czcionek zastępczych?

To jest dokładnie to, co robi nowy zestaw deskryptorów czcionek proponowany jako część modułu CSS Fonts Level 5. Są one stosowane do deklaracji @font-face , w których zdefiniowana jest indywidualna czcionka.

Simon Hearne napisał o tej proponowanej aktualizacji specyfikacji deskryptorów fontów, która zawiera cztery nowe deskryptory: ascent-override , descent-override , line-gap-override i advance-override (od czasu ich usunięcia). Możesz grać z placem zabaw F-mods stworzonym przez Simona, aby załadować niestandardowe i zapasowe czcionki, a następnie zagrać z nadpisaniami, aby uzyskać idealne dopasowanie.

Jak pisze Simon, połączenie tych czterech deskryptorów pozwoliło nam nadpisać układ czcionki zastępczej, aby dopasować ją do czcionki internetowej, ale tak naprawdę modyfikują one tylko odstępy i pozycjonowanie w pionie. Tak więc dla odstępów między znakami i literami, musimy zapewnić dodatkowy CSS.

Ale wydaje się, że wszystko znowu się zmienia. Ostatnio zrezygnowano advance-override na rzecz nadchodzącego deskryptora size-adjust który pozwala nam zredukować zmiany w układzie poprzez dopasowanie zastępczej czcionki i podstawowej czcionki internetowej za pomocą współczynnika skali dla glifów (procent).

Jak to działa? Załóżmy, że masz następujący kod CSS:

 @font-face { font-family: 'Lato'; src: url('/static/fonts/Lato.woff2') format('woff2'); font-weight: 400; } h1 { font-family: Lato, Arial, sans-serif; }

Następnie należy utworzyć @font-face dla czcionki zastępczej Arial i zastosować do niej deskryptory korektora . Otrzymasz wtedy następujący fragment kodu CSS:

 @font-face { font-family: 'Lato'; src: url('/static/fonts/Lato.woff2') format('woff2'); font-weight: 400; } @font-face { font-family: "Lato-fallback"; size-adjust: 97.38%; ascent-override: 99%; src: local("Arial"); } h1 { font-family: Lato, Lato-fallback, sans-serif; }

Oznacza to, że jeśli początkowo używana jest czcionka Lato-fallback (ponieważ Arial jest czcionką local i może być używana od razu bez dodatkowego pobierania), wówczas size-adjust i ascent-override pozwalają zbliżyć się do czcionki Lato. Jest to dodatkowa deklaracja @font-face do napisania, ale z pewnością o wiele łatwiejsza niż obręcze, przez które musieliśmy przeskakiwać wcześniej!

Ogólnie rzecz biorąc, w tej specyfikacji zawarte są cztery główne deskryptory @font-face : size-adjust , ascent-override , descent-override i line-gap-override , a kilka innych jest nadal rozważanych dla indeksu dolnego, indeksu górnego i innych przypadków użycia .

Malte Ubl stworzył bardzo przydatne narzędzie do automatycznego obliczania tych ustawień, biorąc pod uwagę dwie czcionki i przeglądarkę obsługującą te nowe ustawienia (więcej o tym za chwilę!). Jak podkreśla Malte, komputery są w tym dobre! Idealnie moglibyśmy również udostępnić te ustawienia dla typowych czcionek twórcom stron internetowych, np. może podać te wskazówki w kolekcjach czcionek, takich jak Google Fonts? To z pewnością pomogłoby zwiększyć adopcję.

Teraz różne systemy operacyjne mogą mieć nieco inne ustawienia czcionek i ich dokładne ustawienie jest w zasadzie niewykonalnym zadaniem, ale nie to jest celem. Celem jest wypełnienie luki, więc korzystanie font-display: swap nie jest już tak drażniącym doświadczeniem, ale nie musimy popadać w skrajności związane z optional czcionkami internetowymi lub ich brakiem.

Kiedy możemy zacząć z tego korzystać?

Trzy z tych ustawień zostały już dostarczone w Chrome od wersji 87 , chociaż deskryptor size-adjust klucza nie jest jeszcze dostępny w żadnej stabilnej przeglądarce. Jednak Chrome Canary ma to, podobnie jak Firefox za flagą, więc nie jest to jakaś abstrakcyjna, odległa koncepcja, ale coś, co może wkrótce wylądować.

W tej chwili specyfikacja zawiera różnego rodzaju zastrzeżenia i ostrzeżenia, że ​​nie jest jeszcze gotowa na działanie w czasie rzeczywistym, ale z pewnością wydaje się, że już tam jest. Jak zawsze istnieje równowaga między nami, projektantami i programistami, testowaniem i przekazywaniem opinii oraz zniechęcaniem do korzystania z niej, więc implementacja nie utknie, ponieważ zbyt wiele osób korzysta z wcześniejszej wersji roboczej.

Chrome zadeklarował zamiar udostępnienia size-adjust w Chrome 92, która ma zostać wydana 20 lipca, prawdopodobnie wskazując, że już prawie jest.

Więc nie jest jeszcze gotowy, ale wygląda na to, że nadejdzie w bardzo niedalekiej przyszłości. W międzyczasie pobaw się z wersją demonstracyjną w Chrome Canary i sprawdź, czy może ona zbliżyć się do rozwiązania problemów związanych z ładowaniem czcionek i wpływu CLS, jaki powodują.