Media, Images & Files

生產環境中的可變字型:沒有人告訴你的取捨

可變字型可以簡化你的字型堆疊並提升設計彈性,但它們不會自動帶來效能收益。

The Wux Webtools Team The Wux Webtools Team 10 分鐘閱讀 AI輔助,人類審核
Abstract illustration of variable font axes, glyph outlines, and web performance indicators in a browser workspace.
目錄
  1. 可變字型不是神奇的字型壓縮
  2. 顯而易見的優點:更少檔案、更有表現力的字體
  3. 第一個隱藏取捨:一個檔案可能比你實際需要的檔案更大
  4. 案例 A:使用多種字重的行銷網站
  5. 案例 B:只使用 regular 與 bold 的產品應用程式
  6. 第二個取捨:子集化變得更重要,而不是更不重要
  7. 第三個取捨:CSS 可能變得太聰明
  8. 第四個取捨:算繪差異仍然存在
  9. 第五個取捨:快取可能有利也可能不利
  10. 第六個取捨:Lighthouse 不會解釋完整故事
  11. 實用的生產環境檢查清單
  12. 1. 它取代了哪些靜態檔案?
  13. 2. 你會暴露哪些軸線?
  14. 3. 你能安全地子集化嗎?
  15. 4. 後備 metrics 是否已設定?
  16. 5. `font-display` 是否有意識地設定?
  17. 6. 你測試過低階裝置嗎?
  18. 7. 是否有回復計畫?
  19. 何時可變字型是好的生產環境選擇
  20. 生產環境的經驗法則

可變字型不是神奇的字型壓縮

可變字型經常被介紹成網頁排版的俐落解法:一個檔案、多種字重、更少請求、更順暢的設計系統。這個說法大方向正確,但並不完整。

在生產環境中,可變字型不像是用一個檔案取代六個檔案,比較像是導入一套新的排版執行環境。你會取得對字重、寬度、傾斜、光學尺寸,甚至有時是自訂軸線的表現控制權。同時,你也會承接關於檔案大小、瀏覽器算繪、後備行為、設計治理與效能量測的新決策。

結果可能非常出色。也可能比它所取代的靜態設定更糟。

如果你目前的網站送出同一字族的五種字重,經過良好子集化的可變字型可能會減少請求並簡化 CSS。如果你的網站只送出一個 regular 字重與一個 bold 字重,可變字型可能會為了使用者永遠用不到的彈性而增加位元組。這就是大家常常略過的生產環境取捨。

若想建立更完整的字型載入策略基礎,我們關於為什麼 web fonts are still the easiest performance win on most sites 的指南會是有用的延伸閱讀。可變字型不會改變基本原則:送出更少位元組、降低算繪延遲,並讓後備文字可以被接受。

顯而易見的優點:更少檔案、更有表現力的字體

傳統的靜態字型設定通常長這樣:

  • Regular 400
  • Italic 400
  • Medium 500
  • Semibold 600
  • Bold 700
  • 也許還有一個獨立的 display 字體

每個檔案都會被獨立下載、快取與算繪。如果頁面在首屏使用多種字重,請求很快就會堆疊起來。

可變字型可以把其中幾種字重收斂成一個檔案。你不再載入 Inter-Regular.woff2、Inter-Medium.woff2 與 Inter-Bold.woff2,而是載入一個可變字型檔案,並在連續範圍內使用 font-weight: 400 700。

這會解鎖真正的好處:

  • 需要管理的字型檔案更少
  • 字重之間的插值更一致
  • 更細緻的響應式排版
  • 更容易建立主題系統
  • 更好的 design token 對齊

對設計系統來說,這種控制尤其有用。按鈕標籤可以使用 580,而不必被迫落在 500 或 600。狹窄卡片標題可以在字型支援時使用稍微壓縮的寬度軸。Display headline 可以在可用時使用光學尺寸。

但這些控制存在,並不代表你應該全部使用。

第一個隱藏取捨:一個檔案可能比你實際需要的檔案更大

可變字型包含設計空間的插值資料。這個設計空間是有成本的。單一可變字型檔案可能比一兩個靜態字型檔案更大。

當它取代許多檔案時,這不是問題。當它取代的是一套克制的字型堆疊時,這就是問題。

請看兩個常見情境:

案例 A:使用多種字重的行銷網站

網站在各頁面使用 300、400、500、600、700 與 italics。經過仔細子集化的可變字型很可能有幫助。它會降低請求開銷,並簡化未來維護。

案例 B:只使用 regular 與 bold 的產品應用程式

介面使用 400 與 700,並以系統字型作為後備。可變字型可能會增加不必要的位元組。這種彈性在 Figma 裡很美好,但在瀏覽器中不一定有用。

錯誤在於拿「一個可變字型檔案」去比較「許多理論上的靜態檔案」,而不是拿它去比較你的真實頁面目前實際使用的檔案。

