避免使用閃爍的文字

Katie Hempenius
Katie Hempenius

本程式碼研究室課程將說明如何使用 Font Face Observer 立即顯示文字。

新增字體面觀察器

Font Face Observer 是可偵測字型載入的指令碼。fontfaceobserver.js 檔案已儲存在專案目錄中,因此您不必另外新增。不過,您必須為廣告代碼新增指令碼標記。

  • 按一下「Remix to Edit」即可編輯專案。
  • fontfaceobserver.js 的指令碼標記新增至 index.html
  <div class="text">Some text.</div>
  <script src="fontfaceobserver.js" type="text/javascript"></script>
</body>

使用字型面觀察器

建立觀察者

為每個在頁面上使用的字型系列建立觀察器。

  • fontfaceobserver.js 指令碼後方加入下列指令碼。這會為「Pacifico」和「Roboto」字型系列建立觀察器:
  <script src="fontfaceobserver.js" type="text/javascript"></script>
  <script type="text/javascript">
    const pacificoObserver = new FontFaceObserver('Pacifico');
    const robotoObserver = new FontFaceObserver('Roboto');
  </script>
<body>

如果您不確定需要建立哪種字體樣式觀察器,請在 CSS 中尋找 font-family 宣告。將這些宣告的 font-family 名稱傳遞至 FontFaceObserver()。您不需要為備用字型建立字型觀察器。

舉例來說,假設您的 CSS 如下:

font-family: "Times New Roman", Times, serif;

建議新增 FontFaceObserver('Times New Roman')Times 和 serif 是備用字型,因此您不需要為這些字型宣告 FontFaceObserver。

偵測字型載入

用於偵測字型載入的程式碼如下所示:

robotoObserver.load().then(function(){
  console.log("Hooray! Font loaded.");
});

robotoObserver.load() 是字型載入時解析的承諾。

示範網站使用兩種字型,因此您必須使用 Promise.all() 等待兩個字型都載入完畢。

  • 將這個應許加入指令碼,位於您剛宣告的 FontFaceObservers 正下方:
Promise.all([
  pacificoObserver.load(),
  robotoObserver.load()
]).then(function(){
  /* Do things */
});

✔️簽到

您的指令碼現在應如下所示:

<script type="text/javascript">
const pacificoObserver = new FontFaceObserver('Pacifico');
const robotoObserver = new FontFaceObserver('Roboto');

Promise.all([
  pacificoObserver.load(),
  robotoObserver.load()
]).then(function(){
  /* Do things */
});
</script>

套用 fonts-loaded 類別

  • 將指令碼中的 /* Do things */ 註解替換為這一行:
document.documentElement.classList.add("fonts-loaded");

這會在兩種字型都載入後,將 fonts-loaded 類別新增至文件的根元素 (<html> 標記)。

✔️入住

完成的劇本應如下所示:

<script type="text/javascript">
  const pacificoObserver = new FontFaceObserver('Pacifico');
  const robotoObserver = new FontFaceObserver('Roboto');

  Promise.all([
    pacificoObserver.load(),
    robotoObserver.load()
  ]).then(function(){
    document.documentElement.className += " fonts-loaded";
  });
</script>

更新 CSS

您的網頁應設定為一開始使用系統字型,並在套用 fonts-loaded 類別後使用自訂字型。

  • 更新 CSS:
.header {
html.fonts-loaded .header {
  font-family: 'Pacifico', cursive;
}

.text
html.fonts-loaded .text {
  font-family: 'Roboto', sans-serif;
}

驗證

  • 如要預覽網站,請按下「View App」,然後按下「Fullscreen」全螢幕

如果頁面大致如下,您已成功實作 Font Face Observer,同時移除「隱形文字的 Flash」。

使用草寫字型的標題。