「font-family: tahoma, arial, 宋體, sans-serif」是什麼意思?

是否是默認 Tahoma,如果我電腦沒有的就是 Arial、宋體、sans-serif 依次排序?


題主的理解基本沒錯。只補充幾點。

一,最後的sans-serif並非一個具體字體,而是css的通用字體族(http://www.w3.org/TR/CSS21/fonts.html#generic-font-families),具體是什麼字體是由瀏覽器設置決定的。

二,字體匹配演算法是針對每個字元的。比如對於一個漢字來說,即使你的電腦上有Tahoma和Arial字體,但是由於這兩個字體里沒有提供漢字字元的字形,因此還是會fallback到「宋體」。具體演算法見:http://www.w3.org/TR/CSS21/fonts.html#algorithm 。

三,受到瀏覽器實現、底層圖形庫、操作系統等因素的影響,可能一款具體瀏覽器在字體fallback實現上並不完全遵循CSS規範。


Hax 的答案有理論了,我補充一下實例。

假設有這樣一段文本:

CSS字體

目前「font-family: tahoma, arial, 宋體, sans-serif;」的匹配過程大致如下(不考慮 font-style 和 font-weight 時):

取第一個字元「C」,查找名為 tahoma 的字體族(具體匹配字體族的過程 CSS 2.1 未明確定義,這裡你大致知道是按字體文件中存儲的某個名字匹配即可)。找到了對應的字體數據,並在 tahoma 中找到了字元「C」對應的字形(glyph),於是 OK。對接下去的兩個字母做與上面兩步類似處理。

取到字元「字」,同樣找到了 tahoma,但在其中沒有找到對應的字形。於是繼續找到 arial,同樣沒有。當在宋體中找到對應字形,OK。「體」處理過程相同。

當文本中包含了「宋體」中沒有對應字形的字元時,會匹配到 sans-serif 這種 generic family,根據瀏覽器的默認配置,最終會 fallback 到某個指定的字體,比如 Windows 下的 Firefox 中文語言下默認設置的也還是宋體。前面說了宋體不包含我們需要的那個字形了,瀏覽器沒轍了,那就需要選擇某個字體中的「missing character」對應的字形,例如「?」。


推薦閱讀:

後端程序員該如何學習前端?
2016 年中國前端界發生的大事件都有哪些?
後端所謂複雜的問題是什麼?
面試前端工作7年以上的人,總感覺他們水平一般般?
入門程序員如何選擇方向前端?後端?還是JAVA(安卓)?

TAG:前端開發 | 字體 | CSS |