İyileştirilmiş yazı tipi yedekleri

Katie Hempenius
Katie Hempenius

Özet

Bu makalede, yedek yazı tipleri ile size-adjust, ascent-override, descent-override ve line-gap-override API'leri ayrıntılı bir şekilde açıklanmaktadır. Bu API'ler, bir web yazı tipinin boyutlarına yakın veya tam olarak eşleşen yedek yazı tipi yüzleri oluşturmak için yerel yazı tiplerinin kullanılmasını mümkün kılar. Bu, yazı tipi değişikliğinden kaynaklanan düzen kaymalarını azaltır veya ortadan kaldırır.

Bu makaleyi okumayı atlamak isterseniz bu API'leri hemen kullanmaya başlamak için kullanabileceğiniz bazı araçlar şunlardır:

Çerçeve araçları:

  • @next/font: Sonraki 13'ten itibaren next/font yazı tipi metriğini geçersiz kılmalarını ve eşleşen yazı tipi yedeklerini sağlamak için size-adjust özelliğini otomatik olarak kullanır.
  • @nuxtjs/fontaine: Nuxt 3'ten itibaren, eşleşen yazı tipi yedeklerini otomatik olarak oluşturmak ve Nuxt uygulamanız tarafından kullanılan stil sayfalarına eklemek için nuxt/fontaine kullanabilirsiniz.

Çerçeve dışı araçlar:

  • Fontaine: Fontaine, yazı tipi metriği geçersiz kılmalarını kullanan yazı tipi yedeklerini otomatik olarak oluşturup ekleyen bir kitaplıktır.
  • Bu depo, Google Fonts tarafından barındırılan tüm yazı tipleri için yazı tipi metriği geçersiz kılmalarını içerir. Bu değerler kopyalanıp stil sayfalarınıza yapıştırılabilir.

Arka plan

Yedek yazı tipi, birincil yazı tipi yüzü henüz yüklenmediğinde kullanılan veya sayfa içeriğini oluşturmak için gereken glifler eksik olduğunda kullanılan yazı tipi yüzüdür. Örneğin aşağıdaki CSS, "Roboto" için sans-serif yazı tipi ailesinin yedek yazı tipi olarak kullanılması gerektiğini belirtir.

font-family: "Roboto" , sans-serif;

Yedek yazı tipleri, metinlerin daha hızlı oluşturulması için (yani font-display: swap kullanılarak) kullanılabilir. Sonuç olarak sayfa içeriği daha önce okunabilir ve kullanışlıdır. Ancak, önceden bu durum düzen kararsızlığına neden olmuştur: Düzen kaymaları genellikle yedek yazı tipi web yazı tipiyle değiştirildiğinde meydana gelir. Ancak aşağıda açıklanan yeni API'ler, web yazı tipiyle aynı miktarda alan kaplayan yedek yazı tipi yüzleri oluşturmaya olanak tanıyarak bu sorunu azaltabilir veya ortadan kaldırabilir.

İyileştirilmiş yazı tipi yedekleri

"İyileştirilmiş" yazı tipi yedekleri oluşturmaya yönelik iki olası yaklaşım vardır. Daha basit yaklaşım yalnızca yazı tipi metriğini geçersiz kılma API'sini kullanır. Daha karmaşık (ancak daha güçlü) yaklaşımda hem yazı tipi metriği geçersiz kılma API'si hem de size-adjust kullanılır. Bu makalede, bu yaklaşımların her ikisi de açıklanmaktadır.

Yazı tipi metriği geçersiz kılmalarının işleyiş şekli

Giriş

Yazı tipi metriği geçersiz kılmaları, bir yazı tipinin çıkış, iniş ve satır boşluğunu geçersiz kılma yöntemi sağlar:

  • Takım, yazı tipindeki gliflerin referans değerden daha uzun olduğu en uzun mesafeyi ölçer.
  • İniş, yazı tipi gliflerinin referans değerin altına uzandığı en uzun mesafeyi ölçer.
  • "Önde gelen" olarak da adlandırılan satır boşluğu, ardışık metin satırları arasındaki mesafeyi ölçer.