量測關鍵版型實際載入的字型位元組。然後用相同的字元子集與相同的 preload 策略測試可變字型版本。不要假設可變字型版本一定會贏。

第二個取捨:子集化變得更重要,而不是更不重要

可變字型讓子集化更有價值,因為基礎檔案可能包含大量內容:字形、語言支援、OpenType 功能、多個軸線與 metadata。

多數生產網站不需要字型中的每個字形。如果你只提供英文內容,可能不需要完整的泛歐覆蓋、西里爾文、希臘文、越南文與每個符號區塊。如果你確實提供多語內容,也可能仍然會想使用語言特定子集,而不是一個通用檔案。

實務做法通常是:

  1. 為多數使用者保留核心 Latin 子集。
  2. 只在內容需要時加入延伸子集。
  3. 使用 unicode-range 讓瀏覽器選擇正確檔案。
  4. 如有需要,為少見文字系統保留靜態後備。

這也是可變字型可能變得棘手的地方。有些字型流程可以輕鬆子集化靜態字型,卻會錯誤處理可變軸、hinting 或 metadata。務必確認輸出的字型在你計畫使用的整個軸線範圍內仍能正確運作。

壞掉的子集比大型字型更糟。它會安靜地失敗:奇怪的算繪、缺少字形、不一致的字重,或只在特定語系中出現的版面變化。

第三個取捨:CSS 可能變得太聰明

可變字型透過 CSS 暴露軸線。字重與寬度等標準軸可以乾淨地對應到 font-weight 與 font-stretch 這類屬性。自訂軸通常使用 font-variation-settings。

這種能力會誘惑團隊變得太聰明:

.card-title {
  font-variation-settings: "wght" 623, "wdth" 92;
}

這在技術上可能有效,但很少是好的設計系統介面。任意軸線值散落在 CSS 中,難以審查、難以重構,也很容易誤用。

優先使用 design token 或具名 utility:

:root {
  --font-weight-body: 400;
  --font-weight-heading: 680;
  --font-width-compact: 94;
}

.card-title {
  font-weight: var(--font-weight-heading);
  font-stretch: var(--font-width-compact);
}

盡可能使用標準 CSS 屬性。將 font-variation-settings 保留給沒有較高階屬性的軸線。

也要小心動畫。為字重或寬度做動畫,在少量使用時可以很有品味,但也可能造成 reflow、視覺不穩定,以及在低功耗裝置上產生不必要的工作。不要只因為字型允許,就讓排版變成動態效果遊樂場。

第四個取捨:算繪差異仍然存在

現代瀏覽器對可變字型的支援已經很強,但算繪並非到處都一樣。作業系統文字光柵化器、瀏覽器引擎、反鋸齒與字型 hinting 都會影響結果。

同一字族中,可變字型的 500 字重不一定看起來完全像靜態 500 檔案。在某些字族裡,靜態實例經過手動調校,而插值產生的可變實例是以數學方式生成。在小尺寸下,這種差異可能很重要。

這對內文、導覽、密集表格與 UI 標籤尤其相關。你的介面文字越多,就越應該測試真實閱讀情境,而不只是測試 hero typography。

如果你在轉向可變字型時也重新檢視文字系統,請從可讀性而不是新奇感出發。我們的 practical guide to readable type on the modern web 涵蓋了不華麗但通常更重要的選擇——行長、尺寸、對比、間距——它們往往比擁有 1,000 種可用字重更關鍵。

第五個取捨:快取可能有利也可能不利

單一可變字型檔案可以被快取一次,並在多個頁面重複使用。這很好。

但如果檔案很大且阻塞算繪,首次造訪就必須先支付完整成本。靜態字型有時可以更有選擇性地載入:先載入內文 regular、稍後載入 bold,只在需要的頁面載入 display。

沒有通用答案。正確設定取決於流量模式:

  • 使用者每個工作階段會瀏覽許多頁面嗎?共享可變字型檔案可能划算。
  • 使用者會停在一篇文章後離開嗎?較小的靜態檔案可能更好。
  • 首頁只需要一種字重嗎?不要為未來頁面 preload 大型設計空間。
  • 應用程式在登入後使用,且有頻繁重訪嗎?快取重用會變得更有價值。

Preload 也需要克制。Preload 首屏文字所需的字型,而不是每個可能的字型。Preload 是一種優先權宣告。太多優先權宣告會變成雜訊。

第六個取捨:Lighthouse 不會解釋完整故事

效能工具可以顯示未使用的字型位元組、阻塞算繪的請求、版面位移與網路成本。它們無法告訴你視覺彈性是否值得這些 payload。

可變字型遷移應該用多個訊號判斷:

  • 首次檢視的總傳輸字型位元組
  • 字型請求數量
  • 對 Largest Contentful Paint 的影響
  • 字型交換造成的 Cumulative Layout Shift
  • 重複檢視的快取行為
  • 與已核准設計的視覺匹配
  • 常見尺寸下的可讀性

