Podsumowanie
W tym artykule znajdziesz szczegółowe informacje o fontach zapasowych i interfejsach API size-adjust
, ascent-override
, descent-override
i line-gap-override
. Te interfejsy API umożliwiają tworzenie zastępczych krojów czcionek przy użyciu czcionek lokalnych, które są zbliżone lub dokładnie pasują do wymiarów czcionki internetowej. Ogranicza to lub eliminuje przesunięcia układu związane z zamianą czcionek.
Jeśli nie chcesz czytać tego artykułu, możesz od razu zacząć korzystać z tych interfejsów API, korzystając z tych narzędzi:
Narzędzia frameworku:
- @next/font: od wersji Next 13
next/font
automatycznie korzysta z zastąpień danych o czcionkach isize-adjust
, aby zapewnić pasujące czcionki zastępcze. - @nuxtjs/fontaine: od wersji 3 Nuxt możesz używać funkcji
nuxt/fontaine
do automatycznego generowania i wstawiania pasujących czcionek zastępczych w arkuszach stylów używanych przez aplikację Nuxt.
Narzędzia spoza frameworka:
- Fontaine: Fontaine to biblioteka, która automatycznie generuje i wstawia czcionki zastępcze, które używają zastąpień metryki czcionki.
- To repozytorium zawiera zastąpienia danych czcionek dla wszystkich czcionek hostowanych przez Google Fonts. Te wartości możesz skopiować i wklejać do arkuszy stylów.
Tło
Czcionka zastępcza to krój czcionki, który jest używany, gdy główna twarz czcionki nie została jeszcze wczytana lub nie ma glifów niezbędnych do renderowania zawartości strony. Na przykład kod CSS poniżej wskazuje, że rodzina czcionek sans-serif
powinna być używana jako czcionka zastępcza dla "Roboto"
.
font-family: "Roboto" , sans-serif;
Czcionki zastępcze można stosować do szybszego renderowania tekstu (czyli za pomocą font-display: swap
). Dzięki temu treści na stronie są czytelniejsze i użyteczne wcześniej. Jednak w przeszłości wiązało się to z niestabilnością układu: zmiany w układzie często występują, gdy czcionka zastępcza jest zastępowana przez czcionkę internetową. Nowe interfejsy API opisane poniżej mogą jednak zmniejszyć lub wyeliminować ten problem, umożliwiając tworzenie czcionek zapasowych, które zajmują tyle samo miejsca co ich odpowiedniki w czcionkach internetowych.
Ulepszone opcje kreacji zastępczych czcionek
Istnieją 2 możliwe podejścia do generowania „ulepszonego” czcionki zastępczej. Prostsza metoda korzysta tylko z interfejsu API zastąpień wskaźników czcionkami. Bardziej skomplikowane (ale też bardziej zaawansowane) podejście wykorzystuje zarówno interfejs API zastępowania danych dotyczących czcionek, jak i element size-adjust
. Z tego artykułu dowiesz się, jak stosować obie te metody.
Jak działają zastąpienia danych dotyczących czcionek
Wprowadzenie
Zastąpienia danych czcionek umożliwiają zastępowanie ustawień wzniesienia, opadania i przerw między wierszami czcionki:
- Wzniesienie to największa odległość, o którą znaki czcionki wystają ponad podstawę.
- Spadek to największa odległość, o którą znaki czcionki sięgają poniżej linii bazowej.
- Odstęp między wierszami, zwany też „interlinią”, mierzy odległość między kolejnymi wierszami tekstu.
Zastępcze dane czcionki można użyć do zastąpienia wartości wspięcia, opuszczenia i odstępu między wierszami czcionki awaryjnej, aby dopasować je do wartości wspięcia, opuszczenia i odstępu między wierszami czcionki internetowej. W rezultacie czcionka internetowa i dostosowana czcionka zastępcza będą zawsze miały te same wymiary pionowe.
Zastąpienia danych pomiarowych czcionek są używane w arkuszu stylów w ten sposób:
body {
font-family: Poppins, "fallback for poppins";
}
@font-face {
font-family: "fallback for poppins";
src: local("Times New Roman");
ascent-override: 105%;
descent-override: 35%;
line-gap-override: 10%;
}
Narzędzia wymienione na początku tego artykułu mogą generować prawidłowe wartości zastąpienia danych czcionek. Możesz jednak samodzielnie obliczyć te wartości.
Obliczanie zastąpień danych dotyczących czcionek
Podane niżej równania dają wartości zastępcze czcionki dla danej czcionki internetowej. Wartości zastąpień danych dotyczących czcionek powinny być podawane w postaci procentów (np. 105%
), a nie liczb dziesiętnych.
ascent-override = ascent/unitsPerEm
descent-override = descent/unitsPerEm
line-gap-override = line-gap/unitsPerEm
Oto przykłady zastąpień danych czcionki dla czcionki Poppins:
/*
Poppins font metrics:
ascent = 1050
descent = 350
line-gap = 100
UPM: 1000
*/
ascent-override: 105%; /* = 1050/1000 */
descent-override: 35%; /* = 350/1000 */
line-gap-override: 10%; /* = 100/1000 */
Wartości ascent
, descent
, line-gap
i unitsPerEm
pochodzą z metadanych czcionki internetowej. W następnej sekcji tego artykułu dowiesz się, jak uzyskać te wartości.
Czytanie tabel czcionek
Metadane czcionki (szczególnie tabele czcionek) zawierają wszystkie informacje potrzebne do obliczenia zastąpień danych czcionki.
Oto kilka narzędzi, które możesz wykorzystać do odczytania metadanych czcionki:
- fontkit to silnik czcionek stworzony na potrzeby Node.js. Ten fragment kodu pokazuje, jak używać fontkit do obliczania zastąpień danych czcionek.
- Capsize to biblioteka z rozmiarami i układem czcionek. Capsize udostępnia interfejs API do uzyskiwania informacji o różnych parametrach czcionek.
- fontdrop.info to strona internetowa, która umożliwia wyświetlanie tabel czcionek i innych informacji o czcionkach w przeglądarce.
- Font Forge to popularny edytor czcionek na komputery. Aby wyświetlić
ascent
,descent
iline-gap
: otwórz oknoFont Info
, wybierz menuOS/2
, a następnie kliknij kartęMetrics
. Aby wyświetlićUPM
: otwórz oknoFont Info
, a potem wybierz menuGeneral
.
Tabele czcionek
Możesz zauważyć, że pojęcia takie jak „wzrost” są uwzględniane w różnych rodzajach danych, np. hheaAscent
, typoAscent
i winAscent
. Wynika to z różnych podejść do renderowania czcionek w różnych systemach operacyjnych: programy na urządzeniach z systemem OSX zwykle używają metryki czcionki hhea*
, a programy na urządzeniach z systemem Windows zwykle używają metryki czcionki typo*
(nazywanej też sTypo*
) lub win*
.
W zależności od czcionki, przeglądarki i systemu operacyjnego czcionka jest renderowana na podstawie wartości hhea
, typo
lub win
.
Mac | Windows | |
Chromium | Używa danych z tabeli „hhea”. | Jeśli ustawiono dane „USE_TYPO_METRICS”, korzysta z danych z tabeli „typo”. W przeciwnym razie korzysta z danych z tabeli „wygrana”. |
Firefox | Używa danych z tabeli „typo”, jeśli ustawiono parametr „USE_TYPO_METRICS”, w przeciwnym razie używa danych z tabeli „hhea”. | Jeśli skonfigurowano dane „USE_TYPO_METRICS”, korzysta z danych z tabeli „typo”. W przeciwnym razie używa danych z tabeli „wygrana”. |
Safari | Używa danych z tabeli „hhea”. | Używa danych z tabeli „typo”, jeśli ustawiono parametr „USE_TYPO_METRICS”, w przeciwnym razie używa danych z tabeli „win”. |
Więcej informacji o tym, jak działają dane dotyczące czcionek w różnych systemach operacyjnych, znajdziesz w tym artykule o danych pionowych.
Zgodność na różnych urządzeniach
W przypadku przeważającej większości czcionek (np. ok. 90% czcionek hostowanych przez Google Fonts) można bezpiecznie używać zastąpień danych o czcionkach bez znajomości systemu operacyjnego użytkownika. Inaczej mówiąc, w przypadku tych czcionek wartości ascent-override
, descent-override
i linegap-override
pozostają takie same niezależnie od tego, czy mają zastosowanie dane hhea
, typo
czy win
. W tym repozytorium znajdziesz informacje o tym, do których fontów się to odnosi, a do których nie.
Jeśli używasz czcionki, która wymaga stosowania osobnych zestawów zastąpień danych czcionki na urządzeniach z systemem OS X i Windows, zalecamy używanie zastąpień danych czcionki i wartości size-adjust
tylko wtedy, gdy możesz zmienić style CSS na podstawie systemu operacyjnego użytkownika.
Używanie zastąpień danych dotyczących czcionek
Zastąpienia danych o czcionce są obliczane na podstawie pomiarów pochodzących z metadanych czcionki internetowej (a nie czcionki zastępczej), więc pozostają one takie same niezależnie od tego, która czcionka zostanie użyta jako czcionka zastępcza. Na przykład:
body {
font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}
@font-face {
font-family: "fallback for Poppins";
src: local("Arial");
ascent-override: 105%;
descent-override: 35%;
line-gap-override: 10%;
}
@font-face {
font-family: "another fallback for Poppins";
src: local("Roboto");
ascent-override: 105%;
descent-override: 35%;
line-gap-override: 10%;
}
Jak działa dostosowanie rozmiaru
Wprowadzenie
Opis CSS size-adjust
proporcjonalnie skaluje szerokość i wysokość znaków czcionki. Na przykład size-adjust: 200%
skaluje znaki czcionki do podwójnego rozmiaru, a size-adjust: 50%
– do połowy.
Sam size-adjust
ma ograniczone zastosowanie do ulepszania czcionek zapasowych: w większości przypadków czcionkę zapasową trzeba nieco zwęzić lub poszerzyć (a nie skalować proporcjonalnie), aby pasowała do czcionki internetowej. Jednak połączenie size-adjust
z przesłonięciem danych dotyczących czcionek umożliwia dopasowanie dowolnych 2 czcionek zarówno w poziomie, jak i w pionie.
Metoda size-adjust
jest używana w arkuszach stylów:
@font-face {
font-family: "fallback for poppins";
src: local("Arial");
size-adjust: 60.85099821%;
ascent-override: 164.3358416%;
descent-override: 57.51754455%;
line-gap-override: 16.43358416%;
}
Ze względu na sposób obliczania wartości size-adjust
(omówiony w następnej sekcji) wartość size-adjust
(i odpowiednie zastąpienia danych dotyczących czcionek) zmienia się w zależności od używanego czcionki zastępczego:
body {
font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}
@font-face {
font-family: poppins-fallback;
src: local("Arial");
size-adjust: 60.85099821%;
ascent-override: 164.3358416%;
descent-override: 57.51754455%;
line-gap-override: 16.43358416%;
}
@font-face {
font-family: poppins-fallback-android;
src: local("Roboto");
size-adjust: 55.5193474%:
ascent-override: 180.1173909%;
descent-override: 63.04108683%;
line-gap-override: 18.01173909%;
}
Obliczanie zastąpień rozmiaru i czcionki
Oto wzory na obliczanie wartości zastąpień danych size-adjust
i danych czcionek:
size-adjust = avgCharacterWidth of web font / avgCharacterWidth of fallback font
ascent-override = web font ascent / (web font UPM * size-adjust)
descent-override = web font descent / (web font UPM * size-adjust)
line-gap-override = web font line-gap / (web font UPM * size-adjust)
Większość z tych danych wejściowych (czyli wzniosłość, skurcz i odstęp między liniami) można odczytać bezpośrednio z metadanych czcionki internetowej. Wartość avgCharacterWidth
musi być jednak przybliżona.
Przybliżona średnia szerokość znaków
Ogólnie średnia szerokość znaków może być tylko przybliżona, ale w niektórych sytuacjach można to obliczyć dokładnie, np. gdy używasz czcionki o stałej szerokości lub gdy zawartość ciągu tekstowego jest znana z wyprzedzeniem.
Przykładem najawnego sposobu obliczania wartości avgCharacterWidth
jest przyjęcie średniej szerokości wszystkich znaków ([a-z\s]
).
Jednak nadanie wszystkim znakom jednakowej wagi prawdopodobnie spowoduje, że szerokość często używanych liter (np. e
) będzie niewystarczająca, a szerokość rzadko używanych liter (np. z
) będzie zbyt duża.
Bardziej złożonym podejściem, które zwiększa dokładność, jest uwzględnienie częstości występowania liter i zamiast tego obliczenie średniej szerokości znaków [a-z\s]
z uwzględnieniem częstotliwości. W tym artykule znajdziesz informacje o częstości występowania liter i średnim długości słów w tekstach angielskich.
Wybór podejścia
Oba omówione w tym artykule podejścia mają swoje zalety i wady:
Zastępowanie danych o czcionkach jest dobrym rozwiązaniem, jeśli dopiero zaczynasz optymalizować czcionki zastępcze. Chociaż jest to prostsze z tych dwóch podejść, to zwykle jest wystarczająco skuteczne, aby znacznie zmniejszyć rozmiar zmian układu związanych z czcionką.
Jeśli natomiast zależy Ci na większej dokładności i chcesz poświęcić trochę więcej czasu na testowanie, możesz użyć funkcji
size-adjust
. Prawidłowo wdrożone rozwiązanie pozwala wyeliminować przesunięcia układu związane z czcionkami.
Wybieranie czcionek zastępczych
Techniki opisane w tym artykule polegają na użyciu zastąpień danych czcionek i funkcji size-adjust
do przekształcenia powszechnie dostępnych czcionek lokalnych, a nie z prób znalezienia lokalnej czcionki, która dokładnie zbliży się do czcionki internetowej. Podczas wybierania czcionek lokalnych należy pamiętać, że bardzo niewiele czcionki są powszechnie dostępne lokalnie, a żadna czcionka nie jest dostępna na wszystkich urządzeniach.
Zalecana czcionka zastępcza w przypadku czcionek bezszeryfowych to Arial
, a w przypadku czcionek szeryfowych – Times New Roman
. Żadna z tych czcionek nie jest jednak dostępna na Androidzie (Roboto
to jedyna czcionka systemowa na Androidzie).
W przykładzie poniżej użyto 3 czcionek zastępczych, aby zapewnić szeroki zasięg urządzeń: czcionki zastępczej, która jest kierowana na urządzenia z systemem Windows lub Mac, czcionki zastępczej, która jest kierowana na urządzenia z Androidem, oraz czcionki zastępczej, która korzysta z generatywnej rodziny czcionek.
body {
font-family: "Poppins", poppins-fallback, poppins-fallback-android, sans-serif;
}
/*
Poppins font metrics:
- ascent = 1050
- descent = 350
- line-gap = 100
- UPM: 1000
AvgCharWidth:
- Poppins: 538.0103768
- Arial: 884.1438804
- Roboto: 969.0502537
*/
@font-face {
font-family: poppins-fallback;
src: local("Arial");
size-adjust: 60.85099821%;
ascent-override: 164.3358416%;
descent-override: 57.51754455%;
line-gap-override: 16.43358416%;
}
@font-face {
font-family: poppins-fallback-android;
src: local("Roboto");
size-adjust: 55.5193474%:
ascent-override: 180.1173909%;
descent-override: 63.04108683%;
line-gap-override: 18.01173909%;
}
Prośba o opinię
Jeśli chcesz podzielić się z nami opinią na temat korzystania z zastąpień danych czcionek i elementów size-adjust
, skontaktuj się z nami.