Yazı tipinin çıkış, iniş ve çizgi aralığını gösteren şema.

Yazı tipi metriği geçersiz kılmaları; web yazı tipinin çıkış, iniş ve çizgi boşluğuyla eşleşecek şekilde yedek yazı tipinin çıkış, iniş ve çizgi boşluğunu geçersiz kılmak için kullanılabilir. Sonuç olarak, web yazı tipi ve ayarlanan yedek yazı tipi her zaman aynı dikey boyutlara sahip olacaktır.

Yazı tipi metriği geçersiz kılmaları, şuna benzer bir stil sayfasında kullanılır:

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%;
}

Bu makalenin başında listelenen araçlar, doğru yazı tipi metriği geçersiz kılma değerlerini oluşturabilir. Ancak, bu değerleri kendiniz de hesaplayabilirsiniz.

Yazı tipi metriği geçersiz kılmaları hesaplanıyor

Aşağıdaki denklemler, belirli bir web yazı tipi için yazı tipi metriği geçersiz kılmalarını verir. Yazı tipi metriği geçersiz kılma değerleri ondalık sayı olarak değil, yüzde olarak (örneğin 105%) yazılmalıdır.

ascent-override = ascent/unitsPerEm
descent-override = descent/unitsPerEm
line-gap-override = line-gap/unitsPerEm

Örneğin, Poppin'ler yazı tipi için yazı tipi metriği geçersiz kılmaları aşağıdaki gibidir:

/*
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 */

ascent, descent, line-gap ve unitsPerEm değerlerinin tümü web yazı tipinin meta verilerinden gelir. Bu makalenin bir sonraki bölümünde, bu değerlerin nasıl elde edileceği açıklanmaktadır.

Yazı tipi tablolarını okuma

Yazı tiplerinin meta verileri (özellikle de yazı tipi tabloları), yazı tipi metriği geçersiz kılmalarını hesaplamak için ihtiyacınız olan tüm bilgileri içerir.

FontForge'daki Yazı Tipi Bilgileri iletişim kutusunun ekran görüntüsü. İletişim kutusunda "Typo Ascent", "Typo Inscent" ve "Typo Line Gap" gibi yazı tipi metrikleri gösterilir.
Yazı tipi meta verilerini görüntülemek için FontForge'u kullanma

Bir yazı tipinin meta verilerini okumak için kullanabileceğiniz bazı araçlar şunlardır:

  • fontkit, Node.js için oluşturulmuş bir yazı tipi motorudur. Bu kod snippet'inde, yazı tipi metriği geçersiz kılmalarını hesaplamak için fontkit'in nasıl kullanılacağı gösterilmektedir.
  • Capsize, bir yazı tipi boyutu ve düzen kitaplığıdır. Capsize, çeşitli yazı tipi metrikleri hakkında bilgi almaya yönelik bir API sunar.
  • fontdrop.info, yazı tipi tablolarını ve yazı tipiyle ilgili diğer bilgileri tarayıcıdan görüntülemenize olanak tanıyan bir web sitesidir.
  • Font Forge, popüler bir masaüstü yazı tipi düzenleyicidir. ascent, descent ve line-gap öğelerini görüntülemek için: Font Info iletişim kutusunu açın, OS/2 menüsünü, ardından Metrics sekmesini seçin. UPM öğesini görüntülemek için: Font Info iletişim kutusunu açın, ardından General menüsünü seçin.

Yazı tipi tablolarını anlama

"Çıkış" gibi kavramlara birden fazla metrik ile atıfta bulunulduğunu fark edebilirsiniz. Örneğin, hheaAscent, typoAscent ve winAscent metrikleri vardır. Bu durum, farklı işletim sistemlerinin yazı tipi oluşturma konusunda farklı yaklaşımlar benimsemesinden kaynaklanır. OSX cihazlardaki programlar genellikle hhea* yazı tipi metriklerini kullanırken Windows cihazlardaki programlar genellikle typo* (sTypo* olarak da bilinir) veya win* yazı tipi metriklerini kullanır.

Yazı tipine, tarayıcıya ve işletim sistemine bağlı olarak hhea, typo veya win metrikleri kullanılarak yazı tipi oluşturulur.

