精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

瀏覽器如何渲染文本

開發 前端
瀏覽器是我們最常用的軟件之一,文本又是網頁中最主要的元素,在瀏覽器顯示文本的過程中有許多有趣的細節,值得展開來講講,或許能減少一些誤解。這 是一個比較粗略的,概括性的介紹,盡可能不涉及過多的技術細節和具體實現,而立足于給 Web 開發者和設計師提供一些正確的概念。

瀏覽器是我們最常用的軟件之一,文本又是網頁中最主要的元素,在瀏覽器顯示文本的過程中有許多有趣的細節,值得展開來講講,或許能減少一些誤解。這 是一個比較粗略的,概括性的介紹,盡可能不涉及過多的技術細節和具體實現,而立足于給 Web 開發者和設計師提供一些正確的概念。

下面的介紹主要根據我對 WebKit 和 Gecko (Firefox) 的印象來談,其他的瀏覽器也大致相同,如有闕漏之處歡迎指出。

當瀏覽器收到來自 Web 服務器的網頁數據之后,第一步是要把它解碼成可以閱讀的文本,因為歷史原因,不同區域和語言的網頁可能會使用不同的編碼方式,而瀏覽器判斷編碼主要是依據以下方法:

  1. Web 服務器返回的 HTTP 頭中的 Content-Type: text/html; charset= 信息,這一般有最高的優先級;
  2. 網頁本身 meta header 中的 Content-Type 信息的 charset 部分,對于 HTTP 頭未指定編碼或者本地文件,一般是這么判斷;
  3. 假如前兩條都沒有找到,瀏覽器菜單里一般允許用戶強制指定編碼;
  4. 部分瀏覽器 (比如 Firefox) 可以選擇編碼自動檢測功能,使用基于統計的方法判斷未定編碼。

編碼確定后,網頁就被解碼成了 Unicode 字符流,可以進行進一步的處理,比如 HTML 解析了,不過我們這里跳過 HTML/XML 解析的細節,單講得到了解析后的文本元素之后該怎么處理。

因為我們得到的文本可能是很多種語言混雜的,里面可能有中文、有英文,它們可能要用不同的字體顯示;也可能有阿拉伯文、希伯來文這種從右到左書寫的 文字;也有可能涉及印度系文字這樣涉及復雜布局規則的文字;另外,還可能有網頁內自己指定的文本語言,比如 <span lang=”jp”>日本語</span> 這樣的標記,使得日文漢字可以使用日文字體顯示 (因為 Han Unification 導致這些漢字和中文里的漢字使用同樣的代碼點,盡管很多寫法不同),”lang” 屬性也可以在 HTTP 頭、<meta> 或者 <html> 出現,用于標記整個文檔的全局語言,通常這是一種好的習慣,方便瀏覽器進行字體匹配。

為了統一處理所有這些復雜的情況,我們要將文本分為由不同語言組成的小段,在有的文本布局引擎里,這個步驟稱為“itemize”,分解后的文本段 常被稱作“text run”,但是具體劃分的規則可能根據不同的引擎有所區別,比如 HarfBuzz 和 ICU 一般是根據要使用的不同排版類來劃分 (常稱作“shaper”),比如英語和法語可能使用同一個 shaper 排版,那么相鄰的英語和法語文本就會劃分到同一個 run 里,而希伯來文需要另一個 shaper,就劃分到它自己的 run 里,以 HarfBuzz 為例,它有這樣一些 shaper:

  • 通用的 (適用于中文、英文等等大多數布局規則簡單的語言)
  • 阿拉伯文
  • 希伯來文
  • 印度系文字
  • 高棉文
  • 緬文
  • 諺文

不少瀏覽器還會在這個劃分下面,在確定具體使用的字體之后,根據使用字體的不同劃分更細的 run,這種 run 可能稱作“SimpleTextRun”,每個都會使用和相鄰不同的字體,最后把它們逐一交給 shaper 進行排版得到要繪制的字形,這樣一來,shaper 的工作就被簡化為在確定的語言、確定的字體下排版確定的文本,生成對應的字形和它們應該放置的位置、占用的空間。下面先詳細說說確定字體的步驟。

