LayoutNG

LayoutNG 是新版版面配置引擎,預計在 Chrome 76 發布。我們將推出幾項令人期待的即時改善功能,並陸續推出更多效能提升和進階版版面配置功能。

新功能

  1. 改善效能隔離。
  2. 更完善的支援:支援拉丁文以外的文字。
  3. 修正浮動和邊界的問題。
  4. 修正大量網頁相容性問題。

請注意,LayoutNG 會分階段推出。在 Chrome 76 中,LayoutNG 用於內嵌和區塊版面配置。其他版面配置基本元素 (例如表格、彈性容器、格線和區塊分割) 將在後續版本中替換。

開發人員可見的異動

雖然對使用者可見的影響應會降到最低,但 LayoutNG 會以非常細微的方式變更某些行為、修正數百項測試,並改善與其他瀏覽器的相容性。儘管我們盡了最大努力,但這項變更可能會導致部分網站和應用程式的顯示或行為略有不同。

成效特徵也大不相同;雖然整體成效與先前相似或略勝一籌,但某些用途可能會看到成效提升,而其他用途則可能會出現某種程度的退步,至少在短期內是如此。

浮動

LayoutNG 重新實作對浮動元素 (float: left;float: right;) 的支援,修正浮動元素與其他內容相關的多項正確性問題。

疊加的內容

