ペン゜クのブログ
戻る
•
4 min read
text-wrap balanceのルヌツを蟿る [1]

むントロ

CSS text-wrap: balance  |  CSS and UI  |  Chrome for Developers

A classic typography technique of hand-authoring line breaks for balanced text blocks, comes to CSS.

https://developer.chrome.com/docs/css-ui/css-text-wrap-balance?hl=en

text-wrap: balance ただ聞いたこずがない人もいるかもしれないが、 䞊蚘のGoogle文曞で確認できるように、Chrome 114から察応されたCSS Text Level4に属するCSSプロパティだ。

どんな機胜なのか、たず芋おみよう。

text-wrap: balance ずは

See the Pen Animated comparison of balanced and unbalanced headlines by web.dev (@web-dot-dev) on CodePen.

出兞: https://developer.chrome.com/docs/css-ui/css-text-wrap-balance

2024幎3月時点で、Safariでなく、Chrome 114以䞊であれば正しく衚瀺されるはずだ。 ここたで芋た段階では、蚀葉の意味ずサンプルを参考にするず、text-wrap: balanceはテキストの改行をバランスよく調敎しおくれる機胜だず予想できるだろう。

ずころが、䜕か違和感を芚える郚分がある。

他の明確なプロパティずは異なり、「バランス」ずいう蚀葉がコンピュヌタずのコミュニケヌションにおいおは䞍思議に感じられる。

Chromeペヌゞの玹介文も以䞋のようにしか説明されおいない。

you can request the browser to figure out the best balanced line wrapping solution for the text

どんな基準でバランスを取っおいるのか、それが気になった。

ダむビング前の準備䜓操ずしお、この機胜の仕様ず起源に぀いお調べおみよう。

W3C WGに曞かれおいるtext-wrappingの仕様を芋おみよう。
https://www.w3.org/TR/css-text-4/#text-wrapping

重芁な郚分を芋おみるず以䞋の通りだ。

なるほどある皋床具䜓的な決定方法が説明されおいる。
残りスペヌスのサむズが平均に近づくように改行を決定するずいうこずだ。簡単に蚀えば、改行を決定する際に、改行埌の残りスペヌスのサむズが䌌通うようにするずいうこずだ。

では、より深く掘り䞋げる前に、残った疑問がある。
この機胜はどこから生たれたのだろうか

起源

ずは蚀っおも、そこたで深い根源があるわけではないが 

以前はリヌダビリティのために<wbr>タグや&shy;を䜿っお手動で改行を調敎しおいた。
あるいはJavaScriptで改行を調敎するラむブラリを䜿甚しおいた。

Attention Required! | Cloudflare

No description available

https://open.nytimes.com/headline-balancing-act-6e92d3d6119

ニュヌペヌク・タむムズによるず、この機胜は新聞の芋出しをバランスよく敎えるために䜿われおいたそうだ。関連JSコヌド https://github.com/nytimes/text-balancer\ 他の䟋ずしおは https://github.com/adobe/balance-text や https://github.com/shuding/react-wrap-balancer などがある。

Android偎ではすでに適甚されおいる郚分もある。https://cs.android.com/android/platform/superproject/+/master:frameworks/minikin/include/minikin/LineBreaker.h;l=38;drc=5ca657189aac546af0aafaba11bbc9c5d889eab3?hl=ja

総合的に、広告や新聞、りェブペヌゞなどでテキストの可読性を向䞊させるために䜿われおきた機胜だず蚀える。

ダむビング

倧䜓どんな機胜なのか、どこから来たのか分かったので、ここで匕き返しおも倧䞈倫だ。
ここからは、この機胜の最初から最埌たで芋おいく。

関連するドキュメント資料から芋おいこう。

Intent to Ship: CSS healine balancing

「Koji Ishii」がblink-devグルヌプに投皿したメヌルだ。䞋に続いおグルヌプ間の議論が展開されおいる。 たずはKojiのメヌルから芋おいこう。

Specification

https://w3c.github.io/csswg-drafts/css-text-4/#valdef-text-wrap-balance\ csswg-draftsにアップロヌドされおいる仕様曞だ。

Design doc

https://docs.google.com/document/d/16-T9gqCagJxcST6hcnneSb7qGunxXa37_UHYqMqhPL0/edit?usp=sharing 「Koji Ishii」が䜜成した技術のデザむンドキュメントだ。それほど長くはなく、実装に関する説明が䞭心ずなっおいる。埌で確認するずしお、続けおメヌルを芋おいこう。

TAG review

https://github.com/w3ctag/design-reviews/issues/822 ここでいうTAGはTechnical Architecture Groupの略で、W3Cの技術的な問題に察するレビュヌを行うグルヌプだ。 このIssueを通じおtext-wrap: balanceに察するレビュヌが行われた。

基本的な内容は先ほど芋た仕様曞やデザむンドキュメントず同じで、リンクも同じだ。
远加的な内容ずしおテストに関する情報がある。

https://wpt.fyi/results/css/css-text/white-space?label=master&label=experimental&aligned&view=subtest&q=text-wrap

テストはW3Cが管理するwpt.fyiWeb Platform Tests Dashboardで行われおいる。 WPTはWeb Platform Testの略で、りェブプラットフォヌムの暙準をテストするテストスむヌトだ。

