CSS講座 / 表のデザイン:枠線・列幅・table-layout

CSSで表を整えるときは、表全体の幅、列への幅の配分、セル内の余白を分けて考えます。table-layoutは列幅の計算方法を選び、狭い画面では必要な情報を残したまま表の周囲を横スクロールさせられます。

表の幅とセルの余白を分ける

表のwidthは表全体、thとtdのpaddingは各セルの内側に作用します。border-collapse: collapseは隣り合うセルの枠線をまとめます。表の幅を100%にしても、改行できない長い内容などが最小幅を押し上げれば、親からはみ出す場合があります。

table { width: 100%; border-collapse: collapse; }

th, td { padding: 12px; border: 1px solid #aaa; text-align: start; }

行の高さを一律に固定するより、内容に応じて伸びるようにする方が、説明の追加や文字の拡大に対応できます。高さやoverflowで隠す前に、どの列が幅を必要とするかを確認します。

内容に応じて列幅を配分する

名前は短く説明は長い表なら、列の役割に応じた幅を検討します。次のcolgroupは30%と70%の指定例です。すべての表を均等幅にしたり、同じ比率を使い回したりする必要はありません。

<colgroup>

  <col style="width: 30%;">

  <col style="width: 70%;">

</colgroup>

colgroupは列をまとめ、colは列ごとの指定に使います。自動レイアウトでは内容の最小幅なども関係するため、比率だけで実寸が必ず決まるとは限りません。MDNのcolgroupでHTMLの構造を確認できます。

autoとfixedの列幅計算を比べる

table-layout: autoはセルの内容を考慮して列を計算します。fixedは表の指定幅と列の指定などを使って計算し、内容だけで列幅を広げない配置に向きます。fixedの効果を得るには、表のwidthがauto以外であることも確認します。詳しい条件はMDNのtable-layoutにあります。

下の完全例では、両方の表をwidth: 100%と同じcolgroupにし、計算方法だけを変えます。長い予約番号のセルには、どちらにもnowrap・hidden・ellipsisを指定しています。fixed側では決めた幅の中で省略されますが、auto側は内容の幅の影響を受けて表が広がることがあります。

省略記号は内容を削除する操作ではありません。ただし画面上で読めなくなるため、重要な番号を省略する設計では、詳細表示やコピー手段などで全文にアクセスできることが必要です。

狭い画面では表の周囲をスクロールさせる

.table-scroll { overflow-x: auto; }

table { width: 100%; min-width: 32rem; }

この部分は完全例のスクロール用ラッパーと表の指定です。min-width: 32remは、ルートの文字サイズが16pxなら512pxです。これは実習用の値で、実際には列の数と内容に合わせて決めます。幅が足りないときにページ全体ではなく、この領域だけが横に動くことを確認します。

例ではスクロール領域にtabindex="0"、regionの役割、内容を示す名前を付けています。キーボードで領域へ移動したときのフォーカス表示を残し、左右キーでも最後の列へ到達できるか確認します。MDNのoverflowも参照してください。

完全な例を保存して比較する

次をtables.htmlとしてUTF-8で保存し、ブラウザーで開きます。学習用の二つの表はデータと幅の条件をそろえています。

<!doctype html>

<html lang="en">

<head>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Table sizes and long content</title>

  <style>

    body { margin: 16px; color: #333; font: 16px/1.6 sans-serif; }

    .table-scroll { max-width: 640px; overflow-x: auto; margin-block: 16px; }

    .table-scroll:focus-visible { outline: 3px solid #e58c1f; outline-offset: 3px; }

    table { width: 100%; min-width: 32rem; border-collapse: collapse; }

    th, td { padding: 12px; border: 1px solid #aaa; text-align: start; }

    .auto { table-layout: auto; }

    .fixed { table-layout: fixed; }

    .token { font-family: monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

    .original { max-width: 640px; overflow-wrap: anywhere; }

  </style>

</head>

<body>

  <h1>Automatic and fixed table layout</h1>

  <h2>table-layout: auto</h2>

  <div class="table-scroll" role="region" aria-label="Auto Batch Comparison Table" tabindex="0"><table class="auto"><colgroup><col style="width: 30%;"><col style="width: 70%;"></colgroup><thead><tr><th scope="col">item</th><th scope="col">explanation</th></tr></thead><tbody><tr><th scope="row">What to bring</th><td>Bring a water bottle and comfortable shoes.</td></tr><tr><th scope="row">reservation code</th><td class="token">GARDEN-VISIT-RESERVATION-2026-ABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr><tr><th scope="row">Visitor Information</th><td>Even if long information sentences span multiple lines, the cell height is increased to match the content.</td></tr></tbody></table></div>

  <h2>table-layout: fixed</h2>

  <div class="table-scroll" role="region" aria-label="Fixed batch comparison table" tabindex="0"><table class="fixed"><colgroup><col style="width: 30%;"><col style="width: 70%;"></colgroup><thead><tr><th scope="col">item</th><th scope="col">explanation</th></tr></thead><tbody><tr><th scope="row">What to bring</th><td>Bring a water bottle and comfortable shoes.</td></tr><tr><th scope="row">reservation code</th><td class="token">GARDEN-VISIT-RESERVATION-2026-ABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr><tr><th scope="row">Visitor Information</th><td>Even if long information sentences span multiple lines, the cell height is increased to match the content.</td></tr></tbody></table></div>

  <p class="original">Full reservation code: GARDEN-VISIT-RESERVATION-2026-ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>

</body>

</html>
  1. 画面を狭くし、表の領域をタッチ操作またはTabと左右キーで横に動かします。最後の列が読めるか確認し、左端へ戻します。
  2. fixed側だけをautoへ変え、予約番号と列幅の変化を見てfixedへ戻します。開発者ツールで表の実寸も確認します。
  3. .tokenのwhite-spaceをnormalにし、overflow-wrap: anywhereを追加します。番号が複数行になって高さが増えることを確認し、追加と変更を戻します。
  4. 列の比率を40%・60%へ変え、説明の読みやすさを比べて30%・70%へ戻します。

表の列は画面を小さくしても相互の対応が分かるように保ちます。長文を折り返す方法ははみ出しと改行、セルの余白はボックスモデルでも確認できます。