說到字體,首先必須提到的就是 CSS 里的 font 和 font-family 等規則。比如這樣的規則:

  1. p { font-familyHelveticaArialsans-serif; } 
  2. strong { font-weightbold; } 


如果對于這樣一段文本:

  1. <p>A quick brown fox <strong>jumps</strong> over the lazy dog.</p> 

表示這個段落里優先使用 Helvetica 這個 family 的字體,如果找不到,就找 Arial,如果還是找不到,就用瀏覽器設置的默認非襯線字體 (有的瀏覽器,比如 Safari 只給你一個設置,有的像 Firefox 則允許根據不同語言設置,這時可以根據前面分析得到的文本 run 語言信息來判斷該用哪個),這個過程非常簡單,大家都很好理解。稍微復雜一點的是“jumps”,它應該繼承父元素的 font-family,也用 Helvetica,但不用默認的 Regular,而用 Bold 版本,假如找不到 Helvetica Bold,就找 Arial Bold,否則就找瀏覽器設置的那個字體的 Bold 版本,假如都沒有呢?就要考慮用人工偽造的方式來顯示粗體了,這個且按下不談,先看對于中文常見的情況:CSS 指定的字體沒有覆蓋我們需要的文本時,該怎么做。比如還是上面的 CSS 規則,但對這樣的文本:

  1. <p>一只敏捷的狐貍…</p>

這里的“一只敏捷的狐貍”該用什么字體呢?假設 CSS 里具體指定了中文字體,比如 Helvetica, STHeiti, sans-serif,那很簡單,按照英文字體一樣的規則來判斷:逐個字符嘗試當前的字體是否提供了針對該字符的字形,如果沒有則嘗試下一個,要是到了最 后都沒找到匹配的字體呢?CSS 規范里只簡單的說執行“system font fallback”,但這個過程在不同的瀏覽器下可能很不一樣,比如 WebKit 會使用 font-family 列表里的第一個字體和這段文本所屬的語言來尋找 fallback 字體,像 Times 這樣的 serif 字體對應的中文 fallback 字體,在 Mac OS X 下是華文宋體 (STSong);而 Firefox 則會根據 sans-serif 這樣的通用 font family 和對應的語言匹配到設置中針對對應語言的默認字體,比如在 Mac OS X 默認的中文非襯線字體是華文黑體 (STHeiti)。Linux 下一般通過 fontconfig 去根據語言、風格等參數來選擇 fallback,但不同瀏覽器的實現還可能有區別;Windows 下則一般會使用系統的 Font Linking 機制,根據注冊表內的 FontSubstitutes 信息來尋找。因為在這里不同的瀏覽器可能有不同的行為,所以建議在 CSS 中寫明對應平臺該用的字體。

 具體的字體選擇還有一些不太容易注意的細節,也是各個瀏覽器差異比較大的一點,可能會出現這樣一些問題:

是否支持用字體的 PostScript name 選擇:如 STHeiti 的 Light 版本又稱作 STXihei,或者是否能用 full name 選擇:有的瀏覽器不能正確地將 CSS 里對字體的 font-weight 或者 font-style 等要求映射到特定的字體上,尤其是在字體使用了非標準的 style 命名的情況下,考慮到很多廠商有自己的字體命名規則,這其實很容易出現,像 Helvetica Neue 的 UltraLight, Light, Regular, Medium, Bold 這些不同的 weight,是怎么對應到 CSS font-weight 的 100 到 900 數值上的?這就是特別容易出現 bug 的地方。

是否支持按 localized name 選擇:比如能不能用 “宋體” 來代表 “SimSun”。以 Mac OS X 下的瀏覽器為例,Firefox 支持這樣的寫法,但基于 WebKit 的瀏覽器一般不支持,這樣的問題 CSS 規范沒有限定,所以無論哪種情況都是允許的。

總的說來,如果要保證最大限度的兼容性,在 CSS 書寫的時候應該盡可能選擇明確、不容易出錯的寫法,盡量少隱式地讓瀏覽器自己確定 (be explict instead of implict),雖然隱式寫法通常比較簡潔,但除非你 100% 確定想支持的瀏覽器在你想支持的平臺下都能支持這個寫法,否則還是不應該輕易用。

CSS3 新增的 @font-face 規則則是對于現有規則的擴展,提供了 web fonts 功能,但字體匹配算法的邏輯并沒有改變,詳細的算法可以看 CSS 規范里的說明。

當確定了字體以后,就可以將文本、字體等等參數一起交給具體的排版引擎,生成字形和位置,然后根據不同的平臺調用不同的字體 rasterizer 將字形轉換成最后顯示在屏幕上的圖案,一般瀏覽器都會選擇平臺原生的 rasterizer,比如 Mac OS X 下用 Core Graphics,Linux/X11 下用 FreeType,Windows 下用 GDI/DirectWrite 等等。關于這個步驟,typekit 的這篇 blog 可以作為參考。各個瀏覽器的差異主要來自使用的排版引擎可能對不同的語言支持有差異,調用 rasterizer 使用的參數可能有差異 (比如是否啟用 subpixel rendering、使用的 hinting 級別等等),但在同一個操作系統下的效果差別不會很大。

  基于以上的介紹,可以嘗試提出一個在現有瀏覽器下,針對中文用戶的,書寫 CSS 字體選擇規則的建議,如下:
  1. 首先確定要選擇字體的元素應該使用的字體風格,比如是襯線字體、非襯線字體還是 cursive、fantasy 之類的;
  2. 確定了風格之后,先選擇西文字體,優先把平臺獨特的、在該平臺下效果更好的字體寫上,比如 Mac OS X 下有 Helvetica 也有 Arial,但 Helvetica (可能) 效果更好,Windows 下則一般只有 Arial,那么寫 Helvetica, Arial 就比 Arial, Helvetica 或者只有 Arial 更好;
  3. 然后列出中文字體,原則相同,多個平臺共有的字體應該盡量放在后邊,獨有的字體放在前面,還需要照顧到 Mac OS X/Linux 下一般用戶習慣用(細)黑體作為默認字體,Windows 下習慣以宋體作為默認字體的情況,比如 STXihei, SimSun 這樣的寫法比較常見,如果寫作 SimSun, STXihei,但 Mac OS X 上裝了 SimSun 效果就不會太好看。
  4. 最后還是應該放上對應的 generic family,比如 sans-serif 或者 serif。
  5. 盡量用字體的基本名稱 (比如 English locale 下顯示的),而不要用本地化過的名稱。除非特殊情況 (Windows 下“某些”瀏覽器在特定編碼下只能支持本地化的字體名稱)。Mac OS X 下字體名稱可以用 Font Book 查到 (菜單 Preview -> Show Font Info),Windows 下字體信息在微軟的網站可以得到,Linux/X11 下可以使用 fc-list 命令查到。
  6. 字體名稱中包含空格時記住用引號擴起,比如 “American Typewritter” 和 “Myriad Pro”。
  7. 文檔開頭最好指明語言,比如 <html lang=”zh-CN”>,可以使用的語言標記參見 W3C 的說明。

原文鏈接:http://www.wufangbo.com/browser-render-text/

責任編輯:陳四芳 來源: wufangbo.com
相關推薦

2020-11-06 15:20:45

瀏覽器前端架構

2013-11-20 13:47:43

瀏覽器渲染引擎

2013-05-23 16:01:56

瀏覽器

2013-06-14 13:56:29

瀏覽器渲染原理

2022-08-30 09:01:11

瀏覽器渲染前端

2017-03-08 08:31:48

瀏覽器渲染路徑

2018-01-19 14:39:53

瀏覽器頁面優化

2017-10-09 13:39:26

瀏覽器渲染服務器

2013-11-20 10:47:57

瀏覽器渲染html

2015-02-28 09:39:24

Windows 10Spartan

2017-03-12 10:15:18

瀏覽器DOM樹CSSOM樹

2022-02-07 21:49:06

瀏覽器渲染chromium

2013-11-18 15:09:34

瀏覽器渲染速度

2013-11-20 13:04:41

css瀏覽器渲染

2012-03-20 11:07:08

2012-03-20 11:31:58

移動瀏覽器

2012-03-19 17:25:22

2012-03-20 11:41:18

海豚瀏覽器

2012-06-01 10:28:54

Web

2012-06-06 15:57:29

Web
點贊
收藏

51CTO技術棧公眾號

欧美最大成人综合网| 不卡伊人av在线播放| 青青草视频在线免费播放| 日日夜夜精品免费| 国产精品视频| 久久激情视频免费观看| 一区二区免费在线观看视频| 欧美日韩五码| 亚洲精品视频在线观看免费| 国产主播一区二区三区四区| 久久精品国产亚洲av麻豆蜜芽| 天天综合久久| 日韩精品中文字幕久久臀| 中文字幕免费高清在线| 成人bbav| 亚洲欧洲制服丝袜| 欧美人xxxxx| av观看在线免费| 久久精品午夜| 欧美精品做受xxx性少妇| 中文字幕国产专区| 国产一区二区三区国产精品| 偷拍亚洲欧洲综合| 在线国产伦理一区| 国产在线网站| 99麻豆久久久国产精品免费 | 日韩国产激情在线| 中文字幕第三区| 国产精品伦一区二区| 午夜精品久久久| 国产911在线观看| 波多野结衣在线网站| 99久久久精品| www.久久爱.cn| 又骚又黄的视频| 母乳一区在线观看| 97视频在线观看免费| 青青草手机在线观看| 欧美日韩一区二区综合 | 日本一区二区在线观看视频| 欧美黄色成人| 欧美性一二三区| 国产偷人视频免费| 国产白浆在线免费观看| 一区二区三区四区亚洲| 亚洲一区二区三区精品视频| 国产黄在线观看| 99国产精品久| 狠狠色伊人亚洲综合网站色| 丁香六月色婷婷| 国产成人综合在线观看| 成人黄色av播放免费| 中文字幕在线播放日韩| 免费在线看成人av| 国产精品大片wwwwww| 一级一片免费看| 久久午夜精品| 国产精品aaa| 午夜精品一区二| 日韩黄色一级片| 国产精品久久久久久久久影视| av一级在线观看| 日韩精品久久理论片| 97久久久久久| 男人天堂2024| 老司机午夜精品| 91精品综合视频| www.日本在线观看| 国产成人aaa| 精品国产中文字幕| 日本福利片高清在线观看| 337p粉嫩大胆噜噜噜噜噜91av| 九色91视频| 免费在线国产| 国产色产综合色产在线视频| 欧美欧美一区二区| 91在线免费看| 亚洲欧美日韩国产另类专区| 9191国产视频| 午夜影院在线观看国产主播| 色狠狠综合天天综合综合| 欧美日韩在线观看不卡| 亚洲欧洲专区| 亚洲成人激情图| a毛片毛片av永久免费| 欧美日韩国产传媒| 久久天天躁日日躁| 日韩精品一区二区三区国语自制| 毛片一区二区| 国产精品自拍偷拍视频| 国产激情视频在线播放| 91在线播放网址| 亚洲午夜精品一区二区| 久久电影网站| 日韩欧美在线免费| 三级性生活视频| 欧美美女啪啪| 久久精品免费播放| 国产又色又爽又黄的| 美洲天堂一区二卡三卡四卡视频| 91亚洲精品丁香在线观看| 完全免费av在线播放| 欧美亚洲在线播放| 国产又粗又大又黄| 成人午夜视频在线观看| 亚洲欧洲国产日韩精品| av中文字幕在线看| 欧美日韩黄色影视| 国产精品伦子伦| 天天揉久久久久亚洲精品| 2021国产精品视频| 国产熟女一区二区丰满| 久久久久久亚洲综合影院红桃| 免费国产成人看片在线| 日韩国产激情| 亚洲第一二三四五区| 特级西西人体高清大胆| 欧美亚洲免费| 国产精品国产一区二区| 黄色免费网站在线| 色综合久久88色综合天天6| 欧美色图校园春色| 成人羞羞在线观看网站| 日本亚洲精品在线观看| 亚洲精品国产片| 亚洲私人影院在线观看| 久久精品视频91| 日韩av网址大全| 欧美精品18videos性欧| 国产视频第一页| 国产精品理论片| 97公开免费视频| 欧美一区二区三区红桃小说| 久热在线中文字幕色999舞| 欧美成人精品网站| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产乱子伦精品无码码专区| 欧美激情资源网| 午夜肉伦伦影院| 欧美巨大xxxx| 97视频免费看| 色网站免费观看| 亚洲高清免费在线| 黑森林av导航| 在线欧美亚洲| 国产精品乱码一区二区三区| 18av在线视频| 精品国产区一区| 精品无码久久久久久久久| 国产毛片精品视频| 日本丰满大乳奶| 日韩精品成人| 欧美国产极速在线| 老司机午夜福利视频| 一二三四区精品视频| xxxx国产视频| 亚洲国产精品一区| 狠狠色噜噜狠狠狠狠色吗综合| segui88久久综合| 精品国产乱码久久久久久免费| 久草国产在线观看| 成人精品一区二区三区四区 | 在线观看wwwxxxx| 日韩欧美亚洲国产精品字幕久久久| 精品自拍偷拍视频| 成人午夜在线播放| 欧洲黄色一级视频| 国产欧美日韩影院| 成人av番号网| 狂野欧美性猛交xxxxx视频| 亚洲第一在线视频| av网站中文字幕| 国产精品少妇自拍| 手机看片国产精品| 国产农村妇女精品一二区| 日本成人看片网址| 日韩在线激情| 久热国产精品视频| 丝袜+亚洲+另类+欧美+变态| 91久久奴性调教| 懂色av粉嫩av蜜臀av一区二区三区| 国内精品免费**视频| 国产不卡一区二区视频| 狠狠色丁香婷婷综合影院| 国产在线拍揄自揄视频不卡99| 91精品久久久久久粉嫩| 日韩精品中文字| 一二三区中文字幕| 婷婷丁香久久五月婷婷| 欧美偷拍一区二区三区| 国产精品18久久久久久vr| 免费看日本毛片| 99精品小视频| 九九九九久久久久| 精品国产18久久久久久二百| 97超级碰碰碰久久久| 欧美激情黑人| 日韩欧美久久久| 波多野结衣 久久| 亚洲黄色录像片| 欧美人妻一区二区三区| 国产福利一区在线| 亚洲男人天堂色| 亚洲美女啪啪| 欧美aaa在线观看| 中文精品一区二区| 高清国语自产拍免费一区二区三区| 女生影院久久| 欧美精品久久久久久久| 99re在线视频| 精品调教chinesegay| av官网在线观看| 欧美日韩亚洲综合| 黄色在线观看国产| 一区二区三区中文在线| 欧美成人另类视频| 91婷婷韩国欧美一区二区| 天天干天天曰天天操| 日韩高清一区在线| 欧美网站免费观看| 好看的av在线不卡观看| 亚洲欧美国产一区二区| 亚洲涩涩av| 国产精品区免费视频| 成人综合日日夜夜| 国产欧美精品一区二区| 欧美1级2级| 91精品国产高清自在线看超| 青草视频在线免费直播| 久久久国产精品免费| avtt在线播放| 国产亚洲精品久久久| 日韩a在线看| 日韩二区三区在线| 婷婷色在线观看| 亚洲精品一区二区三区精华液| 精品人妻一区二区三区换脸明星| 精品视频在线看| 日韩精品一区二区亚洲av观看| 疯狂做受xxxx高潮欧美日本| 日本少妇激情舌吻| 亚洲第一在线综合网站| 久久综合色综合| 亚洲不卡av一区二区三区| 国产一二三四在线| 亚洲一区二区三区自拍| 久久久久久久九九九九| 亚洲一级不卡视频| 国产无码精品一区二区| 香蕉久久一区二区不卡无毒影院| 国产极品美女高潮无套嗷嗷叫酒店| 亚洲精品视频在线看| 免费在线观看黄视频| 亚洲小说欧美激情另类| 日韩免费观看一区二区| 亚洲不卡av一区二区三区| 久久99精品波多结衣一区| 欧美日韩亚洲系列| 无码无套少妇毛多18pxxxx| 在线欧美日韩国产| 一级爱爱免费视频| 91精品国产黑色紧身裤美女| 精品人妻无码一区二区三区蜜桃一 | 久久精品精品电影网| 91cn在线观看| 久久久久久美女| 吉吉日韩欧美| 国产精品欧美久久久| 4438五月综合| 国产成人精品一区二区三区福利| 欧美一区 二区| 亚洲精品视频一二三| 一区二区影视| 九一国产精品视频| 日韩av在线发布| 天堂中文av在线| 成人的网站免费观看| 国产男男chinese网站| 中文字幕在线播放不卡一区| 免费在线看黄网址| 欧美日韩国产精品一区| 中文字幕一区二区三区人妻四季| 制服.丝袜.亚洲.中文.综合| 国模人体一区二区| 亚洲欧美日韩在线高清直播| 午夜在线观看视频| 久久久亚洲国产| 欧美最新精品| av在线不卡一区| 经典一区二区| 国产毛片久久久久久国产毛片| 亚洲一区网站| 亚洲精品在线网址| www国产成人免费观看视频 深夜成人网| 久久丫精品忘忧草西安产品| 亚洲精品国产无天堂网2021 | 91精品中文字幕一区二区三区| 懂色av蜜臀av粉嫩av分享吧| 一区二区亚洲欧洲国产日韩| 日韩欧美一起| 国产精品视频久久| 伦理一区二区三区| 国产对白在线播放| 久久福利影视| 久久久精品人妻一区二区三区| 久久久www成人免费无遮挡大片 | 岛国av在线不卡| 97成人免费视频| 亚洲欧美在线免费| 久久大胆人体| 亚洲一区二区久久久久久久| 女厕嘘嘘一区二区在线播放| 国产精品一色哟哟| 久久99在线观看| 欧美18—19性高清hd4k| 亚洲va国产天堂va久久en| 一区二区三区www污污污网站| 亚洲精品国产福利| 色婷婷av在线| 成人免费高清完整版在线观看| 国产一区二区电影在线观看| 青青草精品视频在线| 国产精品99久久久| 一本一本久久a久久| 色老综合老女人久久久| 天堂网在线资源| 久久久久成人网| 日本伊人久久| 青青草免费在线视频观看| 人禽交欧美网站| 超碰人人干人人| 在线免费一区三区| 国产高清av在线| 国产国语刺激对白av不卡| 欧美激情极品| 日韩精品xxxx| 97se亚洲国产综合自在线不卡| 18精品爽视频在线观看| 日韩欧美中文一区二区| caopeng在线| av成人在线电影| 毛片a片免费观看| 欧美日韩在线免费| 四虎精品成人免费网站| 91精品成人久久| 日本亚洲不卡| 97视频在线免费播放| 久久网这里都是精品| 无码人妻av一区二区三区波多野| 亚洲乱码一区二区| 欧美18av| 伊人久久婷婷色综合98网| 精品一区二区三区蜜桃| 一区二区国产精品精华液| 3atv一区二区三区| 金瓶狂野欧美性猛交xxxx | aa在线免费观看| 26uuu国产电影一区二区| aaaaaa毛片| 中文字幕亚洲一区在线观看| 少妇高潮一区二区三区99| 中文字幕综合在线观看| 国产精品911| 精品91久久久| 亚洲色无码播放| 日本在线视频一区二区| 黄色一级片网址| 国产a区久久久| 久久国产黄色片| 这里只有视频精品| 精品国产欧美| 成人毛片一区二区| 欧美经典一区二区三区| 国产精品久久久久久久久久久久久久久久久久 | 久久精品日韩精品| 日本午夜精品一区二区三区电影| 国产91在线播放九色| 日韩丝袜情趣美女图片| 草草在线视频| 亚洲国产欧洲综合997久久 | 中文字幕一二三四区| 欧美午夜精品一区| 性xxxfreexxxx性欧美| 久久久久资源| 精品亚洲欧美一区| 国产污视频在线观看| 亚洲丝袜在线视频| 亚洲1区在线| www.色就是色| 亚洲成年人影院| 在线视频婷婷| 精品国产综合区久久久久久| 免费av成人在线| 日韩欧美一区二区一幕| 最近2019中文字幕第三页视频| 日韩中文字幕| 午夜欧美福利视频| 香蕉影视欧美成人| av在线播放观看| 欧美专区一二三|