Mac Windows
Chromium "hhea" tablosundaki metrikleri kullanır. "USE_TYPO_METRICS" ayarlanmışsa "typo" tablosundaki metrikleri kullanır, aksi takdirde "win" tablosundaki metrikleri kullanır.
Firefox "USE_TYPO_METRICS" ayarlanmışsa "typo" tablosundaki metrikleri kullanır, aksi takdirde "hhea" tablosundaki metrikleri kullanır. "USE_TYPO_METRICS" ayarlanmışsa "typo" tablosundaki metrikleri kullanır, aksi takdirde "win" tablosundaki metrikleri kullanır.
Safari "hhea" tablosundaki metrikleri kullanır. "USE_TYPO_METRICS" ayarlanmışsa "typo" tablosundaki metrikleri kullanır, aksi takdirde "win" tablosundaki metrikleri kullanır.

Yazı tipi metriklerinin işletim sistemlerinde nasıl çalıştığı hakkında daha fazla bilgi için dikey metriklerle ilgili bu makaleyi inceleyin.

Cihazlar arası uyumluluk

Yazı tipi metriklerinin büyük çoğunluğunda (örneğin, Google Fonts tarafından barındırılan yazı tiplerinin yaklaşık% 90'ı) kullanıcının işletim sistemi bilinmeden güvenli bir şekilde kullanılabilir. Diğer bir deyişle, bu yazı tipleri için ascent-override, descent-override ve linegap-override değerleri hhea, typo veya win metriklerinin geçerli olmasından bağımsız olarak tamamen aynı kalır. Bu depo, bunun hangi yazı tipleri için geçerli olduğu ve hangi yazı tipleri için geçerli olmadığı hakkında bilgi sağlar.

OSX ve Windows cihazlarda ayrı yazı tipi metriği geçersiz kılma gruplarının kullanılmasını gerektiren bir yazı tipi kullanıyorsanız yazı tipi metriği geçersiz kılmaları ve size-adjust özelliğini yalnızca stil sayfalarınızı kullanıcının işletim sistemine göre değiştirebiliyorsanız kullanmanız önerilir.

Yazı tipi metriği geçersiz kılmalarını kullanma

Yazı tipi metriği geçersiz kılmaları, web yazı tipinin meta verilerinden (yedek yazı tipi değil) gelen ölçümler kullanılarak hesaplandığından, yedek yazı tipi olarak hangi yazı tipinin kullanıldığına bakılmaksızın aynı kalır. Örneğin:

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%;
}

Boyut düzenlemenin işleyiş şekli

Giriş

size-adjust CSS açıklayıcısı, yazı tipi gliflerinin genişliğini ve yüksekliğini orantılı olarak ölçeklendirir. Örneğin, size-adjust: 200%, yazı tipi gliflerini orijinal boyutlarının iki katı olacak şekilde ölçeklendirir. size-adjust: 50%, yazı tipi gliflerini orijinal boyutlarının yarısına ölçeklendirir.

"size-adjust: %50" ve "size-adjust: %200" kullanım sonuçlarını gösteren şema.

size-adjust, tek başına yedek yazı tipini iyileştirmek için sınırlı uygulamalara sahiptir: Çoğu durumda, yedek yazı tipinin web yazı tipiyle eşleşmesi için (orantılı olarak ölçeklenmek yerine) biraz daraltılması veya genişletilmesi gerekir. Bununla birlikte, size-adjust ile yazı tipi metriği geçersiz kılmalarının birlikte kullanılması, iki yazı tipinin hem yatay hem de dikey olarak birbiriyle eşleşmesini sağlar.

size-adjust, stil sayfalarında şu şekilde kullanılır:

@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%;
}

size-adjust özelliğinin hesaplanma yöntemi nedeniyle (bir sonraki bölümde açıklanmıştır), size-adjust değeri (ve ilgili yazı tipi metriği geçersiz kılmaları), kullanılan yedek yazı tipine göre değişir:

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%;
}

Boyut düzenleme ve yazı tipi metriği geçersiz kılmalarını hesaplama

