2016-04-25 74 views
0

我不確定這是不同的每個瀏覽器,我主要是爲webkit開發。可靠地將字體加載到DOM畫布元素

使用@ font-face ...加載在canvas元素中使用的字體非常簡單,只是看起來實際的字體文件在第一次使用之前並未加載。

如果我根本不在HTML中使用字體,這會在畫布元素中創建一個問題,第一次調用自定義字體時,它將以默認字體生成文本....但是隨後的嘗試使用字體很好,並使用引用的自定義字體,就好像它是由於原始調用而加載的。

問題1,這是所有瀏覽器的標準嗎?是在CSS中聲明時下載的字體?或在第一次使用?

是否有將字體加載到DOM的「最佳做法」?這是一個圖形項目,我寧願不在CSS中聲明所有可能的字體。我也只想加載將要使用的字體。有沒有更好的方式來加載JavaScript的字體?

回答

1

問題1,這是所有瀏覽器的標準嗎?如果它是在CSS中聲明的,則下載的字體是 ?或在第一次使用?

字體加載是異步的,這意味着字體在您使用畫布時可能仍會在後臺加載。對於畫布,這個問題馬上就會顯現出來,因爲你第一次畫的是最終的。

對於DOM而言,儘管會導致臭名昭着的FOUT和FOIT,或者Flash的Unstyled Text和Flash Of Invisible Text,但可以稍後更新內容。但是對於canvas,當準備使用字體時,需要手動重新繪製內容(或擱置在客戶端造成不方便的延遲)。

這就是說 - 特定的瀏覽器可能實現不同的加載策略 - 並且,我們並不總是必須知道哪個時間和哪個時間,並且他們在任何情況下都必須考慮畫布,因此供應商必須遵循類似的策略。

這通常是一個"old" problem並不容易取決於你想支持多大的瀏覽器。情況並不理想。

有一些庫可以幫助您解決加載/準備問題(記住這些庫會自己添加到延遲中),例如Google提到的Font Loader 庫。您可以通過使用CDN字體來提高速度,並且還可以在localStorage中存儲字體。

這些庫的目標更多那些誰需要路徑和度量信息,我就包括他們在情況下,他們可以證明是有用的動態加載字體:Font.jsOpenType.js

而且看看這些文章的提示&技巧,以提高字體加載和解決方法:

關於字體可用於畫布 - 我確實在提供了一個替代選項this answer不久之後,儘管這更像是一種暴力方法,但是它專門用於畫布。

1

是的,如果字體有'onload'回調會很好。但在此之前...

...一個常見的選擇是使用setTimeout延遲應用程序的開始,以便爲加載字體時間。當然,如果延遲太小,將無法加載字體時間,並且延遲太大會導致不必要的延遲。

...一個更好的選擇是Google's webfont loader

...一個做它自己的選擇是,直到不透明的像素數已經改變了一個字體字符不斷地畫上了內存canvas元素。當計數改變時,字體已經在內存畫布上繪製出來供您使用。此技術的示例代碼可以在此Stackoverflow Q&A上找到。