使用字型顯示功能控製字型效能

決定網頁字型載入時的行為,可能是重要的效能調整技巧。@font-face 的新 font-display 描述元資料可讓開發人員根據網頁字型的載入時間長短,決定其顯示 (或備用) 方式。

目前字型轉譯的差異

開發人員可以使用 Web 字體,在專案中加入豐富的字體排版,但代價是,如果使用者尚未擁有字體,瀏覽器就必須花費一些時間下載字體。由於網路可能不穩定,這段下載時間可能會對使用者體驗造成負面影響。畢竟,如果文字顯示時間過長,就算內容再美觀,也沒人會在意!

為了降低字型下載速度緩慢的風險,大多數瀏覽器都會實作逾時機制,逾時後就會使用備用字型。這是個實用的技巧,但可惜的是,瀏覽器在實際實作上有所不同。

瀏覽器 逾時 備用 交換
Chrome 35 以上版本 3 秒
Opera 3 秒
Firefox 3 秒
Internet Explorer 0 秒
Safari 無逾時設定
  • Chrome 和 Firefox 的逾時時間為三秒,逾時後文字會以備用字型顯示。如果字型成功下載,系統最終會進行換字,並使用預定字型重新算繪文字。
  • Internet Explorer 的逾時時間為零秒,因此會立即轉譯文字。如果要求的字型尚未提供,系統會使用備用字型,並在要求的字型可用時重新轉譯文字。
  • Safari 沒有逾時行為 (至少不會超過網路逾時基準值)。

更糟的是,開發人員無法完全控制這些規則對應用程式的影響。注重效能的開發人員可能會偏好使用備用字型的初始體驗,並在下次造訪時,等到有下載機會後再使用更優質的網路字型。使用字型載入 API 等工具,可能可以覆寫部分預設瀏覽器行為並提升效能,但代價是需要編寫大量 JavaScript,這些 JavaScript 必須內嵌至網頁,或從外部檔案要求,導致額外的 HTTP 延遲。

為解決這個問題,CSS 工作小組提出了新的 @font-face 描述符 font-display,以及對應的屬性,用於控制下載字型的顯示方式,直到字型完全載入為止。

字型下載時間表

與目前部分瀏覽器實作的現有字型逾時行為類似,font-display 將字型下載的生命週期分為三個主要期間。

  1. 第一個逗號是字型區塊的逗號。在此期間,如果未載入字型面,則任何嘗試使用該字型的元素都必須改為使用無形備用字型面進行轉譯。如果字型面在封鎖期間成功載入,系統就會正常使用字型面。
  2. 字型換用期會在字型封鎖期結束後立即開始。在此期間,如果未載入字型面,則任何嘗試使用該字型的元素都必須改為使用備用字型面。如果字型在切換期間成功載入,系統就會正常使用該字型。
  3. 字型失敗期會在字型交換期結束後立即開始。如果字型介面在這個期間開始時尚未載入,就會標示為載入失敗,導致正常的字型備用機制。否則,系統會正常使用字型。

瞭解這些時間長度後,您就可以使用 font-display 決定字型應如何顯示,這取決於字型是否已下載,以及下載時間。

哪個 font-display 最適合你?

如要使用 font-display 描述元,請將其加入 @font-face at-rule:

@font-face {
    font-family: 'Arvo';
    font-display: auto;
    src: local('Arvo'), url(https://fonts.gstatic.com/s/arvo/v9/rC7kKhY-eUDY-ucISTIf5PesZW2xOQ-xsNqO47m55DA.woff2) format('woff2');
}

font-display 目前支援下列值範圍 auto | block | swap | fallback | optional

自動

auto 會使用使用者代理程式使用的任何字型顯示策略。目前,大多數瀏覽器的預設策略類似於「封鎖」

封鎖

block 會為字型提供短暫的封鎖期間 (大多數情況下建議為 3 秒) 和無限的交換期間。換句話說,如果未載入字型,瀏覽器一開始會繪製「隱形」文字,但在載入字型後,就會立即切換字型。為此,瀏覽器會建立匿名字型面,其度量方式與所選字型相似,但所有字形均不含「墨水」。只有在需要以特定字體呈現文字才能使用網頁時,才應使用這個值。

翻譯

swap 會為字型面指定零秒的區塊時間和無限的交換時間。也就是說,如果未載入字體,瀏覽器會立即以備用字體繪製文字,但在載入字體後,就會立即切換字體。與 block 類似,只有在以特定字型轉譯文字對網頁而言十分重要時,才應使用這個值,但使用任何字型轉譯時,仍可傳達正確訊息。標誌文字是替換的理想選擇,因為使用合理的備用字體顯示公司名稱,雖然能傳達訊息,但最終還是會使用官方字體。

備用

備用會為字型面提供極短的封鎖期間 (在大多數情況下建議為 100 毫秒以下) 和短暫的交換期間 (在大多數情況下建議為三秒)。換句話說,如果字型未載入,系統一開始會以備用字型轉譯字型,但載入後就會立即切換字型。不過,如果時間過長,系統會在網頁的剩餘生命週期中使用備用字型。備用字型是適合用於內文等內容的理想選擇,因為您希望使用者盡快開始閱讀,且不希望在載入新字型的過程中,因文字位置改變而影響使用者體驗。

選用

選用可為字型面提供極短的區塊時間 (在大多數情況下,建議使用 100 毫秒或更短的時間),並提供零秒的交換時間。與備用字型類似,如果下載字型只是「可用」而非對使用者體驗至關重要,這會是個不錯的選擇。選用值會讓瀏覽器決定是否要啟動字型下載作業,瀏覽器可能會選擇不執行,也可能會以低優先順序執行,這取決於瀏覽器認為對使用者最有利的做法為何。在使用者連線不佳的情況下,這項功能可能會是最佳的資源使用方式。

瀏覽器支援

font-display 目前在 Chrome 49 電腦版中屬於「Experimental Web Platform Features」標記,並已在 Opera 和 Android 版 Opera 中推出。

示範

請查看範例,試試 font-display。對於注重效能的開發人員來說,這可以是工具箱中另一個實用的工具!