一般社団法人 全国個人事業主支援協会

COLUMN コラム

先日、とある社内システムのテストをしていたら、テーブル内の折り返しがうまく機能しない事象が発生したので、その解決方法を備忘録的にこちらに投稿しておきます。

動作環境(ブラウザ)

私がテストしていた環境はIE5でしたが、念のため、以下の環境でも同様に動作することを確認しています。

  • IE11
    ※今回のキャプチャにはIE11を使用しています。
  • Chrome81

事象

日本語を入力したときはちゃんと折り返されるのに、、、

日本語で折り返される例

英数字を入力したら折り返されませんでした。。。

英数字で折り返されない例

ソース

問題のソースを簡易的に書いたものがこちらです。

<html>
<head>
<title>折り返し検証</title>
<style type="text/css">
table {
    word-wrap: break-word;
}
</style>
</head>
<body>
<table border="1" width="600px">
<tr></tr>
<tr>
    <th width="100px">aaa</th>
    <td>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td>
</tr>
<tr>
    <th width="100px">bbb</th>
    <td>いいい</td>
</tr>
<tr>
    <th width="100px">ccc</th>
    <td>ううう</td>
</tr>
</table>
</body>
</html>

「”word-wrap: break-word;“が書いてあるのになぜ……?」という感じでした。

table-layout: fixed; にしないとword-wrap: break-word; は利かない

テーブル内の折り返しがしっかりとできている画面もあったので、その画面と問題の画面を必死に見比べたところ、原因は「table-layout: fixed;」のあるなしであることがわかりました。

表示範囲におさまらない長い文字列を改行させる「word-wrap: break-word;」は、テーブルでは「table-layout: fixed;」が指定されていないと機能しないようです。

さらに、テーブルの表示方法を指定する「table-layout」はデフォルト値が「auto」であるため、「table-layout」が何も指定されていない今回のソースでは、「table-layout: auto;」が指定されていることになってしまいます。(それで、「width」の指定とかも無視されてしまっていたんですね。。。)

そのため、以下のようにして、明示的に「table-layout: fixed;」を指定してあげる必要があります。

<style type="text/css">
table {
    word-wrap: break-word;
    table-layout: fixed;          <!-- table-layoutを指定 -->
}
</style>

その結果がこちらです。

セルが等間隔で折り返されている例

おや?……なぜか、セルが等間隔に……

無駄なソースは書いてはいけない!

当たり前のことですが、意味をなさない無駄なソースは書いてはいけません

今回のソースですが、よく見てみると、tableタグの下に謎のtrタグがありました

<table border="1" width="600px">
<tr></tr>          <!-- ←これ -->
<tr>
    <th width="100px">aaa</th>
    <td>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td>
</tr>

「table-layout: fixed;」を指定すると、幅が指定されていないセルは等間隔で表示されてしまいます。

そのため、幅の指定されていないtrタグが一番初めにあることによって、後ろのwidthの指定が無効化されてしまっているようです。

では、無駄なtrタグを消してみましょう。

<table border="1" width="600px">
<!-- <tr></tr> 無駄無駄無駄無駄 -->
<tr>
    <th width="100px">aaa</th>
    <td>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</td>
</tr>

正しい折り返し

無事にセルの幅も問題なく、折り返されたテーブルになりました。

word-wrapと一緒にoverflow-wrapも指定したほうがいい

先ほどの修正で結果としては問題ないのですが、word-wrapは古いプロパティのようで、現在ではoverflow-wrapに改名されています

社内システムのように決まったブラウザからしか使用されないのであれば、word-wrapプロパティのみで問題ないかもしれませんが、様々なブラウザから使用されることが予想されるシステムの場合は、word-wrapと一緒にoverflow-wrapも記述しておいたほうが無難です。

<style type="text/css">
table {
    word-wrap: break-word;
    overflow-wrap : break-word;          <!-- word-wrapと併記する -->
    table-layout: fixed;
}
</style>

まとめ

テーブル内の折り返しから少し派生しましたが、今回学んだことをまとめると以下のようになります。

  • word-wrap: break-word; を指定するときは table-layout: fixed; も忘れずに記述する。
  • 無駄なものは書かない。

(人が作ったものを直すのって大変ですよね。。。)

この備忘録が誰かのお役に立てば幸いです。

参考

The following two tabs change content below.

sawada

2011年からIT業界で働いています。 主にJavaを使ったWebシステム開発をやってきました。 2020年3月からフリーランスエンジニアに転向しました。

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア