font-family 字型名稱確認

 確認字型名稱 (font-family) 並確保它能正確載入,確實是網頁和 Canvas 開發中常見的困擾。以下是如何確認字型名稱以及解決載入問題的方法:

一、如何確認字型的「真正」名稱:

字型檔案的「檔名」不一定等於它在 CSS font-family 或 Canvas ctx.font 中應該使用的「字型家族名稱」。

  1. 作業系統的字型檢視器 (最可靠的方法,如果字型已安裝):

    • Windows:

      1. 找到你下載的字型檔案 (.ttf, .otf 等)。

      2. 雙擊該檔案,會開啟 Windows 字型檢視器。

      3. 視窗頂部或某個標籤頁會顯示「字型名稱 (Font name):」或類似的字樣。這通常就是你需要的名稱。

      4. 或者,將字型安裝到系統中 (通常是右鍵點擊字型檔 -> 安裝)。然後去「控制台」->「字型」(或 Windows 10/11 的「設定」->「個人化」->「字型」)。找到該字型,點擊它,詳細資訊裡會有確切的名稱。

    • macOS:

      1. 雙擊字型檔案,會用「字體簿 (Font Book)」開啟。

      2. 字體簿會顯示字型的完整名稱、家族名稱等。通常你要使用的是「家族 (Family)」名稱。

      3. 如果已安裝,直接打開「字體簿」應用程式,找到該字型。

    • Linux:

      1. 通常會有類似的字型管理器 (如 Font Manager)。

      2. 雙擊字型檔或在字型管理器中查看其屬性,可以找到 PostScript 名稱或家族名稱。

  2. 使用線上字型檢查工具 (如果不想安裝,或用於網頁字型):

    • FontDrop! (fontdrop.info): 直接將字型檔案拖曳到這個網站,它會分析並顯示字型的詳細資訊,包括 Family Name, PostScript Name 等。font-family 通常對應的是 "Family Name"。

    • Wakamai Fondue (wakamaifondue.com): 另一個強大的工具,可以分析字型特性,包括名稱。

  3. 字型編輯/管理軟體:

    • 像 FontForge (免費), Glyphs, FontLab 等專業軟體,或 FontBase, NexusFont (Windows) 等字型管理軟體,都能讀取字型的內部名稱。

關鍵點:

  • 注意大小寫: 雖然 CSS 的 font-family 屬性值通常不區分大小寫,但字型檔案內部定義的名稱可能有特定的大小寫。最好完全按照你在字型檢視器或工具中看到的名稱來寫,包括空格和大小寫。

  • 空格: 如果字型名稱包含空格 (例如 "Source Han Sans TC"),在使用時務必用引號括起來:font-family: "Source Han Sans TC";

二、如何在 HTML/CSS 或 Canvas 中使用下載的字型:

僅僅知道字型名稱並安裝到作業系統,並不代表瀏覽器就能直接在網頁上使用它(除非是非常普遍的系統字型)。對於下載的自訂字型,你需要在 CSS 中使用 @font-face 規則來定義它。

  1. 使用 @font-face (推薦用於網頁):
    這是在網頁上使用自訂字型的標準方法。

          @font-face {
      font-family: 'MyCustomFontName'; /* 1. 你自己定義的名稱,將在 CSS 其他地方使用 */
      src: url('path/to/your/fontfile.woff2') format('woff2'), /* 推薦格式,壓縮好,支援廣 */
           url('path/to/your/fontfile.woff') format('woff'),
           url('path/to/your/fontfile.ttf') format('truetype'); /* TTF/OTF 作為備用 */
      /* 可選:設定字重和樣式,如果你的字型檔包含特定變體 */
      /* font-weight: normal; */
      /* font-style: normal; */
    }
    
    /* 然後在你的 CSS 規則中使用你定義的 font-family 名稱 */
    body {
      font-family: 'MyCustomFontName', Arial, sans-serif; /* 'MyCustomFontName' 是你在 @font-face 中定義的 */
    }
    
    .my-element {
      font-family: 'MyCustomFontName', 'Fallback Font', sans-serif;
    }
        
    • font-family: 'MyCustomFontName';: 這裡的 'MyCustomFontName' 是你為這個 @font-face 規則指定的名稱。後續你在 CSS 中就使用這個名稱。它不一定需要和字型檔案內部儲存的實際名稱完全一樣,但保持一致性比較好。

    • src: url(...) format(...);: 指定字型檔案的路徑和格式。

      • 路徑 (path/to/your/fontfile.xxx): 確保路徑相對於你的 CSS 檔案是正確的。

      • 格式 (format): woff2, woff, truetype (for .ttf), opentype (for .otf)。建議優先使用 WOFF2 和 WOFF。

    • 備用字型 (Fallback Fonts):font-family 列表的最後,總是要加上通用的備用字型,如 sans-serifserif

  2. 在 Canvas 中使用:
    如果已經透過 @font-face 在 CSS 中成功載入了字型,並且該 CSS 作用於包含 Canvas 的 HTML 頁面,那麼 Canvas 通常可以直接使用這個字型名稱。

          const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // 假設你在 CSS 中已經用 @font-face 定義了 'MyCustomFontName'
    // 並確保字型已經載入完成 (見下方「字型載入時機」)
    ctx.font = "20px 'MyCustomFontName'"; // 使用你在 @font-face 中定義的名稱
    ctx.fillText("Hello World", 50, 50);
    
    // 如果是系統已安裝字型,且瀏覽器能直接存取 (不推薦依賴這個給所有用戶)
    // ctx.font = "20px 'Source Han Sans TC'"; // 直接使用字型的實際名稱
    // ctx.fillText("你好世界", 50, 100);
        