如果字型遷移後報告變紅,不要驚慌。問題可能是 preload 順序、後備字型 metrics,或子集不匹配,而不是可變字型本身。我們關於 how to read a Lighthouse report without panicking 的指南在這裡很相關:把實驗室分數視為診斷線索,而不是判決。

實用的生產環境檢查清單

在發布可變字型前,請回答這些問題:

1. 它取代了哪些靜態檔案?

列出生產環境實際使用的檔案,而不是設計系統理論上支援的內容。包含字重、樣式、字元集與頁面版型。

2. 你會暴露哪些軸線?

多數團隊應該暴露字重,也許還有寬度,很少需要更多。若字型良好支援光學尺寸,它可能很有用,但要測試。自訂軸應該有明確的產品目的。

3. 你能安全地子集化嗎?

子集化後執行視覺回歸檢查。測試重音字元、標點、貨幣符號、包含在內的圖示,以及所有支援語言。

4. 後備 metrics 是否已設定?

在適當情況下使用 size-adjust、ascent-override、descent-override 與 line-gap-override 等現代 CSS 工具。良好的後備 metrics 可減少字型載入期間的版面位移。

5. font-display 是否有意識地設定?

font-display: swap 很常見,但不一定永遠完美。它改善文字可見性,但如果後備 metrics 不佳,可能會產生明顯的切換。對非關鍵字型而言,若避免干擾比保證品牌排版更重要,optional 可能適用。

6. 你測試過低階裝置嗎?

在開發者筆電上感覺順暢的字型,可能在平價 Android 硬體上算繪緩慢。至少測試一台低功耗裝置或節流設定檔。

7. 是否有回復計畫?

字型變更會影響每個頁面。保留舊的靜態設定一段足夠長的時間,以便在出現算繪、本地化或效能問題時快速回復。

何時可變字型是好的生產環境選擇

在以下情況下,可變字型通常值得考慮:

  • 你使用同一字族的三種或更多字重。
  • 你維護橫跨多種版型的設計系統。
  • 你需要具備寬度或光學尺寸控制的響應式排版。
  • 使用者常在每個工作階段瀏覽多個頁面。
  • 你可以正確地子集化並測試字型流程。

在以下情況下,它們的吸引力較低:

  • 你只需要 regular 與 bold。
  • 可變字型檔案比目前設定大很多。
  • 該字型在文字尺寸下的插值品質不佳。
  • 你的團隊會在 CSS 中散布任意軸線值。
  • 你無法測試本地化與後備行為。

清醒的看法是:可變字型是一種能力,不是預設的最佳化。它們會獎勵已經謹慎管理字型的團隊。也會懲罰那些把排版視為裝飾、把字型載入當成事後才想的團隊。

<!-- tool-cta:start -->

💡 試試這個: 在為正式環境對可變字型進行子集化並封裝時,Webfont Generator 會產生附有相符 CSS 的 WOFF2 輸出。

<!-- tool-cta:end -->

生產環境的經驗法則

當可變字型能降低複雜度,或實現明確的設計成果時,就使用它們。不要因為「一個檔案」聽起來更乾淨就使用。

最好的生產環境實作通常很無聊:一個仔細子集化的可變字型、少量經核准的軸線值、合理的後備字型、克制的 preload,以及真實裝置測試。這不如無限排版可能性那麼令人興奮。但它更有可能讓你的網站變得更好。

常見問題

可變字型的效能比較好嗎?
有時候是。它們可以減少請求並取代多個靜態檔案,但可變字型也可能比頁面實際需要的一兩個靜態檔案更大。請先量測傳輸位元組、請求數、算繪時間與快取行為,再做決定。
我應該把所有東西都用 font-variation-settings 嗎?
不應該。當標準 CSS 屬性如 font-weight 與 font-stretch 能對應到你需要的軸線時,請使用它們。將 font-variation-settings 保留給自訂軸,或沒有較高階 CSS 屬性的情境。
可變字型能在現代瀏覽器中運作嗎?
可以,目前主流瀏覽器的支援都很強。生產環境中更大的顧慮是檔案大小、算繪差異、子集化品質、後備行為,以及舊版瀏覽器或嵌入式 WebView 對你的受眾是否重要。
我可以為可變字型軸線做動畫嗎?
技術上可以。在生產環境中,請克制使用。為字重或寬度做動畫可能造成版面移動或算繪成本,尤其是在較低階裝置上。保持細緻、測試效能,並在相關情境中尊重 reduced-motion 偏好。
什麼時候我應該繼續使用靜態字型?
當你只需要 regular 與 bold、可變字型檔案明顯更大,或靜態實例對小尺寸文字有更好的調校時,靜態字型通常更好。更簡單往往就是正確答案。

來源與進一步閱讀

  1. MDN Web Docs: Variable fonts guide
  2. web.dev: Introduction to variable fonts on the web
  3. W3C: CSS Fonts Module Level 4
  4. HTTP Archive Web Almanac: Fonts
關於作者
The Wux Webtools Team

最後更新:

繼續閱讀