預先載入選用字型,避免版面配置位移和閃爍未顯示的文字 (FOIT)

自 Chrome 83 版起,您可以結合 link rel="preload" 和 font-display: optional,完全移除版面配置卡頓

Chrome 83 會在最佳化轉譯週期後,消除預先載入選用字型的版面配置轉換。將 <link rel="preload">font-display: optional 結合,是確保在轉譯自訂字型時不會發生版面配置卡頓的最佳方法。

瀏覽器相容性

請查看 MDN 的資料,取得最新的跨瀏覽器支援資訊:

字型轉譯

當網頁上的資源發生動態變更,導致內容「移位」時,就會發生版面配置移位或重新版面配置。擷取及轉譯網路字型可能會直接導致版面配置偏移,原因如下:

  • 備用字型會與新字型互換 (「閃現未設定樣式的文字」)
  • 在新的字型轉譯至頁面之前,系統會顯示「隱藏」文字 (即「閃現隱藏文字」)

CSS font-display 屬性提供一種方法,可透過一系列不同的支援值 (autoblockswapfallbackoptional) 修改自訂字型的算繪行為。選擇要使用的值取決於非同步載入字型的偏好行為。不過,這些支援的值每一個都會以上述兩種方式之一觸發重新版面配置!

選用字型

font-display 屬性使用三個時間段的時間表,處理需要先下載才能轉譯的字型:

  • Block:轉譯「不可見」文字,但在載入完成後立即切換為網路字型。
  • Swap:使用備用系統字型轉譯文字,但在載入完成後立即切換為網路字型。
  • 失敗:使用備用系統字型轉譯文字。

先前,以 font-display: optional 指定的字型具有 100 毫秒的封鎖期間,且沒有交換期間。也就是說,在切換為備用字型之前,系統會非常短暫地顯示「隱藏」文字。如果字型未在 100 毫秒內下載完成,系統就會使用備用字型,且不會進行切換。

圖表顯示字型無法載入時,先前的選用字型行為
在 Chrome 中,如果字型下載時間超過 100 毫秒的封鎖期間,font-display: optional 的行為會變成如下

不過,如果字型在 100 毫秒的封鎖期間結束前下載,系統就會轉譯並在網頁上使用自訂字型。

圖表顯示字型載入時間內的舊版選用字型行為
Chrome 在字型下載前 (即 100 毫秒封鎖期間前)
的舊 font-display: optional 行為

無論是否使用備用字型,或自訂字型是否在期限內載入完成,Chrome 都會在兩種情況下重新轉譯網頁兩次。這會導致隱藏文字出現輕微閃爍,並在渲染新字型的情況下,導致版面配置出現卡頓,進而移動部分網頁內容。即使字型儲存在瀏覽器的磁碟快取中,且在封鎖期間結束前就能順利載入,也會發生這種情況。

Chrome 83 已推出最佳化功能,可完全移除使用 <link rel="preload'> 預先載入的選用字型的第一個轉譯週期。相反地,系統會在自訂字型載入完成或經過一段時間後,才會開始轉譯。這個逾時期限目前設為 100 毫秒,但為了提升效能,這個值日後可能會有所變動。

圖表:顯示字型無法載入時,新的預先載入選用字型行為
當字型預先載入並在 100 毫秒封鎖期間之後下載時,Chrome 中的新 font-display: optional 行為 (不會閃現不可見文字)
圖表顯示在字型載入期間,新的預先載入選用字型行為
當字型預先載入並在 100 毫秒封鎖期間之前下載時,Chrome 中的新 font-display: optional 行為 (不會閃現不可見文字)

在 Chrome 中預先載入選用字型,可避免版面配置出現卡頓和未設定樣式的文字閃爍。這與 CSS 字體模組第 4 級中指定的必要行為相符,其中可選字體不應造成重新版面配置,使用者代理程式則可將轉譯作業延遲一段適當的時間。

雖然不需要預先載入選用字型,但這樣做可大幅提高在第一個轉譯週期前載入字型的機會,尤其是在字型尚未儲存在瀏覽器快取中時。

結論

Chrome 團隊很想瞭解您在使用這些新最佳化功能時,預先載入選用字型的體驗如何!如果遇到任何問題,或想要提出任何功能建議,請回報問題