字體是如何渲染的
具體的可以看看這篇文章:瀏覽器如何渲染文本,截取部分關(guān)鍵信息如下:
解碼
- Web 服務(wù)器返回的 HTTP 頭中的 Content-Type: text/html; charset= 信息,這一般有最高的優(yōu)先級;
- 網(wǎng)頁本身
meta header中的 Content-Type 信息的 charset 部分,對于 HTTP 頭未指定編碼或者本地文件,一般是這么判斷; - 假如前兩條都沒有找到,瀏覽器菜單里一般允許用戶強制指定編碼;
分段
編碼確定后,網(wǎng)頁就被解碼成了 Unicode 字符流。因為我們得到的文本可能是很多種語言混雜的,里面可能有中文、有英文,它們可能要用不同的字體顯示;
為了統(tǒng)一處理所有這些復(fù)雜的情況,我們要將文本分為由不同語言組成的小段,在有的文本布局引擎里,這個步驟稱為“itemize”,分解后的文本段常被稱作“text run”,但是具體劃分的規(guī)則可能根據(jù)不同的引擎有所區(qū)別。
字體匹配
分段之后,則要根據(jù)設(shè)置的不同 font-family 對每一段文字進行字體匹配。這里遵循字體的 fallback 機制。
fallback 機制:在操作系統(tǒng)介面和網(wǎng)頁等現(xiàn)代排版環(huán)境下,如果指定用字體?A?來顯示某字符?x?但該字體并不支持這個字符(甚至該字體當(dāng)前不可用),排版引擎通常不會直接放棄,它會根據(jù)一個預(yù)先記好的列表來嘗試尋找能顯示字符?x?的字體,如果找到字體?B?能行,那就用字體?B?來顯示字符?x。字體?B?就是當(dāng)前這個情況的 fallback。
以 font-family: Helvetica, Arial; 為例,Arial 字體就是一種 fallback ,當(dāng)指定的第一選擇字體 Helvetica 不可用時,則嘗試去尋找 Arial 是否可用。
系統(tǒng)所包含哪些字體跟什么有關(guān)呢?當(dāng)我們想用一種字體,但不確認這個字體是否是系統(tǒng)已有的,怎么去確認呢?
首先系統(tǒng)所包含字體不只和系統(tǒng)預(yù)裝的字體有關(guān),還和系統(tǒng)上安裝哪些軟件有關(guān),
- 微軟操作系統(tǒng)下,詳細的系統(tǒng)和一些軟件包含的字體可以查看這個索引:Microsoft typography,
- Mac 系統(tǒng)可以查看這個索引:List of typefaces included with OS X
再讓我們回到網(wǎng)頁中,CSS里如果font-family未設(shè)置中文字體時,我們知道是根據(jù)瀏覽器默認的字體來顯示,找到瀏覽器對應(yīng)的設(shè)置,你也可以手動修改這些。
渲染
當(dāng)確定了字體以后,就可以將文本、字體等等參數(shù)一起交給具體的排版引擎,生成字形和位置,然后根據(jù)不同的平臺調(diào)用不同的字體 rasterizer 將字形轉(zhuǎn)換成最后顯示在屏幕上的圖案,一般瀏覽器都會選擇平臺原生的 rasterizer,比如 Mac OS X 下用 Core Graphics,Linux/X11 下用 FreeType,Windows 下用 GDI/DirectWrite 等等。
影響字體渲染的因素
影響字體的渲染是因素有很多,總的來說:
- Web頁面的
lang,charset和瀏覽器設(shè)置都會對默認字體產(chǎn)生影響 - 不同操作系統(tǒng)、不同瀏覽器都默認中文、英文字體的設(shè)置都有區(qū)別
serif 和 sans-serif 不總是生效
serif 和 sans-serif 不總是生效,這個受到很多因素的影響。
Web頁面的 lang, charset 和瀏覽器設(shè)置都會對默認字體產(chǎn)生影響。
以 font-family: sans-serif 為例,希望瀏覽器選擇一款非襯線字體展示文字。但是我們可以通過修改瀏覽器的默認配置來使得 sans-serif 展示一款 serif 字體。
在 Chrome 的高級設(shè)置,自定義字體中,可以進行設(shè)置。
設(shè)置了這個,此時用戶代理,也就是瀏覽器會以用戶設(shè)置的字體為準(zhǔn)。
來源:
