精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产999精品视频| 亚洲综合久久av| 国产成人精品av在线| 成人免费av片| 亚洲mmav| 国产精品美女久久久久久久 | 亚洲制服国产| 国产九九视频一区二区三区| 欧美黄色性视频| 国产美女免费无遮挡| 黄色精品视频网站| 亚洲综合视频网| 国产不卡一区二区在线观看| 在线免费观看亚洲视频| 欧美a大片欧美片| 日韩欧美在线视频| 精品日产一区2区三区黄免费| 丁香六月婷婷综合| 欧美电影一区| 亚洲激情在线视频| 亚洲欧美日韩综合网| av在线不卡免费| 欧美国产欧美综合| 国产精品久久久久久久久久直播 | 国产免费av在线| 麻豆精品一区二区综合av| 久久99亚洲精品| www.黄色在线| 97se亚洲国产一区二区三区| 日本韩国欧美在线| 蜜臀av性久久久久蜜臀av| 欧美女同网站| 成人性视频网站| 成人xvideos免费视频| 国产性xxxx高清| 9999国产精品| 亚洲欧洲在线免费| 国产91在线免费观看| 国产极品人妖在线观看| 国产精品无圣光一区二区| 成人黄色片视频网站| 最新中文字幕免费| 国产精品日本| 久久久999精品视频| 国产美女免费无遮挡| h视频久久久| 欧美精品1区2区| 91视频免费版污| 黄色aa久久| 亚洲影视在线观看| 天天在线免费视频| 久操视频在线| 国产精品久久久久久久久快鸭| 久久精品日产第一区二区三区精品版 | 激情综合五月| 欧美日韩一区二区三区免费看 | 国产免费嫩草影院| 精品大片一区二区| 精品视频久久久久久| 激情av中文字幕| 日本超碰一区二区| 91精品国产综合久久香蕉麻豆| 不卡av免费在线| 3d性欧美动漫精品xxxx软件| 动漫精品一区二区| 日日橹狠狠爱欧美超碰| 91九色国产在线播放| 一区二区三区蜜桃网| 日本福利视频网站| 欧美亚洲系列| 亚洲综合无码一区二区| 欧美人与动牲交xxxxbbbb| 91小视频xxxx网站在线| 亚洲私人影院在线观看| 一本色道久久综合亚洲二区三区 | 天堂av免费在线观看| 丝袜美腿亚洲综合| 国产福利视频一区| 在线播放亚洲精品| 国产乱码精品一区二区三区av| 成人激情黄色网| 国产乱码精品一区二区| 韩国精品一区二区| 99视频在线播放| 亚洲免费成人在线| 99久久综合精品| 日本不卡二区高清三区| 91网页在线观看| 自拍偷拍国产亚洲| www.国产在线视频| xxxxxx欧美| 欧美日精品一区视频| 999久久久精品视频| gogo久久日韩裸体艺术| 亚洲男人天堂2019| 91激情视频在线观看| 四季av一区二区凹凸精品| 久久婷婷国产麻豆91天堂| 成年人一级黄色片| 99精品国产一区二区青青牛奶| 欧洲成人性视频| 中文字字幕在线观看| 国产福利一区在线| 欧美第一黄网| 国内精品久久久久久野外| 一区二区三区欧美在线观看| 91视频最新入口| 色婷婷成人网| 亚洲国产一区二区三区在线观看| 污污免费在线观看| 第一sis亚洲原创| 欧美激情乱人伦| 波多野结衣黄色| 国产成人精品免费| 日韩aⅴ视频一区二区三区| 国产成人无吗| 日本韩国欧美三级| 国产精品99久久久精品无码| 国产一区二区三区探花| 欧美床上激情在线观看| 无码人妻丰满熟妇区bbbbxxxx | 国产啪精品视频| 亚洲男人天堂久久| 日本一区二区三区在线不卡| 免费人成自慰网站| 国产精品久久乐| 亚洲精品国产精品国产自| 成人自拍小视频| 欧美专区在线| 国产精品传媒毛片三区| 免费黄色电影在线观看| 亚洲国产欧美日韩另类综合| 中国黄色片免费看| 中文字幕av一区二区三区人| 色与欲影视天天看综合网| 中文字幕精品一区二| 99麻豆久久久国产精品免费| avove在线观看| 欧美亚洲二区| 伊人伊成久久人综合网站| 日韩精品人妻中文字幕| 国产一区二区久久| 艳色歌舞团一区二区三区| 老司机成人影院| 亚洲国产欧美一区二区丝袜黑人 | 9l视频自拍九色9l视频成人| 亚洲人成电影网站色…| 久久久久无码国产精品不卡| 精品一区二区三区视频在线观看| 欧美一区二区综合| 91久久国产综合久久91猫猫| 欧美精品一区二区三区久久久| 久久久久久视频| 麻豆精品一区二区| 性欧美大战久久久久久久免费观看| 在线观看网站免费入口在线观看国内| 日韩精品一区二区三区四区视频 | 日韩视频欧美视频| 国产精品人人人人| 成人综合婷婷国产精品久久免费| 亚洲精品成人自拍| 精品123区| 国产一区二区三区在线观看视频| 欧美精品xxxxx| 国产成人av电影在线观看| 午夜久久久久久久久久久| 亚洲毛片在线免费| 久久精品在线视频| 国产又大又黄的视频| 国产精品久久三区| 午夜两性免费视频| 欧美猛男男男激情videos| 欧美一级成年大片在线观看 | 日韩av在线资源| 国产无套粉嫩白浆内谢| 成人黄色网址在线观看| 69堂免费视频| 精品久久91| 国产精品入口日韩视频大尺度| 成人福利在线| 欧美视频中文一区二区三区在线观看| 超碰97在线资源站| 丝袜国产日韩另类美女| 亚洲砖区区免费| 成人影院在线免费观看| 日韩视频在线观看免费| 国产同性人妖ts口直男| 亚洲永久免费av| 中文乱码人妻一区二区三区视频| 久久精品伊人| 一区二区三区我不卡| 国产一区二区视频在线看| 久久久久一本一区二区青青蜜月| 色窝窝无码一区二区三区| 亚洲成av人片一区二区| 亚洲自拍偷拍图| 紧缚奴在线一区二区三区| 欧美另类videosbestsex日本| 日本免费精品| 57pao国产成人免费| 成人免费在线视频网| 在线播放中文一区| 日韩成人av毛片| 国产精品久线在线观看| 亚洲一区二区三区黄色| 日韩高清欧美激情| 亚洲中文字幕无码一区二区三区| 亚洲区小说区图片区qvod| 成人福利在线视频| 三妻四妾完整版在线观看电视剧 | 红桃视频成人在线观看| 久久亚洲AV无码专区成人国产| 精品一区二区日韩| 欧美综合在线播放| 99精品在线| 久久精品中文字幕一区二区三区 | 夜夜春成人影院| 91精品视频在线| 亚洲黄色中文字幕| 欧美日韩福利视频| 搞黄视频免费在线观看| 亚洲а∨天堂久久精品9966| 中文字幕 日韩有码| 午夜在线电影亚洲一区| 亚洲一级片在线播放| av激情综合网| 国产黑丝在线视频| 日本91福利区| 人妻有码中文字幕| 激情91久久| 青青草影院在线观看| 伊人春色之综合网| 国产伦精品一区二区三区高清 | 亚洲一区二区四区蜜桃| 九一在线免费观看| 久久久久99| 青青青青在线视频| 欧美日韩国产亚洲一区| 中国一级大黄大黄大色毛片| 91麻豆精品国产91久久久平台| 日韩国产精品一区二区| 国产亚洲一区| 日本精品一区| 精品日本12videosex| 日韩精品在在线一区二区中文| 亚洲日本三级| 欧美精品亚洲精品| 精品国产乱码久久久久久1区2匹| 欧洲亚洲一区| 日韩精品一区二区久久| 亚洲精品永久www嫩草| 日韩欧美伦理| 久久精品国产精品亚洲精品色| 91综合在线| 国产对白在线播放| 欧美日韩影院| 国内自拍在线观看| 日韩中文字幕一区二区三区| 成人免费视频久久| 麻豆极品一区二区三区| 怡红院亚洲色图| 国产精品一区专区| 波多野结衣视频播放| 99久久国产综合色|国产精品| 天天插天天射天天干| 久久精品亚洲麻豆av一区二区| 日韩毛片无码永久免费看| 国产精品免费看片| 麻豆亚洲av熟女国产一区二 | 久久精品无码中文字幕| 亚洲美女黄色| 欧美三级午夜理伦三级| 日韩福利视频网| 伊人五月天婷婷| 成人免费视频一区二区| 日本高清www| 最新热久久免费视频| 久久黄色免费视频| 欧美性猛交xxxx乱大交3| 中文在线资源天堂| 精品999久久久| 国模吧精品人体gogo| 久青草国产97香蕉在线视频| 1234区中文字幕在线观看| 国产精品久久91| 91精品国产自产在线丝袜啪 | av免费在线一区二区三区| 不卡av电影在线观看| 九色porny丨国产首页在线| 国产精品热视频| 澳门成人av| 亚洲图片在线观看| 最新国产拍偷乱拍精品| 日韩大片一区二区| 不卡的av电影| 亚洲熟女毛茸茸| 欧美日韩国产丝袜另类| 亚洲怡红院av| 精品中文字幕久久久久久| 麻豆系列在线观看| 国产福利视频一区二区| 亚洲国产精品免费视频| 日韩中文一区二区三区| 在线播放日韩| 图片区乱熟图片区亚洲| 久久久亚洲高清| 日韩精品一区二区三区国语自制| 欧美视频日韩视频在线观看| 亚洲高清视频在线播放| 中日韩美女免费视频网站在线观看| 国精产品一区一区三区mba下载| 国产精品网红直播| 天堂网av成人| 女人帮男人橹视频播放| 国产真实乱子伦精品视频| 在线免费观看日韩av| 亚洲一区二区精品视频| 一级片在线观看视频| 国产一区二区三区在线免费观看| 国产福利在线免费观看| 亚洲aa在线观看| 久久国产小视频| 9久久婷婷国产综合精品性色| 91麻豆视频网站| 国产精久久久久久| 欧美一区二区啪啪| 免费av网站在线看| 国产精品羞羞答答| 国产影视精品一区二区三区| 国产在线青青草| 99re热这里只有精品视频| 国产无套内射又大又猛又粗又爽| 日韩免费在线观看| 在线观看午夜av| 亚洲综合av影视| 综合一区在线| 激情成人在线观看| 亚洲人妖av一区二区| 中文字幕一区二区三区波野结| 国产一区二区三区在线视频 | 极品尤物久久久av免费看| www.com久久久| 亚洲欧洲日韩av| 91超薄丝袜肉丝一区二区| 爽爽爽爽爽爽爽成人免费观看| 草莓视频成人appios| 亚洲a∨一区二区三区| 日本欧美一区二区| 天天爽天天爽天天爽| 在线成人小视频| av香蕉成人| 国产成人精品日本亚洲11 | 神宫寺奈绪一区二区三区| 亚洲18私人小影院| 日本国产精品| 国产三级三级三级看三级| 国产精品理论在线观看| 国产精品久久久久久69| 欧美成人国产va精品日本一级| 亚洲91网站| 欧美视频在线免费播放| 91视频精品在这里| 波多野结衣人妻| 久久精品国产91精品亚洲| 日韩在线观看一区二区三区| 分分操这里只有精品| 91蝌蚪国产九色| 中文字幕+乱码+中文字幕明步| 久久久国产一区二区| h视频久久久| www.日本xxxx| 亚洲欧美偷拍三级| 日本激情一区二区三区| 日本精品久久久久久久| 久久麻豆精品| 69亚洲乱人伦| 日本高清不卡视频| 91蜜桃在线视频| 欧美极品一区二区| 激情亚洲综合在线| 日本最新中文字幕| 在线播放国产一区中文字幕剧情欧美| 91成人在线网站| 五十路熟女丰满大屁股| 欧美国产欧美综合| 不卡av中文字幕| 国产精品91免费在线| 久久精品亚洲人成影院| 国产精品手机在线观看| 欧美色中文字幕| 超碰中文在线| 亚洲国产精品久久久久久女王| 粉嫩绯色av一区二区在线观看| 黑人精品无码一区二区三区AV| 日韩在线高清视频| 国产一区二区三区亚洲| 国产aⅴ爽av久久久久| 高跟丝袜欧美一区| 成人在线免费看片| 欧洲精品码一区二区三区免费看|