Bunlar, size-adjust ve yazı tipi metriği geçersiz kılma işlemlerini hesaplamaya yönelik denklemlerdir:

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)

Bu girişlerin çoğu (yani çıkış, iniş ve çizgi boşluğu) doğrudan web yazı tipinin meta verilerinden okunabilir. Ancak, avgCharacterWidth değerinin yaklaşık olması gerekir.

Yaklaşık ortalama karakter genişliği

Genel olarak, ortalama karakter genişliği yalnızca yaklaşık olarak tahmin edilebilir. Ancak bunun tam olarak hesaplanabileceği bazı senaryolar vardır: örneğin, tek aralıklı yazı tipi kullanılırken veya bir metin dizesinin içeriğinin önceden bilindiği durumlarda.

avgCharacterWidth hesaplamasına yönelik naif bir yaklaşıma örnek, tüm [a-z\s] karakterlerinin ortalama genişliğini almaktır.

 Ayrı ayrı Roboto [a-zs] gliflerinin genişliğini karşılaştıran grafik.
Roboto gliflerinin genişliği

Bununla birlikte, tüm karakterlerin eşit şekilde ağırlanması, muhtemelen sık kullanılan harflerin genişliğinden (ör. e) düşük ve nadiren kullanılan harflerin genişliğinden de (ör. z) fazla ağırlığa neden olacaktır.

Doğruluğu artıran daha karmaşık bir yaklaşım, harf sıklığını hesaba katmak ve bunun yerine [a-z\s] karakterin sıklık ağırlıklı ortalama genişliğini hesaplamaktır. Bu makale, İngilizce metinlerin harf sıklığı ve ortalama kelime uzunluğu için iyi bir referanstır.

İngilizcede harf sıklığını gösteren grafik.
İngilizce harf sıklığı

Yaklaşım belirleme

Bu makalede ele alınan iki yaklaşımın her birinin avantajları ve dezavantajları vardır:

  • Yazı tipi metriği geçersiz kılma işlemlerini tek başına kullanmak, yazı tipi yedeklerinizi optimize etmeye yeni başlıyorsanız iyi bir yaklaşımdır. Bu yöntem, iki yaklaşımdan daha basit olsa da, genellikle yazı tipiyle ilgili düzen kaymalarının büyüklüğünü fark edecek kadar güçlüdür.

  • Diğer yandan, daha fazla kesinlik istiyorsanız ve biraz daha fazla çalışma ve test yapmak istiyorsanız size-adjust işlevini kullanmak iyi bir yaklaşımdır. Bu yaklaşım doğru uygulandığında, yazı tipiyle ilgili düzen kaymalarını etkili bir şekilde ortadan kaldırabilir.

Yedek yazı tiplerini seçme

Bu makalede açıklanan teknikler, web yazı tipine yakın bir yerel yazı tipi bulmaya çalışmak yerine, yazı tipi metriği geçersiz kılma işlemlerini ve yaygın olarak kullanılan yerel yazı tiplerini dönüştürmek için size-adjust'yi kullanmaya dayanır. Yerel yazı tiplerini seçerken, çok az yazı tipinin yaygın bir şekilde yerel olarak kullanılabildiğini ve tüm cihazlarda tek bir yazı tipinin bulunmayacağını unutmayın.

Sans-serif yazı tipleri için önerilen yedek yazı tipi Arial, serif yazı tipleri için de Times New Roman önerilir. Ancak bu yazı tiplerinin hiçbiri Android'de kullanılamaz (Android'deki tek sistem yazı tipi Roboto).

Aşağıdaki örnekte geniş cihaz kapsamı sağlamak için üç yedek yazı tipi kullanılmaktadır: Windows/Mac cihazları hedefleyen yedek bir yazı tipi, Android cihazları hedefleyen bir yedek yazı tipi ve genel yazı tipi ailesi kullanan bir yedek yazı tipi.

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%;
}

Geri bildirim isteği

Yazı tipi metriği geçersiz kılma özelliği ve size-adjust ile ilgili deneyiminiz hakkında geri bildirim vermek isterseniz bizimle iletişime geçebilirsiniz.