--- title: Web Font Loader 不負責任 中文翻譯版 description: (本來是開放任編輯,但是被加了奇怪的東西) robots: index,follow,noarchive langs: zh-TW dir: ltr --- ###### tags: `doc` `translate` 不負責任翻譯自: [typekit/webfontloader](https://github.com/typekit/webfontloader/blob/master/README.md) --- # Web Font Loader 網頁字體裝載機 Web Font Loader 讓你在透過 `@font-face` 使用鏈接字體過程,增加了可控制的能力。 它提供了共同的 "介面(機制)" 來下載字型,可以不用管來源是何處。 它提供了標準組合的事件 events,你可以用它來控制下載過程的體驗。 Web Font Loader 可以下載字型來自: [Google Fonts](http://www.google.com/fonts/), [Typekit](http://www.typekit.com/), [Fonts.com](http://www.fonts.com/), 和 [Fontdeck](http://fontdeck.com/), 以及自己伺服器的網路字型. *// 編按:Web Font Loader 是一段 Javascript 程式碼,下面是介紹和說明幾種使用的方式* 它是 [Google](http://www.google.com/) 和 [Typekit](http://www.typekit.com) 共同研發的. [![Build Status](https://travis-ci.org/typekit/webfontloader.svg?branch=master)](https://travis-ci.org/typekit/webfontloader) ## Contents * [Get started 開始](#get-started) * [Configuration 配置](#configuration) * [Events 事件](#events) * [Timeout 暫停](#timeouts) * [Iframes](#iframes) * [Modules 模組](#modules) (不同字體來源供應商的使用方式) * [Adobe Edge Web Fonts](#adobe-edge-web-fonts) * [Custom 客製](#custom) * [Fontdeck](#fontdeck) * [Fonts.com](#fontscom) * [Google](#google) * [Typekit](#typekit) * [Browser support 瀏覽器支援](#browser-support) * [License 版權](#copyright-and-license) ## Get Started 使用 Web Font Loader library, 只要引入 (include) 它到你的頁面,並且告訴他要下載哪些字型。 舉例,你可以 **使用 Web Font Loader 從 "[Google Fonts](http://www.google.com/fonts/)" 下載字型**,Web Font Loader 託管在 [Google Hosted Libraries](https://developers.google.com/speed/libraries/). *// 編按:中文還需要手動引入 `@fonts-face` ,可能是還是 earlyaccess 的關係* 用以下編碼: ```htmlmixed=ml <!-- 引入 Web Font Loader library --> <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js"></script> <!-- 設定 --> <script> WebFont.load({ google: { families: ['Droid Sans', 'Droid Serif'] } }); </script> ``` 另外, 你可以連結到最新 Web Font Loader `1.x` 版本,使用 `https://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js` 作為 `script` 來源。 注意,那版本號不是具體的編號,他將下載最新 `1.x` 的版本,但它緩存留的時間也較短,以確保得到最新更新。 出於性能的考慮,我們建議在生產中使用網頁字體加載器使用時,在 URL 中明確版本號 (如 `1.6.16`)。 當你想採取一個新的版本,你可以在 URL 中,手動更新 Web Font Loader 版本號。 Web Font Loader 也可使用 CDN, 在 [jsDelivr](http://www.jsdelivr.com/projects/webfontloader) & [CDNJS](https://cdnjs.com/libraries/webfont). Web Font Loader 可以使用異步加載。 例如,異步加載 [Typekit](http://www.typekit.com) 字體,可以使用下面的代碼: ```htmlmixed= <script> // 設定 WebFontConfig = { typekit: { id: 'xxxxxx' } }; //異步加載的語法 (function(d) { var wf = d.createElement('script'), s = d.scripts[0]; wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js'; s.parentNode.insertBefore(wf, s); })(document); </script> ``` 異步加載可避免加載 JavaScript 時塞車。 要注意,若使用異步加載的程式碼,頁面上其他部分,也許會在 Web Font Loader 下載前先渲染並執行。 這將導致一個"無樣式文字的快速閃過" [Flash of Unstyled Text (FOUT)](http://help.typekit.com/customer/portal/articles/6852). FOUT 可以很輕易地避免,當異步加載 Web Font Loader, 只要 `Webfont.load` 被調用,Web Font Loader 將自動設定 `wf-loading` class 在 HTML element `<html>`. 瀏覽器將等待程式碼去下載,在繼續下載剩下的內容之前,可避免 FOUT。 Web Font Loader 也作為一個 CommonJS module,在 npm 供下載。 只要 `npm install webfontloader` 並且在你的程式碼中 require. ```jsx= var WebFont = require('webfontloader'); WebFont.load({ google: { families: ['Droid Sans', 'Droid Serif'] } }); ``` ## Configuration 配置 Web Font Loader 的配置,是定義在一個全域的變數叫做 `WebFontConfig`, 或直接傳遞給 `WebFont.load` 方法。 它定義哪些字體從哪些供應源下載,使您可以為某些事件做指定的 callbacks 的選項。 當使用異步的方式,你必須在程式碼下載 Web Font Loader 之前,定義全域的變數 `WebFontConfig` (如上面範例). ### Events Web Font Loader 提供一個事件系統,方便開發人員銜接。 它提供字體下載的過程順序通知,CSS 和 JS 都有。 * `loading` - 當所有字體都被請求,event 被觸發。 * `active` - 有字體被渲染時,event 被觸發。 * `inactive` - 瀏覽器不支援連結的字體 *或* 沒有字體可被下載,event 被觸發。 * `fontloading` - 有字體被下載成功,event 被觸發一次。 * `fontactive` - 有字體被渲染,event 被觸發一次。 * `fontinactive` - 有字體不能下載時,event 被觸發。 CSS event 以 classes 作用在 `html` 元素上的方式被實現。以下 classes 將被設定在 `html`: ```css .wf-loading .wf-active .wf-inactive .wf-<familyname>-<fvd>-loading .wf-<familyname>-<fvd>-active .wf-<familyname>-<fvd>-inactive ``` `<familyname>` 為:每一個 font family 的名稱的 "清潔版本 (sanitized version)":字體名稱中的 "空格" 和 "下底線" 將被移除、所有字符小寫。例如, `Droid Sans` 變成 `droidsans`. `<fvd>` 為:[字體變異描述 Font Variation Description](https://github.com/typekit/fvd). 簡單地說,它是描述"特定字體的樣式和重量"的簡寫。下面是幾個例子: ```css /* n4 */ @font-face { font-style: normal; font-weight: normal; } /* i7 */ @font-face { font-style: italic; font-weight: bold; } ``` 記住 `font-weight: normal` 對應為 `font-weight: 400`, 並且 `font-weight: bold` 對應為 `font-weight: 700`. 無指定,皆為 `n4` (`font-style: normal; font-weight: normal;`)。 若在一個單一頁面中,字體下載很多次,CSS 不斷更新以反映網頁的當前狀態, 只要字體被請求,全域的 `wf-loading` class 就被應用(即使其他字體已經有效或無效); 只有在頁面上沒有字體被渲染時 `wf-inactive` class 會被應用; 除此之外 `wf-active` class 會被應用(即使一些字體是無效的)。 JavaScript events 做為 `WebFontConfig` 配置物件的回調函數 (callback functions). ```javascript WebFontConfig = { loading: function() {}, active: function() {}, inactive: function() {}, fontloading: function(familyName, fvd) {}, fontactive: function(familyName, fvd) {}, fontinactive: function(familyName, fvd) {} }; ``` `fontloading`, `fontactive` 和 `fontinactive` 回調函數會傳遞關注事件的字體的 "family name" 和 "變化描述"。 要禁用 HTML 元素上的設置 classes,可將設定配置參數`classes` 為 `false` (預設為 `true`)。 ```javascript WebFontConfig = { classes: false }; ``` 你也可以取消 font events (callbacks) 透過設定 `events` 參數為 `false` (預設為 `true`). ```javascript WebFontConfig = { events: false }; ``` 若 events 和 classes 都不使用,Web Font Loader 則不監控字體,僅作為插入 `@font-face` 的方式。 ### Timeouts 因為網路不是 100% 可靠, 有可能字體無法加載。 若字體無法呈現 `fontinactive` event 將在五秒後將被觸發。 若 *至少* 一個字體成功呈現,`active` event 將被觸發, 否則 `inactive` event 將被觸發。 你可以改變預設的觸發時間,從 `WebFontConfig` object 的 `timeout` 選項. ```javascript WebFontConfig = { google: { families: ['Droid Sans'] }, timeout: 2000 // 設定 timeout 為 2 秒 }; ``` timeout value 應為毫秒,若未設定,預設為 3000 milliseconds( 3 秒)。 ### Iframes 通常,這是最簡單的方法:在每個 需要字體的 window(頁面)引入一個 Web Font Loader 副本,使每個 window 管理自己的字體。 然而,如果您需要單個窗口管理多個同源子窗口、或使用 JavaScript 構建的 iframe 的字體,Web Font Loader 一樣可以支援。 使用選用的 `context` 選項,並給一個到目標窗口的 reference(路徑)來供 loading。 ```javascript WebFontConfig = { google: { families: ['Droid Sans'] }, context: frames['my-child'] }; ``` 這是一個進階的配置選項,多數情況不需要。 ## Modules 模組 Web Font Loader 提供一個模組系統,任何 web font 的供應商都可以提供代碼來允許他們的字體被下載。 可以在同一時間,使用多個 web fonts 供應方。 目前 library 支援的每個供應商的具體細節都記錄在這。 ### Adobe Edge Web Fonts 當使用 [Adobe Edge Web Fonts](https://edgewebfonts.adobe.com/), 你可以用 `typekit` module。 參數 `id` 傳遞字體的列表鏈, 設定參數 `api` 為 Edge Web Fonts URL (字體位置)。 ```javascript WebFontConfig = { typekit: { id: 'adamina;advent-pro', api: '//use.edgefonts.net' } }; ``` ### Custom 客製 從任何外部樣式表下載字體,請使用 `custom` 模組。 這裡你需要指定你要下載的 font family name, 且可選的 url 選項,即提供字體 `@font-face` 聲明的樣式表的 url。 你可以指定特定的字體 "變體"(特定字體的樣式和重量),或一組變體來下載並監控, 透過加 `,` 來分隔 "變體",附加 `:` 分隔 "family name"。 變體使用 [FVD notation (標記法)](https://github.com/typekit/fvd). ```javascript WebFontConfig = { custom: { families: ['My Font', 'My Other Font:n4,i4,n7'], urls: ['/fonts.css'] } }; ``` 在這個 Custom 例子中,`fonts.css` 檔案看起來像這樣: ```css @font-face { font-family: 'My Font'; src: ...; } @font-face { font-family: 'My Other Font'; font-style: normal; font-weight: normal; /* or 400 */ src: ...; } @font-face { font-family: 'My Other Font'; font-style: italic; font-weight: normal; /* or 400 */ src: ...; } @font-face { font-family: 'My Other Font'; font-style: normal; font-weight: bold; /* or 700 */ src: ...; } ``` 若你的字體已經包含在其他樣式表中,你可以不管 `urls` array,只指定字體名稱 (font family names) 來加載字體。 直到名稱對應了那些 `families` array 中聲明的字體,正確的 loading classes 將被應用在 html 元素。 ```html <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.5.10/webfont.js"></script> <script> WebFont.load({ custom: { families: ['My Font'] } }); </script> <style type="text/css"> @font-face { font-family:"My Font"; src:url("assets/fonts/my_font.woff") format("woff"); } </style> ``` Custom 模組也支援定義一個用來確定 "是否一個字體已被下載" 的 "測試字符串"。 這可以用來加載一個,在私有使用的 Unicode 區段中,有自定義的子集或字形的字體。 ```javascript WebFontConfig = { custom: { families: ['My Font'], testStrings: { 'My Font': '\uE003\uE005' } } }; ``` 測試字符串應以每個字體為基礎指定,並至少包含一個字符。 若沒有指定,預設測試字串為 (`BESbswy`). *[^ *^BESbswy?](https://tomjn.com/2012/09/13/typekit-besbswy/)* ### Fontdeck 使用 [Fontdeck](http://fontdeck.com/) module, 具體指定你網站的 ID,你可以在你的帳戶設定 (account settings) 頁面中找到你的 ID。 ```javascript WebFontConfig = { fontdeck: { id: 'xxxxx' } }; ``` ### Fonts.com 當使用 [Fonts.com web fonts](http://www.fonts.com/web-fonts/),指定你的 Project ID. ```javascript WebFontConfig = { monotype: { projectId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', version: 12345, //(可選,刷新 CDN 緩存) loadAllFonts: true // (可選,加載 Project 所有的字體) } }; ``` Fonts.com module 有一個可選的 `version` 選項。 他行為像一個緩存破壞程序 *([^ *^cache-buster](http://www.adopsinsider.com/ad-ops-basics/what-is-a-cache-buster-and-how-does-it-work/))*, 選用的 `loadAllFonts` 會加載 Project 所有的字體. 預設 Fonts.com module 只會加載頁面有使用的字體。 ### Google 使用 [Google's Font API](https://code.google.com/apis/webfonts/docs/getting_started.html), 填寫你要下載的 font families。 你可以使用一樣的 [syntax (語法)](https://developers.google.com/fonts/docs/getting_started#Syntax),如 Font API 中相同的語法來指定樣式。 請注意 Google module 不支援 FVD syntax,那是 Custom module 中使用的。 ```javascript WebFontConfig = { google: { families: ['Droid Sans', 'Droid Serif:bold'] // 不是 FVD } }; ``` 有時候你要求的字體,不是以預設的字重過來 (e.g. 400), 你需要明確地要求你的字體變量,使 font events 運作 (e.g. `300`, `700`, etc.): ```javascript WebFontConfig = { google: { families: ['Open Sans Condensed:300,700'] } }; ``` 若你需要在默認值之外指定字符子集 (e.g.: 希臘文以外的拉丁編碼), 您必須在冒號後,追加子字符串到請求的字符串。 子集字串應該遵循 [Google documentation](https://developers.google.com/fonts/docs/getting_started#Subsets) (子集名稱用冒號 `:` 分開): ```javascript WebFontConfig = { google: { families: ['Open Sans Condensed:300,700:latin,greek'] } }; ``` 你也可提供 `text` 參數來執行字符子集: ```javascript WebFontConfig = { google: { families: ['Droid Sans', 'Droid Serif'], text: 'abcdefghijklmnopqrstuvwxyz!' } }; ``` `text` 子集功能只有 Google module 有提供。 ### Typekit 當使用 [Typekit](http://www.typekit.com), 指定套件 (kit) 由它的 ID 來檢索。你可以找到 Kit ID 在 Typekit's Kit Editor 介面中. ```javascript WebFontConfig = { typekit: { id: 'xxxxxx' } }; ``` **FYI:** Typekit's 自己的 JS 是使用 Web Font Loader library 建造, 已經提供了所有相同的字體事件的功能。 若你使用 Typekit, 你應該直接使用他們的 embed codes, 除非在同個頁面,你也需要下載其他供應源的網路字體。 ## Browser Support 瀏覽器支援 每個網頁瀏覽器對對於透過 `@font-face` 連結的字體有不同程度的支援。 Web Font Loader 確定支援網路字體是使用瀏覽器的使用者代理串。 使用者代理串可能聲稱有支援一個網路字體格式,但實際沒有。 這尤其值得注意在手機瀏覽器使用桌機模式的時候,通常認定在 Linux 的 Chrome. 在這種情況,一個網路字體供應商可能決定傳送 WOFF 字體給這個裝置,因為實際桌機版的 Chrome 支援它,當手機瀏覽器不支援的時候。 Web Font Loader 不是設計來處理這些狀況,而且他預設是相信使用者代理串所聲明的。 網路字體供應商可以在 Web Font Loader 的基礎上,建立功能去逐個處理這些特殊情況。 若 Web Font Loader 確認當前的瀏覽器不支援 `@font-face`, `inactive` event 將被觸發。 當下載字體來自多個供應商,不一定每個供應商有支援該瀏覽器。 若 Web Font Loader 確認當前瀏覽器可以支援 `@font-face`, 且最少一個供應商是能提供字體,來自該供應商的字體將被下載。 當結束,`active` event 將被觸發。 對於下載來自"可支持的供應商"的字體,`fontactive` event 將被觸發. 對於下載來自"供應商他 *沒有* 支援當前瀏覽器" 的字體,`fontinactive` event 將被觸發。 舉例: ```javascript WebFontConfig = { providerA: 'Family1', providerB: 'Family2' }; ``` 若 `providerA` 可以提供這個字體到一個瀏覽器,但 `providerB` 不行, `fontinactive` event 將針對 `Family2` 被觸發。 `fontactive` event 將針對 `Family1` 從他下載開始被觸發,如同 `active` event. ## Copyright and License 版權與許可 Web Font Loader 版權所有 (c) 2010 Adobe Systems Incorporated, Google Incorporated.。 Apache 許可證下許可,2.0版(以下簡稱“許可證”;除非遵守許可,你可能不能使用這個文件。您可以獲得許可證的副本在 ``` http://www.apache.org/licenses/LICENSE-2.0 ``` 除非適用法律要求或書面同意,根據許可證分發的軟件是基於 "AS IS" BASIS, 沒有任何形式的擔保或條件,無論是明示或暗示。請參閱特定語言的管理權限許可,並根據許可證的限制。