対象: column-count / column-width /
columns / column-gap 実装:
arm/v1/src/os_lib/layout/multicol.rs(純粋モジュール) +
arm/v1/src/os_lib/layout/tree.rs(layout_block
の後処理) 試験: arm/v1/tests/src/test_multicol.rs(21 件)
+ arm/v1/src/os_lib/layout/selftest.rs(結合 3 件)
多段組は本来 display
と同格の新しいレイアウトモードだが、
通常フローで子を積み終えたあとに列へ再配置する後処理として実装した。
理由は既存経路を壊さないため。幅計算・マージン相殺・float・
box-sizing・絶対配置など、ブロックレイアウトには長期のデバッグで
積み上げた分岐が多数ある。新モードを足すとそれらを再実装することになり、
回帰の危険が高い。後処理なら「積み終わった結果の x/y
を移すだけ」で済む。
代償として、列またぎの分割(1 つの段落が列 A の末尾から列 B の先頭へ 続く)はできない。子ボックス単位でしか列へ振り分けられない。
gap
は列と列の間だけに入り、外側には入らない。 よって
列幅 = (使用可能幅 - gap × (列数 - 1)) / 列数。column-count: 0
や負値、幅 0 のコンテナでも 1 列へ倒す(ゼロ除算と無限列の防止)。column-count と
column-width
が両方あるときは小さい方を採る。 仕様上
column-count は上限として働く。gap
が広すぎて幅が残らない場合は 幅 0 の列を返す(パニックさせない)。column-gap の既定は仕様上
normal=1em 相当。本実装では
解決済みピクセル値を受け取り、取れないときは 16px(CSS
の初期 フォントサイズ相当)を使う。column-span(段抜き)break-inside / break-before /
break-after(段区切り制御)column-rule(段罫線)column-fill(balance / auto
の切り替え。常に貪欲法で詰める)columns ショートハンドの長さ成分は
px のみ解決する。 2em
等の未対応単位は「長さとして扱えない」として無視し、
ページ全体を壊さない安全側へ倒す。