HTMLテーブルに長いURLやコードを入れたら、列幅が極端に広がってレイアウトが崩壊した――そんな経験はありませんか?
テーブルは情報を整理する最も強力なHTML要素ですが、セル内の改行制御を正しく理解していないと、見た目が大きく崩れてしまいます。特に英数字だけの長い文字列、URL、ハッシュ値、ファイルパスなどは「改行不可能な文字列」としてブラウザに認識され、テーブル全体を押し広げてしまいます。
この記事では、white-space、word-break、overflow-wrap、table-layout、text-overflow、CSS Hyphensなど、テーブル内の改行制御に関わるすべてのCSSプロパティを体系的に解説します。基本の仕組みから、実務で使えるパターン集、レスポンシブ対応、トラブルシューティングまで網羅しているので、この1記事で改行制御の悩みを完全に解決できます。
この記事で学べること
- テーブルセル内で改行が起きる・起きない仕組み
- white-space / word-break / overflow-wrap の違いと使い分け
- table-layout: fixed と auto の挙動の違い
- text-overflow で省略表示する方法
- CSS Hyphens でハイフネーションを制御する方法
- レスポンシブ対応のベストプラクティス
- 実務で頻出する7つのパターンと解決法
- よくあるトラブルと原因・対処法
テーブルセル内で改行が発生する仕組み
まず、ブラウザがテーブルセル内のテキストをどのように改行するかを理解しましょう。この基本を押さえておくことで、以降のCSSプロパティの効果が直感的に分かるようになります。
ブラウザの改行アルゴリズム
ブラウザは、テキストを表示する際に「改行可能ポイント」(break opportunity)を探します。改行可能ポイントとは、行が長くなりすぎたときに折り返してよい位置のことです。
CSS Text Module Level 3仕様では、テキストの改行は以下の手順で処理されます。
- テキストを「行ボックス」に配置する
- 行ボックスの幅を超えた場合、改行可能ポイントを探す
- 改行可能ポイントが見つかれば、そこで折り返す
- 見つからなければ、テキストはコンテナからはみ出す
| 改行可能ポイント |
説明 |
例 |
| 半角スペース |
最も一般的な改行ポイント |
Hello World |
| ハイフン(-)の直後 |
ハイフンの後ろで改行可能 |
front-end |
| CJK文字の間 |
日本語・中国語・韓国語は文字間で改行可能 |
東京タワー |
| ソフトハイフン(­) |
明示的に改行ポイントを指定 |
Sup­port |
| <wbr>タグ |
HTMLで改行可能ポイントを挿入 |
file<wbr>name |
| ゼロ幅スペース(​) |
見えない改行ポイント |
data​base |
テーブルセル内で改行されないケース
逆に、以下のような文字列はブラウザが「改行不可能」と判断するため、セル幅を超えてもそのまま表示されます。
| 改行されない文字列 |
理由 |
具体例 |
| 長いURL |
スラッシュやドットだけでは改行ポイントにならない |
https://example.com/very/long/path/to/resource |
| 英数字の連続 |
途中にスペースがない連続文字列 |
abc123def456ghi789jkl012 |
| ハッシュ値 |
16進数文字の連続 |
e3b0c44298fc1c149afbf4c8996fb924 |
| ファイルパス |
区切り文字だけでは不十分 |
/usr/local/lib/node_modules/package |
| 長いCSSクラス名 |
ハイフンがあっても長すぎる場合 |
my-very-long-component-wrapper-class |
| Base64文字列 |
英数字+記号の連続 |
SGVsbG8gV29ybGQhIEhlbGxv |
注意:URLの改行挙動はブラウザごとに異なります。Chromeではスラッシュ(/)の後ろが改行ポイントになることがありますが、Firefoxでは改行されないケースがあります。クロスブラウザで統一した挙動を得るには、CSSで明示的に制御する必要があります。
テーブルの列幅計算と改行の関係
テーブルの列幅は、デフォルトではセル内容に基づいて自動計算されます(table-layout: auto)。この自動計算では以下のステップが実行されます。
- 各セルの「最小幅」(改行不可能な文字列の幅)を計算
- 各セルの「最大幅」(改行なしで表示した場合の幅)を計算
- テーブル全体の幅制約に基づいて、列幅を決定
改行不可能な長い文字列があると、その列の最小幅が大きくなり、他の列が圧迫されます。
HTML – レイアウトが崩れる例
<table>
<tr>
<td>ユーザー名</td>
<td>https://example.com/api/v2/users/profile/settings</td>
</tr>
</table>
/* URL列が極端に広がり、ユーザー名列が潰される */
この問題を解決するために、次のセクション以降で各CSSプロパティを詳しく見ていきます。
white-space プロパティの完全理解
テーブル内の改行制御で最も基本的かつ重要なプロパティがwhite-spaceです。このプロパティは、要素内の空白文字(スペース、タブ、改行)の処理方法と、テキストの折り返しを制御します。
white-space の全5値を比較
white-space には5つの値があり、それぞれ「空白の折りたたみ」「改行文字の処理」「自動折り返し」の3つの挙動が異なります。
| 値 |
空白の折りたたみ |
改行文字 |
自動折り返し |
テーブルでの用途 |
| normal |
する |
スペースに変換 |
する |
デフォルト。通常のテキスト表示 |
| nowrap |
する |
スペースに変換 |
しない |
改行を完全に禁止したい場合 |
| pre |
しない |
そのまま改行 |
しない |
コードやログの表示 |
| pre-wrap |
しない |
そのまま改行 |
する |
整形テキストで折り返しも許可 |
| pre-line |
する |
そのまま改行 |
する |
改行は維持しつつ空白は正規化 |
nowrap:改行を完全に禁止する
white-space: nowrap は、テキストの自動折り返しを完全に無効にします。セル内のテキストは、どんなに長くても1行で表示されます。
CSS
td.nowrap {
white-space: nowrap;
}
適したケース:
- 日付(2026-03-06)
- 金額(¥1,234,567)
- ステータスラベル(処理中、完了、エラー)
- 短いコード(変数名、関数名)
注意:nowrap を使うと、セル内容がテーブルの幅を超えてはみ出す可能性があります。必ず overflow や text-overflow と組み合わせるか、セル内容が短いことが保証されている場合にのみ使いましょう。
pre-wrap:空白を保持しつつ折り返す
white-space: pre-wrap は、ソースコード中の空白や改行をそのまま表示しつつ、コンテナ幅に応じた自動折り返しも許可します。
CSS
td.code-cell {
white-space: pre-wrap;
font-family: monospace;
}
テーブルセル内にコードスニペットやログ出力を表示する場合に便利です。インデントやスペースが保持されるため、コードの可読性が維持されます。
pre-line:改行は維持、空白は正規化
white-space: pre-line は、連続する空白は1つに折りたたみますが、ソースコード中の改行文字はそのまま改行として表示します。
CSS
td.address {
white-space: pre-line;
}
住所や複数行のメモなど、改行位置は意味を持つがインデントは不要なデータの表示に適しています。
テーブルセルでの white-space のデフォルト挙動
テーブルセル(<td>、<th>)の white-space のデフォルト値は normal です。つまり、自動折り返しが有効で、連続する空白は1つに折りたたまれます。
ただし、Cocoonなど一部のWordPressテーマでは、テーブルに独自のスタイルが適用されていることがあります。カスタマイズ前に、DevToolsで現在の適用スタイルを確認するのがベストプラクティスです。
DevTools での確認方法
/* Chrome DevTools でセルを選択し、Computed タブで確認 */
/* 1. F12でDevToolsを開く */
/* 2. 対象のセルを右クリック → 検証 */
/* 3. Computed タブで white-space を検索 */
/* 4. 現在の値と、どのCSSルールから来ているかを確認 */
white-space の実践的な使い分け
| 表示するデータ |
推奨値 |
理由 |
| 日付・時刻 |
nowrap |
途中で折り返すと読みにくい |
| 金額・数値 |
nowrap |
桁が折り返されると誤読の原因 |
| ステータスラベル |
nowrap |
短い文字列なので1行表示が適切 |
| 説明文・コメント |
normal |
長文は自然な折り返しが必要 |
| コードスニペット |
pre-wrap |
インデントを保持しつつ折り返し |
| 住所・複数行テキスト |
pre-line |
改行位置は維持、余分な空白は除去 |
| URL |
normal + overflow-wrap |
折り返しを許可しつつはみ出しを防止 |
word-break プロパティで単語の分割を制御する
word-break プロパティは、単語の途中での改行(分割)を許可するかどうかを制御します。通常、英語の単語は途中で分割されませんが、word-break を使うと強制的に任意の位置で改行させることができます。
word-break の全値を比較
| 値 |
英語の単語 |
CJK文字 |
テーブルでの効果 |
| normal |
単語途中で分割しない |
文字間で分割する |
デフォルト動作 |
| break-all |
任意の位置で分割する |
文字間で分割する |
長い英数字列を強制改行 |
| keep-all |
単語途中で分割しない |
分割しない(スペースのみ) |
CJK文字の途中改行を禁止 |
| break-word(非推奨) |
overflow時のみ分割 |
文字間で分割する |
overflow-wrap: break-word を推奨 |
break-all:長い英数字列を強制改行する
word-break: break-all は、CJK以外の文字列(英語、数字、記号など)を任意の位置で分割します。長いURLやハッシュ値がセルを押し広げる問題を解決できます。
CSS
td.break-all {
word-break: break-all;
}
/* 適用例 */
<td class="break-all">
https://example.com/very/long/path/to/resource?param=value
</td>
/* → セル幅に合わせて任意の位置で改行される */
注意:break-all は英語の通常の文章にも適用されるため、「inter」と「national」のように意味のある分割点を無視して途中で切れてしまいます。英語の文章が混在するセルには使わないようにしましょう。
keep-all:CJK文字の途中改行を禁止する
word-break: keep-all は、CJK(中国語・日本語・韓国語)テキストの文字間での改行を禁止します。デフォルトでは日本語は任意の文字間で改行可能ですが、keep-all を指定すると、スペースや句読点がある場所でのみ改行されます。
CSS
td.keep-all {
word-break: keep-all;
}
/* 適用前: 「東京都渋谷区」→「東京都渋」で改行される可能性あり */
/* 適用後: 「東京都渋谷区」は1行で表示 */
keep-all は韓国語の組版で標準的に使われますが、日本語でも固有名詞や専門用語が途中で改行されるのを防ぎたい場合に有効です。ただし、長い日本語テキストに適用するとセルが広がるため、短い項目名やラベルに限定して使いましょう。
word-break: break-all と overflow-wrap: break-word の違い
この2つはよく混同されますが、挙動に重要な違いがあります。
| 比較項目 |
word-break: break-all |
overflow-wrap: break-word |
| 改行タイミング |
常に任意の位置で改行 |
はみ出す場合のみ改行 |
| 英単語の扱い |
途中で切れる |
なるべく単語境界で改行 |
| URLの扱い |
行末まで詰めて改行 |
溢れる場合に改行 |
| 推奨用途 |
英数字のみのデータ |
混在テキスト全般 |
CSS – 挙動の違いを視覚化
/* テキスト: "This is an internationalization example" */
/* word-break: break-all の場合 */
/* → "This is an internatio" */
/* "nalization example" (単語の途中で切れる) */
/* overflow-wrap: break-word の場合 */
/* → "This is an" */
/* "internationalization" (単語の手前で改行) */
/* "example" */
ポイント:実務では、まず overflow-wrap: break-word を試し、それでもレイアウトが崩れる場合にのみ word-break: break-all を検討するのがベストプラクティスです。break-all は強力ですが、英語の文章の可読性を損なう副作用があります。
overflow-wrap(word-wrap)で溢れを防止する
overflow-wrap(旧称 word-wrap)は、テキストがコンテナからはみ出しそうな場合に、通常は改行されない位置でも改行を許可するプロパティです。word-break: break-all との最大の違いは、はみ出す場合のみ改行が発生する点です。
overflow-wrap の値
| 値 |
挙動 |
テーブルでの効果 |
| normal |
通常の改行ルールに従う |
長い単語がセルを押し広げる |
| break-word |
はみ出す場合のみ単語途中で改行 |
レイアウト崩れを防止 |
| anywhere |
任意の位置で改行可能(min-contentにも影響) |
最小幅の計算にも反映 |
break-word:最も実用的な選択肢
overflow-wrap: break-word は、テーブルセル内のテキストがセル幅を超えそうな場合にのみ、単語の途中で改行します。通常のテキストは自然な改行が維持されるため、可読性と安全性を両立できます。
CSS
td {
overflow-wrap: break-word;
}
/* 旧プロパティ名(IE互換が必要な場合) */
td {
word-wrap: break-word; /* 旧名 */
overflow-wrap: break-word; /* 現在の標準 */
}
ポイント:word-wrap は overflow-wrap の旧名称です。現在のCSS仕様では overflow-wrap が正式名ですが、後方互換性のために word-wrap も引き続きサポートされています。両方書いておくのが最も安全です。
anywhere:min-content にも影響する
overflow-wrap: anywhere は break-word と似ていますが、重要な違いがあります。anywhere は最小コンテンツ幅(min-content)の計算にも影響します。
CSS – break-word と anywhere の違い
/* break-word の場合 */
td {
overflow-wrap: break-word;
/* min-content = 改行不可能な最長文字列の幅 */
/* → テーブル列幅の計算では長い文字列の幅が使われる */
}
/* anywhere の場合 */
td {
overflow-wrap: anywhere;
/* min-content = 1文字の幅(最小可能幅) */
/* → テーブル列幅の計算でも柔軟になる */
}
この違いは table-layout: auto のテーブルで特に重要です。break-word では長い文字列の幅が列の最小幅として計算されるため、テーブルが広がることがあります。anywhere なら最小幅が1文字分まで縮小可能になるため、列幅の自動計算がより柔軟になります。
| 特性 |
break-word |
anywhere |
| 表示上の改行 |
はみ出す場合のみ |
はみ出す場合のみ |
| min-content への影響 |
影響しない |
影響する(最小幅が縮む) |
| table-layout: auto での効果 |
限定的 |
列幅が柔軟になる |
| ブラウザサポート |
全ブラウザ対応 |
IE非対応(モダンブラウザはOK) |
テーブルセルでの overflow-wrap の注意点
overflow-wrap: break-word は、テーブルセルにおいてtable-layout: fixed と組み合わせないと期待通りに動作しないことがあります。
CSS – テーブルでの正しい使い方
/* NG: table-layout: auto では効果が限定的 */
table {
width: 100%;
/* table-layout: auto (デフォルト) */
}
td {
overflow-wrap: break-word;
/* → 列幅計算で長い文字列の幅が考慮されるため、効果が薄い */
}
/* OK: table-layout: fixed と組み合わせる */
table {
width: 100%;
table-layout: fixed;
}
td {
overflow-wrap: break-word;
/* → 列幅が先に確定するため、はみ出す文字列が正しく折り返される */
}
この問題は次のセクション「table-layout」で詳しく解説します。
table-layout プロパティの理解と活用
table-layout は、テーブルの列幅の計算方法を制御するプロパティです。改行制御と密接に関わるため、このプロパティの理解なくしてテーブルの改行問題は解決できません。
auto と fixed の違い
| 特性 |
table-layout: auto |
table-layout: fixed |
| 列幅の決定方法 |
セル内容に基づいて自動計算 |
最初の行(またはcolgroup/col)で決定 |
| レンダリング速度 |
全行を読んでから描画 |
最初の行だけで描画開始(高速) |
| 長い文字列の影響 |
列幅を押し広げる |
列幅は変わらない |
| overflow-wrap の効果 |
限定的 |
正しく動作する |
| text-overflow の効果 |
効かないことがある |
正しく動作する |
| width指定の必要性 |
任意 |
必須(width: 100% 等) |
table-layout: auto の問題点
デフォルトの table-layout: auto では、ブラウザはテーブル全体のセル内容を解析してから列幅を決定します。このとき、改行できない長い文字列があると、その幅がその列の「最小幅」となり、テーブル全体のレイアウトに影響します。
HTML – auto レイアウトの問題
<table style="width: 100%">
<tr>
<td>ID</td>
<td>名前</td>
<td>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</td>
</tr>
</table>
/* → ハッシュ列が80%以上の幅を占め、IDと名前が極端に狭くなる */
table-layout: fixed で列幅を固定する
table-layout: fixed を指定すると、列幅はセル内容ではなく、以下の優先順位で決定されます。
- <col> 要素の width
- 最初の行のセルの width
- テーブル幅を列数で均等割り
CSS – fixed レイアウトの基本
table {
table-layout: fixed;
width: 100%;
}
/* 列幅を個別に指定する場合 */
<table>
<colgroup>
<col style="width: 80px"> <!-- ID列 -->
<col style="width: 150px"> <!-- 名前列 -->
<col> <!-- 残りの幅 -->
</colgroup>
...
</table>
fixed + overflow-wrap の組み合わせ
table-layout: fixed と overflow-wrap: break-word を組み合わせることで、列幅を固定しつつ、はみ出す文字列を折り返すという理想的な挙動が得られます。
CSS – 実務で最もよく使うパターン
table.stable-layout {
table-layout: fixed;
width: 100%;
border-collapse: collapse;
}
table.stable-layout td {
overflow-wrap: break-word;
word-wrap: break-word; /* 後方互換 */
padding: 8px 12px;
}
ポイント:table-layout: fixed を使う際は、必ず width(通常は100%)を指定してください。width がないと fixed が正しく動作しません。これは非常に多いミスです。
auto と fixed の選択基準
| 条件 |
推奨値 |
理由 |
| データの長さが予測可能 |
auto |
内容に合わせた列幅が便利 |
| ユーザー入力のデータを表示 |
fixed |
予測不能な長さに対応 |
| URLやハッシュ値を含む |
fixed |
長い文字列による崩れを防止 |
| 行数が多いテーブル |
fixed |
レンダリング速度が向上 |
| 列数が2-3列で短いデータ |
auto |
内容に最適化された幅が読みやすい |
| text-overflow を使いたい |
fixed |
auto では text-overflow が効かない |
text-overflow で省略表示を実現する
テーブルセル内のテキストが長すぎる場合、折り返すのではなく省略記号(…)で切り詰めるという選択肢もあります。管理画面の一覧表や、限られたスペースでデータを表示する場合に非常に有効です。
text-overflow の基本構成
text-overflow を機能させるには、以下の3つのプロパティをセットで指定する必要があります。1つでも欠けると省略表示は動作しません。
CSS – text-overflow の3点セット
td.ellipsis {
white-space: nowrap; /* 1. 改行を禁止 */
overflow: hidden; /* 2. はみ出しを隠す */
text-overflow: ellipsis; /* 3. 省略記号を表示 */
}
| プロパティ |
役割 |
省略時の問題 |
| white-space: nowrap |
テキストを1行に制限 |
折り返しが発生し、省略されない |
| overflow: hidden |
はみ出した部分を隠す |
テキストがセルから溢れる |
| text-overflow: ellipsis |
省略記号を追加 |
テキストがぶつ切りになる |
テーブルでの text-overflow の注意点
text-overflow をテーブルセルで使う場合、table-layout: fixed が必須です。auto レイアウトでは、セル内容に合わせて列幅が広がるため、テキストが「はみ出す」ことが少なく、省略表示が発動しません。
CSS – テーブルで text-overflow を使う完全な例
table.truncate-table {
table-layout: fixed; /* 必須! */
width: 100%;
border-collapse: collapse;
}
table.truncate-table td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 8px 12px;
}
/* 特定の列だけ省略表示にする場合 */
table.truncate-table td:nth-child(3) {
max-width: 200px; /* 必要に応じて最大幅を指定 */
}
ツールチップとの組み合わせ
省略表示にする場合、ユーザーが全文を確認できる手段を用意するのが良い設計です。最も簡単な方法はtitle属性を使ったツールチップです。
HTML – title属性でツールチップを追加
<td
class="ellipsis"
title="https://example.com/very/long/path/to/api/v2/users"
>
https://example.com/very/long/path/to/api/v2/users
</td>
<!-- ホバーすると全文がツールチップで表示される -->
ポイント:title属性のツールチップはマウスホバーでしか表示されないため、モバイルデバイスでは利用できません。モバイル対応が必要な場合は、タップで展開するUIや、レスポンシブ時に省略を解除するメディアクエリを検討しましょう。
複数行での省略(line-clamp)
1行ではなく、複数行まで表示して省略したい場合は、-webkit-line-clamp を使います。テーブルセルでも利用可能です。
CSS – 2行で省略する例
td.line-clamp {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 2行まで表示 */
overflow: hidden;
text-overflow: ellipsis;
/* white-space: nowrap は指定しない(複数行なので) */
}
注意:-webkit-line-clamp はベンダープレフィックス付きですが、2026年現在、Chrome、Firefox、Safari、Edgeの全主要ブラウザで動作します。ただし、テーブルセルでは display プロパティの変更がレイアウトに影響を与える可能性があるため、十分にテストしてください。
CSS Hyphens でハイフネーションを制御する
hyphens プロパティは、テキストの折り返し時にハイフン(-)を挿入して単語を分割するかどうかを制御します。特に英語のテキストを含むテーブルで、可読性を維持しながら折り返しを行いたい場合に有効です。
hyphens の値
| 値 |
挙動 |
ハイフンの挿入 |
| none |
ハイフネーションなし |
しない |
| manual |
­ の位置でのみ分割 |
明示的な位置のみ |
| auto |
ブラウザが自動的に分割位置を判断 |
自動的に挿入 |
hyphens: auto を使う
CSS – ハイフネーションの設定
td.hyphenate {
hyphens: auto;
-webkit-hyphens: auto; /* Safari対応 */
}
/* 重要: lang属性が必要 */
<html lang="ja">
/* または */
<td lang="en" class="hyphenate">internationalization</td>
注意:hyphens: auto が正しく動作するには、HTML要素にlang属性が設定されている必要があります。ブラウザは言語辞書を使って適切な分割位置を判断するため、lang属性がないとハイフネーションが機能しません。
hyphens: manual とソフトハイフン
自動ハイフネーションではなく、開発者が明示的に分割位置を指定したい場合は、­(ソフトハイフン)を使います。ソフトハイフンは通常は表示されませんが、改行が必要な場合にのみハイフンとして表示されます。
HTML – ソフトハイフンの使用例
<td>
Sup­port­ed Brow­sers
</td>
<!-- 幅が十分な場合: "Supported Browsers" と表示 -->
<!-- 幅が狭い場合: "Sup-" -->
<!-- "ported Brow-" -->
<!-- "sers" と表示 -->
テーブルでの hyphens の使い分け
| シーン |
推奨値 |
理由 |
| 英語の長い単語 |
auto |
辞書ベースの適切な分割 |
| 日本語テキスト |
none(不要) |
日本語は文字間で自然に改行 |
| URL・コード |
none |
ハイフンが混入すると意味が変わる |
| 専門用語・固有名詞 |
manual |
分割位置を制御したい |
ポイント:hyphens は word-break や overflow-wrap と組み合わせて使えます。例えば overflow-wrap: break-word で基本的な折り返しを確保し、hyphens: auto でさらに美しい改行を実現する、という使い方が可能です。
HTMLで改行を制御する方法
CSSだけでなく、HTML側でも改行制御に使えるテクニックがあります。CSSが適用できない状況や、より細かい制御が必要な場合に活用しましょう。
<wbr>タグ:改行可能ポイントの挿入
<wbr>(Word Break Opportunity)タグは、その位置での改行を「許可」します。改行が不要なら無視され、行が長すぎるときにのみそこで折り返されます。
HTML – wbrタグの使用例
<!-- URLを区切り文字の後ろで改行可能にする -->
<td>
https://example.com<wbr>/api<wbr>/v2<wbr>/users<wbr>/profile<wbr>/settings
</td>
<!-- ファイルパスの区切りで改行可能にする -->
<td>
/usr<wbr>/local<wbr>/lib<wbr>/node_modules<wbr>/package
</td>
<wbr>はCSSの改行制御と違い、改行位置を意味のある場所に限定できるのが大きなメリットです。URLならスラッシュの後ろ、ファイルパスならディレクトリ区切りの後ろなど、人間が読みやすい位置で改行させることができます。
<br>タグ:強制改行
特定の位置で必ず改行したい場合は、<br> タグを使います。テーブルセル内で複数の情報を縦に並べたい場合に使用します。
HTML – brタグの使用例
<td>
田中太郎<br>
<small>tanaka@example.com</small>
</td>
ゼロ幅スペース(​)
​(ゼロ幅スペース、Zero Width Space)は、目に見えないが改行可能なポイントを作ります。<wbr>と同様の効果がありますが、HTMLタグではなく文字実体参照です。
HTML – ゼロ幅スペースの使用例
<!-- ハッシュ値を8文字ごとに改行可能にする -->
<td>
e3b0c442​98fc1c14​9afbf4c8​996fb924
</td>
注意:ゼロ幅スペースはテキストをコピーしたときにも含まれます。ユーザーがセルのテキスト(URLやコード)をコピーして使う可能性がある場合は、コピー時に問題が起きないか注意が必要です。URLにゼロ幅スペースが混入するとリンクが壊れます。
(ノーブレークスペース)
逆に、特定の位置での改行を禁止したい場合は、 (ノーブレークスペース)を使います。通常のスペースは改行可能ポイントですが、 はそこでの改行を防ぎます。
HTML – ノーブレークスペースの使用例
<!-- 数値と単位を分離させない -->
<td>100 MB</td>
<!-- 日付の途中で改行させない -->
<td>2026年 3月 6日</td>
<!-- 人名を分離させない -->
<td>John Doe</td>
HTML手法のまとめ
| 手法 |
効果 |
用途 |
コピー時の影響 |
| <wbr> |
改行を許可 |
URL、パス |
影響なし |
| <br> |
強制改行 |
セル内の区切り |
改行が入る |
| ­ |
ハイフンで分割 |
英語の長い単語 |
ハイフンが入る場合あり |
| ​ |
改行を許可(非表示) |
ハッシュ値、ID |
ゼロ幅文字が混入 |
| |
改行を禁止 |
数値+単位、人名 |
スペースとしてコピー |
レスポンシブ対応のベストプラクティス
スマートフォンやタブレットでは画面幅が狭いため、デスクトップで問題なかったテーブルの改行制御が崩壊することがあります。ここでは、レスポンシブ環境でのテーブル改行制御のベストプラクティスを解説します。
基本戦略:画面幅に応じた切り替え
最も一般的なアプローチは、メディアクエリを使って画面幅に応じて改行ルールを切り替える方法です。
CSS – レスポンシブ対応の改行制御
/* デスクトップ: 省略表示 */
table {
table-layout: fixed;
width: 100%;
}
td.url-cell {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* モバイル: 折り返し表示に切り替え */
@media (max-width: 768px) {
td.url-cell {
white-space: normal;
overflow: visible;
text-overflow: clip;
overflow-wrap: break-word;
word-break: break-all;
}
}
横スクロール方式
改行を変更する代わりに、テーブル全体を横スクロール可能にする方法もあります。データテーブルではこの方が情報の正確性が保たれます。
CSS – テーブルの横スクロール
/* テーブルをラッパーで囲む */
.table-wrapper {
overflow-x: auto;
-webkit-overflow-scrolling: touch; /* iOS慣性スクロール */
}
.table-wrapper table {
min-width: 600px; /* テーブルの最小幅 */
}
/* スクロールヒントの表示 */
@media (max-width: 600px) {
.table-wrapper::after {
content: "";
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 30px;
background: linear-gradient(to right, transparent, rgba(0,0,0,0.1));
pointer-events: none;
}
}
HTML
<div class="table-wrapper">
<table>
...
</table>
</div>
カード型レイアウトへの変換
モバイルでテーブルをカード型レイアウトに変換する方法もあります。各行を1枚のカードとして縦に積むことで、狭い画面でも全データが読みやすくなります。
CSS – カード型変換
@media (max-width: 600px) {
table.responsive-card,
table.responsive-card thead,
table.responsive-card tbody,
table.responsive-card tr,
table.responsive-card td {
display: block;
}
table.responsive-card thead {
display: none; /* ヘッダーを非表示 */
}
table.responsive-card tr {
margin-bottom: 1em;
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 12px;
}
table.responsive-card td {
padding: 4px 0;
overflow-wrap: break-word;
word-break: break-all;
}
/* data-label属性でヘッダー名を表示 */
table.responsive-card td::before {
content: attr(data-label);
font-weight: 700;
display: block;
color: #64748b;
font-size: 12px;
}
}
3つの方式の選び方
| 方式 |
メリット |
デメリット |
適した場面 |
| 改行ルール切り替え |
実装が簡単 |
データが見にくくなる場合あり |
テキスト中心のテーブル |
| 横スクロール |
レイアウトを維持 |
全体が見えない |
数値・コード中心のテーブル |
| カード型変換 |
全データが見やすい |
実装が複雑、行数が多いと長い |
行数が少ないテーブル |
実務で頻出する7つのパターンと解決法
ここまで学んだプロパティを組み合わせて、実務でよくある問題とその具体的な解決法を紹介します。コピー&ペーストですぐに使えるコードを掲載しているので、該当するパターンを見つけたらそのまま適用してください。
パターン1:URLがテーブルを押し広げる
最も頻出する問題です。API一覧や参考リンクの表で発生します。
CSS – URL列の改行制御
table {
table-layout: fixed;
width: 100%;
}
td.url {
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
}
ポイント:URL列には word-break: break-all を使います。URLは英語の文章ではないため、任意の位置での改行が最も適切です。
パターン2:日付・金額列を1行に固定する
日付や金額が途中で折り返されると、データの正確な読み取りが困難になります。
CSS – 日付・金額列の固定
td.date,
td.price {
white-space: nowrap;
text-align: right; /* 金額は右寄せが慣習 */
}
/* 列幅を固定する場合 */
col.date-col { width: 120px; }
col.price-col { width: 100px; }
パターン3:管理画面の一覧テーブルで省略表示
WordPress管理画面やダッシュボードの一覧表で、説明文やURLを省略表示します。
CSS + HTML – 管理画面の省略表示
/* CSS */
table.admin-list {
table-layout: fixed;
width: 100%;
}
table.admin-list td.title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 300px;
}
/* HTML */
<td class="title"
title="WordPressの投稿タイトルが非常に長い場合の表示テスト">
WordPressの投稿タイトルが非常に長い場合の表示テスト
</td>
パターン4:コード列の等幅表示
テーブル内にCSSプロパティ名やコマンドを表示する場合の制御方法です。
CSS – コード列の表示
td.code {
font-family: "Consolas", "Courier New", monospace;
white-space: nowrap;
font-size: 13px;
background: #f1f5f9;
padding: 2px 6px;
border-radius: 4px;
}
/* コードが長い場合はスクロールを許可 */
td.code-scroll {
max-width: 250px;
overflow-x: auto;
}
パターン5:ハッシュ値・トークン列
SHA-256ハッシュやAPIトークンなど、長い16進数文字列の表示制御です。
CSS + HTML – ハッシュ値の表示
/* 方法A: 省略表示 + ツールチップ */
td.hash {
font-family: monospace;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 200px;
}
/* 方法B: 折り返し表示 */
td.hash-wrap {
font-family: monospace;
word-break: break-all;
font-size: 12px;
}
パターン6:混在テキスト(日本語+英語+URL)
日本語の説明文の中にURLやコードが混在するケースは、最も制御が難しいパターンです。
CSS – 混在テキストの制御
td.mixed-content {
overflow-wrap: break-word;
word-wrap: break-word;
/* word-break: break-all は使わない! */
/* → 日本語部分の改行が不自然になるため */
}
/* セル内のURLだけを制御する場合 */
td.mixed-content a,
td.mixed-content code {
word-break: break-all;
}
ポイント:混在テキストでは、セル全体に word-break: break-all を適用するのではなく、URL部分(<a>タグ)やコード部分(<code>タグ)にだけ break-all を適用するのが正しいアプローチです。
パターン7:メールアドレス列
メールアドレスも長い英数字列として改行の問題を引き起こすことがあります。
CSS + HTML – メールアドレスの制御
/* CSSで折り返しを許可 */
td.email {
overflow-wrap: break-word;
word-break: break-all;
}
/* または、HTMLで@の後ろに改行ポイントを入れる */
<td>very-long-username@<wbr>example.com</td>
code要素を含むテーブルセルの制御
テーブルセル内に <code> 要素を配置するケースは技術ブログやドキュメントで非常に多いですが、code要素特有の問題があります。
code要素のデフォルトスタイルの影響
ブラウザのデフォルトスタイルでは、code要素に以下のスタイルが適用されています。
ブラウザデフォルト(User Agent Stylesheet)
code {
font-family: monospace;
/* white-space は明示的に指定されていないが、
親要素の値を継承する */
}
問題は、WordPressテーマやCSSフレームワークが code 要素に対して white-space: nowrap や white-space: pre を指定しているケースです。これにより、テーブルセル内の code 要素が意図せず改行されなくなります。
WordPressテーマでの具体的な問題
例えばCocoonテーマでは、インラインコードに対して独自のスタイルが適用されることがあります。
DevTools で確認した例
/* テーマが適用しているスタイル */
.entry-content code {
white-space: nowrap;
background: #f5f5f5;
padding: 2px 6px;
}
/* このため、テーブルセル内の長いコードが改行されない */
<td><code>background-color: rgba(255, 255, 255, 0.5)</code></td>
/* → 1行で表示され、セルが極端に広がる */
解決方法
CSS – テーブル内codeの改行制御
/* 方法A: テーブル内のcodeは改行を許可する */
td code {
white-space: normal;
word-break: break-all;
}
/* 方法B: 短いコードは1行、長いコードは折り返し */
td code {
white-space: pre-wrap;
word-break: break-all;
}
/* 方法C: 短いコードのみ改行禁止 */
td code.nowrap {
white-space: nowrap;
}
td code.wrap {
white-space: pre-wrap;
word-break: break-all;
}
ポイント:テーブル内のcode要素には pre-wrap を使うのが実務的なベストプラクティスです。空白とインデントを保持しつつ、セル幅に応じた折り返しも許可できます。
完全な実装例:実務で使えるテーブルCSS
ここまでの内容を総合して、実務でそのまま使える完全なCSS設計を紹介します。テーブルの用途に応じた3つのパターンを用意しました。
パターンA:汎用データテーブル
ユーザーデータ、商品一覧、ログ表示など、様々なデータ型が混在するテーブルに適した設計です。
CSS – 汎用データテーブル
/* ベーススタイル */
.data-table {
table-layout: fixed;
width: 100%;
border-collapse: collapse;
}
/* 全セル共通 */
.data-table td {
padding: 8px 12px;
vertical-align: top;
overflow-wrap: break-word;
word-wrap: break-word;
}
/* 改行禁止列 */
.data-table td.no-wrap {
white-space: nowrap;
}
/* 強制改行列(URL、ハッシュ等) */
.data-table td.force-wrap {
word-break: break-all;
}
/* 省略表示列 */
.data-table td.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* コード列 */
.data-table td.code {
font-family: monospace;
font-size: 13px;
white-space: pre-wrap;
word-break: break-all;
}
パターンB:API仕様書テーブル
API一覧やコマンドリファレンスなど、コード要素が多いテーブル用の設計です。
CSS – API仕様書テーブル
.api-table {
table-layout: fixed;
width: 100%;
border-collapse: collapse;
}
/* エンドポイント列: 折り返し */
.api-table td.endpoint {
font-family: monospace;
word-break: break-all;
font-size: 13px;
color: #0369a1;
}
/* メソッド列: 改行禁止 */
.api-table td.method {
white-space: nowrap;
font-weight: 700;
text-transform: uppercase;
}
/* 説明列: 通常の改行 */
.api-table td.description {
overflow-wrap: break-word;
}
パターンC:レスポンシブ対応テーブル
デスクトップでは通常表示、モバイルでは横スクロールに切り替わるテーブルです。
CSS – レスポンシブ対応テーブル
/* ラッパー */
.responsive-table-wrapper {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
/* テーブル本体 */
.responsive-table-wrapper table {
table-layout: fixed;
width: 100%;
min-width: 640px;
border-collapse: collapse;
}
.responsive-table-wrapper td {
padding: 8px 12px;
overflow-wrap: break-word;
}
/* スクロールが必要なときの視覚的ヒント */
@media (max-width: 640px) {
.responsive-table-wrapper {
position: relative;
}
.responsive-table-wrapper::after {
content: "→ スクロール";
display: block;
text-align: right;
font-size: 12px;
color: #94a3b8;
padding: 4px 0;
}
}
ポイント:実務では、パターンAの「汎用データテーブル」をベースに、列ごとに必要なクラスを付与するアプローチが最も管理しやすいです。すべてのセルに同じ改行ルールを適用するのではなく、データの種類に応じて列単位で制御しましょう。
よくあるトラブルと解決方法
テーブルの改行制御で発生しやすいトラブルと、その原因・解決方法をまとめます。「設定したはずなのに効かない」という場合は、このセクションを順にチェックしてください。
トラブル1:overflow-wrap: break-word が効かない
症状:overflow-wrap: break-word を指定しても、長い文字列がセルからはみ出す。
原因:table-layout: auto のままになっている。
修正方法
/* NG */
table { width: 100%; }
td { overflow-wrap: break-word; }
/* OK */
table {
width: 100%;
table-layout: fixed; /* これを追加 */
}
td { overflow-wrap: break-word; }
トラブル2:text-overflow: ellipsis が表示されない
症状:省略記号(…)が表示されず、テキストが普通に折り返されるか、はみ出す。
原因:3つの必須プロパティのいずれかが欠けている。
| チェック項目 |
必要な値 |
欠けた場合 |
| white-space |
nowrap |
テキストが折り返されて省略が不要になる |
| overflow |
hidden |
テキストがはみ出して見えてしまう |
| text-overflow |
ellipsis |
はみ出し部分がぶつ切りになる |
| table-layout |
fixed |
セル幅が内容に合わせて広がる |
| width(tableに) |
100%等の明示値 |
table-layout: fixed が正しく動作しない |
トラブル3:特定のブラウザでだけ改行されない
症状:Chromeでは問題ないが、SafariやFirefoxで改行されない(またはその逆)。
原因:ブラウザごとの改行アルゴリズムの違い。
CSS – クロスブラウザ対応の安全な指定
td {
/* 全ブラウザで確実に動作する組み合わせ */
overflow-wrap: break-word;
word-wrap: break-word; /* 旧ブラウザ対応 */
word-break: break-word; /* Chrome/Safari向け(非標準だが効果あり) */
-ms-word-break: break-all; /* IE対応(必要な場合のみ) */
}
トラブル4:テーマのCSSが優先されて上書きできない
症状:自分で書いたCSSが適用されず、テーマのスタイルが優先される。
原因:CSSの詳細度(Specificity)が負けている。
CSS – 詳細度を上げる方法
/* テーマのスタイル(詳細度: 0,0,2,1) */
.entry-content table td {
white-space: nowrap;
}
/* 自分のスタイル: より具体的なセレクタを使う(詳細度: 0,0,3,1) */
.entry-content table.my-table td {
white-space: normal;
overflow-wrap: break-word;
}
注意:!important は最終手段です。使うとメンテナンス性が大幅に低下するため、まずはセレクタの詳細度を上げることで対処しましょう。CSSの読み込み順序(子テーマのstyle.cssが後に読み込まれる)も活用できます。
トラブル5:table-layout: fixed で列幅が均等になってしまう
症状:fixed に変えたら、すべての列が同じ幅になってしまった。
原因:列幅を指定していない場合、fixed レイアウトではテーブル幅を列数で均等割りする。
HTML + CSS – 列幅を個別に指定
<!-- colgroup で列幅を指定 -->
<table class="data-table">
<colgroup>
<col style="width: 60px;"> <!-- ID -->
<col style="width: 25%;"> <!-- 名前 -->
<col> <!-- URL(残り幅) -->
<col style="width: 100px;"> <!-- 日付 -->
</colgroup>
...
</table>
トラブル6:CSSグリッド・フレックスボックス内のテーブルで改行が効かない
症状:display: grid や display: flex の子要素としてテーブルを配置すると、改行制御が効かなくなることがある。
原因:グリッドやフレックスのアイテムは、デフォルトで min-width: auto が適用され、コンテンツの最小幅以下に縮小されない。
CSS – グリッド・フレックス内のテーブル修正
/* グリッドアイテムとしてのテーブルラッパー */
.grid-container {
display: grid;
}
.table-wrapper {
min-width: 0; /* これが重要! */
overflow: hidden; /* または overflow-x: auto */
}
/* フレックスアイテムの場合も同様 */
.flex-container {
display: flex;
}
.flex-container .table-wrapper {
min-width: 0; /* min-width: auto を上書き */
}
ポイント:min-width: 0 はグリッド・フレックスレイアウト内でのオーバーフロー問題を解決する最も重要なテクニックの一つです。テーブルに限らず、長いテキストやコードがはみ出す場合に有効です。
CSSプロパティ クイックリファレンス
最後に、この記事で解説したすべてのCSSプロパティを一覧表にまとめます。テーブルの改行制御で迷ったときの早見表として活用してください。
| プロパティ |
主な値 |
テーブルでの効果 |
table-layout: fixed が必要 |
| white-space |
normal / nowrap / pre-wrap |
折り返しの有無を制御 |
不要 |
| word-break |
normal / break-all / keep-all |
単語途中の分割を制御 |
不要 |
| overflow-wrap |
normal / break-word / anywhere |
はみ出し時の改行を制御 |
推奨 |
| table-layout |
auto / fixed |
列幅の計算方法を制御 |
– |
| text-overflow |
clip / ellipsis |
はみ出しテキストの表示 |
必須 |
| overflow |
visible / hidden / auto |
はみ出し部分の表示制御 |
– |
| hyphens |
none / manual / auto |
ハイフネーションの制御 |
不要 |
用途別おすすめ組み合わせ
| やりたいこと |
CSS指定 |
| セルの改行を完全に禁止 |
white-space: nowrap |
| 長いURLを折り返す |
table-layout: fixed + word-break: break-all |
| はみ出す場合のみ折り返す |
table-layout: fixed + overflow-wrap: break-word |
| 省略記号(…)で切り詰める |
table-layout: fixed + nowrap + overflow: hidden + text-overflow: ellipsis |
| 英単語をハイフンで分割 |
hyphens: auto(lang属性必須) |
| コードの空白を維持して折り返す |
white-space: pre-wrap + word-break: break-all |
| 日本語の文字間改行を禁止 |
word-break: keep-all |
よくある質問(FAQ)
Q. word-break と overflow-wrap、どちらを使うべき?
A. 基本的には overflow-wrap: break-word を推奨します。overflow-wrap は「はみ出す場合のみ」改行するため、通常のテキストの可読性を損ないません。word-break: break-all は、URL・ハッシュ値・トークンなど、英数字のみのデータ列に限定して使いましょう。両者の違いを一言で言えば、overflow-wrap は「防御的」、word-break: break-all は「積極的」な改行です。
Q. table-layout: fixed を使うと、列幅をデータに合わせて自動調整できなくなる?
A. はい、table-layout: fixed では列幅は内容に基づかず、colgroup/col の width か、最初の行のセル幅で決まります。幅が指定されていない列は均等割りになります。これは制約ですが、<col> 要素で列ごとに幅をパーセンテージやピクセルで指定すれば、データの性質に合った列幅設計が可能です。
Q. white-space: nowrap を使ったら、テーブルが画面からはみ出しました
A. nowrap は改行を完全に禁止するため、テーブルの外側にはみ出す可能性があります。対策は3つあります。
- overflow: hidden + text-overflow: ellipsis で省略表示にする
- テーブルを <div style=”overflow-x: auto”> で囲んで横スクロール可能にする
- max-width を指定してセルの最大幅を制限する
Q. スマートフォンではどうすればいい?
A. スマートフォンでは以下の順に検討しましょう。
- メディアクエリで改行ルールを切り替える(最も簡単)
- テーブルを横スクロール可能にする(データの正確性を優先)
- カード型レイアウトに変換する(ユーザビリティを優先)
どの方法が最適かは、テーブルの用途とデータの重要性によります。データの正確性が重要なら横スクロール、一覧性が重要ならカード型が適しています。
Q. WordPressのブロックエディタ(Gutenberg)でもCSSは適用できる?
A. はい、適用できます。ブロックエディタのテーブルブロックには「追加CSSクラス」を設定できるので、そこにクラスを指定し、テーマの子テーマの style.css にCSSを記述すれば適用されます。
Q. CSSではなく、JavaScriptで改行を制御する方法はある?
A. 可能ですが、CSSで対応できる場合はCSSを推奨します。JavaScriptを使う場合は、テキストに <wbr> やゼロ幅スペースを動的に挿入する方法があります。大量のデータを処理する場合や、バックエンドから返されるデータに改行ポイントを追加したい場合に有用です。
まとめ
テーブル内の改行制御は、一見シンプルに見えて奥が深いテーマです。この記事の内容を振り返りましょう。
この記事のまとめ
- 改行の仕組み:ブラウザは「改行可能ポイント」を探して折り返す。英数字の連続やURLには改行可能ポイントがないため、セルを押し広げる
- white-space:改行の有無を制御する最も基本的なプロパティ。nowrap で改行禁止、pre-wrap で空白保持+折り返し
- word-break:単語途中での分割を制御。break-all は強力だが英文の可読性を損なう。URLやハッシュ値に限定して使う
- overflow-wrap:はみ出し時のみ改行。break-word が最も汎用的な選択肢。table-layout: fixed と組み合わせる
- table-layout:fixed にすることで、overflow-wrap や text-overflow が正しく動作する。改行制御が必要なテーブルでは fixed を選ぶ
- text-overflow:省略記号(…)で切り詰め。3点セット(nowrap + hidden + ellipsis)を忘れない
- hyphens:英語テキストのハイフネーション。lang属性が必須
- HTML手法:<wbr>、­、ゼロ幅スペースで細かい改行位置を制御
- レスポンシブ:メディアクエリでの切り替え、横スクロール、カード型変換の3パターン
- 実務のコツ:すべてのセルに同じルールを適用するのではなく、列ごとにデータの性質に応じた改行ルールを設計する
テーブルの改行制御で最も大切なのは、「どの列にどんなデータが入るか」を最初に定義し、データの性質に応じた改行ルールを列単位で設計することです。場当たり的に CSS を追加するのではなく、テーブル設計の段階から改行制御を意識することで、どんなデータが入っても崩れない堅牢なテーブルを構築できます。
この記事で紹介した知識とパターンを活用して、読みやすく安定したテーブルを実装してください。