半角英数が連続した文字(例えばURLや、ハッシュ値など)を表示すると、枠からはみ出てしまう事があります。
その対策として、
1 |
word-wrap: break-word; |
と、
1 |
word-break: break-all; |
があります。
どっちも、連続した半角英数文字を折り返すかどうか。を指定するのですが、いったいどう違うんでしょう?
ってことで、整理。
word-wrap: break-word と word-break: break-all の違い
word-wrap: break-word; は、枠内に収まらない英単語の場合は単語の途中でも折り返しますが、 枠内に収まる限り、単語の途中では折り返さないようにします。
なので、たとえば、forという短い単語なら、よほど狭い枠でなければ、途中で折り返されることはありません。
一方、word-break: break-all; は、英単語の途中であっても、問答無用で折り返します。なので、右端でforのような短い単語の途中であっても、
fo
r
というように、折り返してしまいます。
とうことで、どちらかというと、単語が切れてしまわない、word-wrap: break-word;を使ったほうがいいんじゃないか、ということになります。こんなかんじで。
1 2 3 4 |
body { word-wrap: break-word; overflow-wrap: break-word; } |
と、ここで突然登場したoverflow-wrapですが、
これはword-wrapの別名でして、CSS3で採用される可能性があるそうなので、word-wrapと併記したほうがいいらしいです。
word-wrap: break-word が機能しない
でも、どういうわけか、th要素とか、td要素、display:table-cell指定要素などの中では、word-wrap が効かないことがあります。
1 2 3 4 |
<table><tr> <td style="word-wrap: break-word;"> eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</td> <td style="word-wrap: break-word;">aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd</td> </tr></table> |
↓こんな感じで、枠からはみ出てしまいます。
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee |
aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd |
なんでそんなことになるかというと、table-cell要素は、要素内に合わせてサイズが決まるため、どこで折り返すか決められない、ということのようです。
つまり、『幅に合わせて折り返す』と、『内容に合わせて幅を決める』、という2つの機能が、矛盾というか、どっちつかずになってしまう。という。
で、こんどは word-wrapではなく、word-break: break-all; をtd要素に指定してやると。
1 2 3 4 |
<table><tr> <td style="word-break: break-all;">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</td> <td style="word-break: break-all;">aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd</td> </tr></table> |
すんなり折り返すようになります。
↓連続文字中でも折り返されてます。
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee |
aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd |
word-break: break-all; は、単語の途中でも気にすることなく折り返せばいいので、OKということなんでしょうか。
じゃ、「word-break: break-all;は英単語の途中で折り返されるので使いたくない。thやtd要素でもword-wrapを使いたい!」というときはどうすればいいか、というと、こんな感じ。
1 2 3 4 |
<table style="table-layout: fixed;"><tr> <td style="word-wrap: break-word;"> eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</td> <td style="word-wrap: break-word;">aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd</td> </tr></table> |
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddddd |
table要素に、table-layout: fixed; を指定してやればいいみたいです。
ただし、table-layout: fixed; を指定すると、枠幅が自動調整されないので、widthを指定してやらないといけない場合もあります。
word-wrap を有効にしたかったら、その枠幅をはっきりさせてね。ってことですね。
参考になりました↓
https://w3g.jp/blog/confusing_word-break_word-wrap