三、為什麼設定了沒效果?常見原因排查:

  1. 名稱錯誤:

    • 確認方法: 使用前述第一部分的方法仔細核對。

    • 解決: 修改 font-family@font-face 中的名稱。

  2. @font-face 未正確設定或字型檔案路徑錯誤:

    • 確認方法: 打開瀏覽器的開發者工具 (通常按 F12)。

      • 控制台 (Console): 檢查是否有關於字型檔案載入失敗的錯誤 (例如 404 Not Found)。

      • 網路 (Network) 標籤頁: 篩選字型 (Fonts) 請求,看字型檔案是否成功下載,狀態碼是否為 200。如果 404,就是路徑錯了。

    • 解決:

      • 確保 @font-face 中的 url() 路徑相對於 CSS 檔案是正確的。

      • 嘗試使用絕對路徑 (例如 /fonts/myfont.woff2) 或相對於網站根目錄的路徑進行測試。

  3. 字型格式不支援或檔案損壞:

    • 確認方法: 嘗試使用不同的字型格式 (WOFF2, WOFF, TTF)。確保字型檔案本身沒有損壞。

    • 解決: 轉換字型格式 (例如使用 Transfonter.org 或 Font Squirrel Webfont Generator),或重新下載字型。

  4. CSS 權重/覆蓋問題:

    • 確認方法: 在瀏覽器開發者工具中,選中你希望應用字型的元素,查看「計算樣式 (Computed)」或「樣式 (Styles)」面板,看 font-family 最終被哪個規則設定了。

    • 解決: 提高你的 CSS 規則的權重 (例如使用更特定的選擇器,或在必要時使用 !important - 但應謹慎使用)。

  5. 字型載入時機 (對於 Canvas 特別重要):

    • 網頁字型是異步載入的。如果你在字型還沒下載完成時就嘗試在 Canvas 上繪製文字,它可能會使用備用字型。

    • 解決方案:

      • CSS Font Loading API (document.fonts): 這是現代瀏覽器推薦的方法。

              async function drawTextWhenFontReady() {
          try {
            await document.fonts.load("20px 'MyCustomFontName'"); // 等待特定字型和大小載入
            // 或者檢查所有字型是否準備好
            // await document.fonts.ready;
        
            // 字型已載入,現在繪製
            const canvas = document.getElementById('myCanvas');
            const ctx = canvas.getContext('2d');
            ctx.font = "20px 'MyCustomFontName'";
            ctx.fillText("字型已載入!", 50, 50);
          } catch (err) {
            console.error('字型載入失敗:', err);
            // 可以使用備用方案繪製
          }
        }
        drawTextWhenFontReady();
            
      • 簡單延遲 (不推薦,不可靠): setTimeout 等待一段時間,但不保證字型一定載入完成。

      • 使用 Web Font Loader 庫 (例如 Google/Typekit 的 WebFontLoader): 雖然有些老舊,但仍可用於更細緻的載入控制和事件回調。

  6. 引號問題:

    • 如果字型名稱包含空格或特殊字元,務必用單引號 (') 或雙引號 (") 括起來。

    • 示例:font-family: "My Font Family Name", sans-serif;

  7. 伺服器設定 (MIME 類型):

    • 在某些情況下,如果伺服器沒有為字型檔案設定正確的 MIME 類型,瀏覽器可能無法正確處理它們。不過,對於現代瀏覽器和常見的伺服器配置,這通常不是問題。

      • .ttf: font/ttfapplication/font-sfnt

      • .otf: font/otfapplication/font-sfnt

      • .woff: font/woffapplication/font-woff

      • .woff2: font/woff2application/font-woff2

總結步驟:

  1. 確認字型名稱: 用作業系統工具或線上工具取得字型家族的確切名稱。

  2. 定義 @font-face 在 CSS 中使用 @font-face,提供正確的路徑和格式。給它一個易於記憶的 font-family 別名。

  3. 套用字型: 在 CSS 規則或 Canvas ctx.font 中使用你在 @font-face 中定義的別名。

  4. 測試與除錯: 使用瀏覽器開發者工具檢查路徑、網路請求和計算樣式。

  5. 處理載入時機: 特別是對於 Canvas,確保字型載入完成後再繪製。

遵循這些步驟,應該能解決大部分字型載入和顯示的問題。

留言

這個網誌中的熱門文章

Offscreen Canvas

外部網頁新增 Google 日曆行程(URL模板)

計算 Canvas 文字最大字體