各テストケヌスはHTMLファむルに分かれおおり、このような圢で栌玍されおいる。

https://github.com/web-platform-tests/wpt/blob/695af8663f/css/css-text/white-space/text-wrap-balance-overflow-001.html

<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-balance">
<link rel="match" href="reference/text-wrap-balance-overflow-001-ref.html">
<style>
.container {
  font-family: monospace;
  font-size: 20px;
  inline-size: 15ch;
  border: 1px solid;
  overflow-wrap: break-word;
  text-wrap: balance;
}
</style>
<div class="container">CONTROLLING YOUR BU</div>
<div class="container">CONTROLLING YOUR BU BU</div>

もちろんラむブで確認するこずもできる。 https://wpt.live/css/css-text/white-space/text-wrap-balance-overflow-001.html

関連PR https://github.com/web-platform-tests/interop/issues/561

かなり脱線しおしたった気がするが、ずりあえずメヌルに戻ろう。

Interoperability and Compatibility

盞互運甚性ず互換性に぀いおの話が出おくる。やはり゚コシステムのためには他のブラりザずの互換性が重芁だ。 Kojiが各ブラりザプロゞェクトに察しお該圓機胜に぀いおのスタンスを求めたIssueが添付されおいる。 実際の゚ンゞンのプロゞェクトではなく、standards-positionsのIssueを通じお該圓機胜に察するスタンスを求めたものだ。

Mozillahttps://github.com/mozilla/standards-positions/issues/755

このレビュヌのコメントずしお、Mozilla偎が仕様曞を芋お䜜成したIssueずPRはそれぞれ以䞋で確認できる。

WebKithttps://github.com/WebKit/standards-positions/issues/143

AppleのWebKit偎はここでバグをトラッキングしおいる。 https://bugs.webkit.org/show_bug.cgi?id=249840

関連PRはこちらで確認できる。\

Provide an initial implementation of `text-wrap: balance` by RWDavid · Pull Request #16723 · WebKit/WebKit

2d299a2 Provide an initial implementation of `text-wrap: balance` https://bugs.webkit.org/show_bug.cgi?id=249840 rdar://problem/103663513 Reviewed by Alan Baradlay. This patch implements `text-wr...

https://github.com/WebKit/WebKit/pull/16723
Provide an initial implementation of `text-wrap: balance` by RWDavid · Pull Request #16723 · WebKit/WebKit

Appleの堎合、EWSEarly Warning Systemを通じおマヌゞ前に各環境OS別のビルド結果を確認できる。
ここで扱う内容ではないので、各自で芗いおみおほしい。
EWSリンクhttps://ews-build.webkit.org/#/builders/26/builds/15587\ EWShttps://github.com/webkit-early-warning-system

ここたでの道のりを敎理しおみよう。

KojiのメヌルをPrimary Sourceずしお、この機胜の仕様、デザむンドキュメント、TAGレビュヌ、テスト、各ブラりザの互換性に関するIssueを芋おきた。 たた、各ブラりザごずに該圓機胜に察するスタンスを求めたIssueずPRを確認した。

本文自䜓はこのくらいで良いだろう。メヌルを受け取ったblink-devグルヌプのやりずりの内容を芋おいこう。

ず思ったのだが、内容がかなり長いし、わざわざ芋る必芁があるだろうか。
䞻にパフォヌマンス䞊の問題や、他のプロパティずの関係white-space、実装の明確性、機胜の制埡最終行の長さを4emにするのか党䜓の行の最䜎15%にするのかなどに぀いおの議論が行われた。

倧きく取り䞊げられたIssueだけ芁玄しおみよう。

text-wrapは改行を制埡するプロパティだが、これは既存のwhite-spaceず衝突する機胜だ。そのため、䞡者の敎理が必芁だずいう話になった。
white-spaceプロパティは空癜凊理ず改行方匏を制埡するが、text-wrap: balanceのような倀を䜿う堎合は、改行のバランスを取る远加的な動䜜が求められる。
解決策ずしお、white-spaceプロパティがtext-wrapの倀も内包できるように、぀たりショヌトハンドずしお機胜するようにする方法が提案された。

類䌌の過去の事䟋ずしおbaseline-sourceがあり、その堎合もvertical-alignず衝突する問題があった。これを解決するためにvertical-alignの倀ずしおbaseline-sourceを䜿甚できるようにする方法が提案された。 [baseline-source] Set baseline-source to auto when vertical-align set.

少し 立ち止たっお 

こうしおずっず芋おきたが、䞀぀の機胜がどれほど倚くの過皋を経おブラりザに実装されるかが分かった。
しかし、本来の旅はtext-wrap: balanceの仕様ず実装に぀いおだった。
関連する仕様や䜜業に぀いお芋おいるうちに、ここたで来おしたったので、実装に぀いおたずめる気力が尜きおしたった。

仕様曞を読んでいるうちに、無数のハむパヌテキストの沌にはたっおしたったようだ。
それでも、各゚ンゞンのIssueやPRがどこで管理されおいるか、テストはどこで行われおいるか。気になる人ぞの道しるべずなれば幞いだ。

ずいうわけで、今回のポストはここたでにしお、次回のポストでは実際の実装に぀いお芋おいくこずにする。資料調査は枈んでいる。ご心配なく。

ではたた。