常見問題與故事
如何設定字體載入完才顯示?
如何設定字體載入完才顯示?
熟悉 CSS 的朋友都知道,你可以使用 font-display 來設定字體載入的行為。
block:字體載入前不顯示文字。swap,fallback:字體載入前先隨便找個字體用。auto,optional:隨便你瀏覽器,開心就好。
比如說 Google Fonts 的字體載入 CSS 通常會這樣寫:
但是如果你有發現的話 emfont 並沒有這個設定。
為什麼 emfont 沒有這個設定?
原因是系統還沒載入完字體時本來就會用預設字體了,所以如果你想設定的話一定是希望在載入完字體後才顯示文字。
但問題是下載 emfont 那幾十 KB 的字體檔案其實是根本感覺不出來的,會耗時間 (那幾毫秒) 的是甚麼:
- 資料庫查詢字體資料
- 生成字體
- 計算 hash
那也許你會想說,這些都可以用 font-display: block 來解決啊!
但問題是 font-display: block 是設定在 @font-face 的 CSS 中而不是元素中的,而如果 @font-face 沒有 src 的話這段 CSS 是沒有意義的瀏覽器就會忽略。而如果隨便邊塞一個 src 的話,那載入完那個假字體他就會 fallback 顯示系統字體了。
那我們要怎麼辦?
你可以使用 Js 來用 CSS 隱藏元素,再用 emfont.init() 回傳的時候再顯示出來 (像是官網的效果一樣)。