Dev Study
← 解説「位置と大きさ — block は縦に積み、inline は横に並べ、右端で折り返す」に戻る

サンプルコードで身につける: 位置と大きさ — block は縦に積み、inline は横に並べ、右端で折り返す

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1block を縦に積む(幅は親いっぱい・高さは中身)

layout_block の骨組みだけを写したものです。幅は container_width をそのまま使い(width: auto)、子を cursor_y の位置に順に置いて、高さは子が占めた分、子が無ければ font-size × 1.5 にします(height: auto)。実行すると h1 が h=48、p が y=48 h=24、div が y=72 h=48 と縦に積まれ、body の高さが 120 になります。

Rust

2カーソルで行を管理し、右端で折り返す

参照実装 layout_flow の Text の枝をそのまま切り出した layout_text です。Cursor の x, y, line_height だけで「今の行のどこまで埋まったか」を持ち、この行に入る文字数 avail が尽きたら newline() で次の行へ移ります。幅 160px(16px の文字で 20 文字)に 3 つの文字列を流すと、"0" が x=64、3 つ目が x=72 から始まって y=24 の行に、 の高さは 48px(2 行)になります。

Rust

3実務に写す: 端末に出す表の列幅

固定幅の列はその幅、auto の列は残りを分け合う resolve_widths と、セルの文字を列幅で折り返す wrap です。行の高さが一番高いセルで決まるのは、block の高さが中身で決まるのと同じ考え方です。実行すると列幅が [6, 8, 22] と決まり、長い Note が 3 行に折り返された表が出ます。

Rust

図やコードに出てくる用語(タップで説明)