舊版浮動實作方式在將內容置於浮動元素周圍時,未正確考量邊界,導致內容部分或完全重疊浮動元素。這類錯誤最常見的情況是,圖片位於段落旁邊,而避開邏輯無法考量行高。(請參閱 Chromium 錯誤 #861540)。

顯示在浮動圖片上方的頂端文字行
圖 1a:舊版版面配置引擎
文字與右側浮動圖片重疊
左側顯示正確文字,右側顯示浮動圖片
圖 1b:LayoutNG
文字位於右側浮動圖片旁邊

同一個行內也可能會發生同樣的問題。以下範例顯示浮動元素 (#895962) 後方有負邊距的區塊元素。文字不得與浮動文字重疊。

文字行顯示在橘色方塊上
圖 2a:舊版版面配置引擎
文字與浮動式橘色元素重疊
橘色方塊右側的文字正確
圖 2b:LayoutNG
文字位於浮動式橘色元素旁

格式化背景資訊位置

當形成區塊格式化內容的元素在浮動小工具旁邊調整大小時,舊版版面配置引擎會嘗試調整區塊的大小,直到達到固定次數後才會放棄。這種做法會導致不可預測且不穩定的行為,且與其他實作方式不符。在 LayoutNG 中,系統會在調整區塊大小時考量所有浮動值。(請參閱 Chromium 錯誤 #548033)。

絕對和固定定位現在更符合 W3C 規範,且與其他瀏覽器的行為更為一致。這兩種方法的差異最明顯的情況有兩種:

  • 多行內嵌包含區塊
    如果絕對定位的包含區塊橫跨多行,舊版引擎可能會錯誤地只使用部分行來計算包含區塊邊界。
  • 垂直書寫模式
    舊版引擎在垂直書寫模式中將流程外元素放置在預設位置時,會發生許多問題。如要進一步瞭解改善的寫入模式支援功能,請參閱下一節。

由右至左 (RTL) 語言和直向書寫模式

LayoutNG 的設計初衷是為了支援直向書寫模式和 RTL 語言,包括雙向內容。

雙向文字

LayoutNG 支援 萬國碼標準定義的最新雙向演算法。這項更新不僅修正各種轉譯錯誤,還包含缺少的功能,例如支援成對的括號 (請參閱 Chromium 錯誤 #302469)。

直交流

LayoutNG 可提高垂直流版面配置的準確度,包括絕對定位物件的放置方式,以及正交流箱的大小 (尤其是在使用百分比時)。在 W3C 測試套件中的 1,258 項測試中,103 項在舊版版面配置引擎中失敗的測試在 LayoutNG 中通過。

內建大小

在正交書寫模式中,如果區塊包含子項,現在會正確計算內在大小。

文字版面配置和斷行

舊版 Chromium 版面配置引擎會逐一排列文字元素和行。這種做法在大多數情況下都運作良好,但需要大量額外的複雜性才能支援指令碼並達到良好的效能。而且也容易出現測量不一致的情形,導致大小與內容容器的大小或內容出現細微差異,或出現不必要的換行符號。

在 LayoutNG 中,文字會以段落層級排版,然後分割成多行。這可提升效能、提升文字算繪品質,並提供更一致的斷行方式。以下詳細說明最明顯的差異。

跨元素邊界彙整

在某些文字系統中,某些字元在相鄰時可視為連在一起。請參考以下阿拉伯文範例:

在 LayoutNG 中,即使字元位於不同元素中,也能進行彙整。套用不同樣式時,連接也會保留。(請參閱 Chromium 錯誤 #6122)。

字元是語言書寫系統的最小單位。舉例來說,在英文和其他使用拉丁字母的語言中,每個字母都是一個字元。

下圖分別顯示以下 HTML 在舊版版面配置引擎和 LayoutNG 中的轉譯結果:

<div>&#1606;&#1587;&#1602;</div>
<div>&#1606;&#1587;<span>&#1602;</span></div>
左側為正確的構詞,右側為分離的錯誤轉譯
圖 3a:舊版版面配置引擎
請注意第二個字母的形式如何變化
顯示正確的組合構詞
圖 3b:LayoutNG
現在兩個版本都相同

中文、日文和韓文 (CJK) 連字元

雖然 Chromium 已支援連字元,並預設啟用連字元,但仍有一些限制:由於採用最佳化算繪技術,舊版版面配置引擎不支援涉及多個 CJK 代碼點的連字元。LayoutNG 會移除這些限制,並支援所有書寫系統的連字元。

以下範例顯示使用 Adobe SourceHanSansJP 字型的三個選用連字:

中間字元組合未形成連字體
圖 4a:舊版版面配置引擎
MHz 正確形成連字元
但 マンション 和 10 点 並未如此
顯示正確的連字元
圖 4b:LayoutNG
所有三個群組都如預期地形成連字元

尺寸與內容元素

對於大小與內容相符的元素 (例如內嵌區塊),目前的版面配置引擎會先計算區塊的大小,然後對內容執行版面配置。在某些情況下 (例如字型經過大量調整),這可能會導致內容大小與區塊不相符。在 LayoutNG 中,系統會根據實際內容的大小來調整區塊大小,因此這個失敗模式已遭到淘汰。

以下範例顯示了大小與內容相符的黃色方塊。它使用 Lato 字型,該字型會使用字距調整 T 和 - 之間的間距。黃色方塊的邊界應與文字的邊界相符。

文字容器結尾處顯示的結尾空白
圖 5a,舊版版面配置引擎
請注意最後一個 T 後面的空白
文字邊界沒有多餘的空格
圖 5b,LayoutNG
請注意方塊的左側和右側邊緣如何與文字的邊界相符

換行

與上述問題類似,如果大小與內容區塊的內容較大 (寬度較寬),內容有時可能會不必要地換行。這種情況相當罕見,但有時會發生在混合方向性的內容。

顯示過早的換行符號,導致出現額外空格
圖 6a,舊版版面配置引擎
請注意不必要的換行符號和右側的額外空格
不會顯示不必要的空格或換行符號
圖 6b,LayoutNG
請注意方塊的左側和右側邊緣如何與文字的邊界相符

其他資訊

如要進一步瞭解 LayoutNG 修正的特定相容性問題和錯誤,請參閱上述連結的相關問題,或搜尋 Chromium 錯誤資料庫中標示為「Fixed-In-LayoutNG」的錯誤。

如果您懷疑 LayoutNG 可能導致網站中斷,請提交錯誤報告,我們會進行調查。