CSSのoverflow-wrapとword-breakの違いを解説!
CSSのoverflow-wrap(旧名word-wrap)とword-breakプロパティは両者ともボックスをはみ出た部分に対して改行を入れるかどうかを制御できますが、両者の違いをサンプルコード付きで解説していきます。
コンテンツ [表示]
- 1CSSのoverflow-wrapとword-breakは混乱する
- 1.1word-wrapに関して
- 2CSSのoverflow-wrapとword-breakの違い
- 2.1overflow-wrap
- 2.2word-break
- 2.3一旦まとめ
- 3CSSのword-breakで設定できる値
- 3.1word-break: normal;
- 3.2word-break: keep-all
- 3.3word-break: break-all;
- 3.4word-break: break-word;
- 4CSSのoverflow-wrapで指定できる値
- 4.1overflow-wrap: normal;
- 4.2overflow-wrap: break-word;
- 5CSSのoverflow-wrapとword-breakを同時指定した場合
CSSのoverflow-wrapとword-breakは混乱する
CSSのoverflow-wrap
やword-break
やword-wrap
のような折り返しや改行を制御するプロパティは複数あり、それぞれがどういう意味なのか分かりづらく混乱している方も多いかと思います。
そこで今回はoverflow-wrap
とword-break
の違いを解説していきたいと思います。
word-wrapに関して
まずword-wrap
プロパティに関してですが、このプロパティはMicrosoft拡張のプロパティでしたが、標準化と改名がされ、overflow-wrap
という名称に変更されています。
overflow-wrap
とword-wrap
は互換性があり、word-wrap
でも現在利用可能で、古いブラウザへの対応を行うならむしろword-wrap
の方が良い場合もあります。
今回は改名後のoverflow-wrap
として解説していきます。
CSSのoverflow-wrapとword-breakの違い
まずはoverflow-wrap
とword-break
のそれぞれの目的を見ていきましょう。
- overflow-wrap: 分割できない文字列がボックスからはみ出る場合に、単語内で分割できるかどうかを指定。
- word-break: 単語内で分割する方法(または分割するかどうか)を指定。
何ともややこしいですが、もう少し噛み砕いて見ていくと
- overflow-wrap: ボックスからテキストがはみ出た場合(オーバーフロー時)にどうするか決める
- word-break: 単語を改行しないとテキストがあふれる場合に改行するか決める
つまり見ている視点が
overflow-wrap
はボックスの視点から見てテキストがあふれた時にどうするか、word-break
はテキストの単語の視点で見てボックスから突き抜けるか改行を入れるか、と別の意味で解釈出来ます。一旦それぞれを別にして考えて意味を解釈してみましょう。
(厳密よりもわかりやすさ優先で見ていきます)
overflow-wrap
word-break
一旦まとめ
何ともややこしいoverflow-wrap
とword-break
ですが、両者ともはみ出た場合に改行するかどうかを制御しているプロパティであることは共通です。
ただし、はみ出たと判断するのがボックス視点からかテキストの単語からの視点というところが異なります。
改行を入れるかどうかを指定するのは両者とも可能なため、いずれのプロパティを指定しても単語のはみ出た部分をどうするかは制御することが出来ます。つまりテキストがはみ出ているのを見つけたらoverflow-wrap
でもword-break
でも、どちらを使っても解決可能です。
ただプロパティとして別々に存在しているため、overflow-wrap
もword-break
も同時に指定する事が可能になります。
それでは次の章でそれぞれのプロパティで設定できる値とその挙動を見ていきましょう。
CSSのword-breakで設定できる値
word-break: normal;
[日本語・中国語・韓国語の場合]
表示範囲にあわせて改行される。
[英語等]
単語の途中では改行されず、単語の切れ目(スペース区切りなど)で改行される。
つまりサンプルコードで見ると下記となります。
英語の場合は長い単語の場合でも単語の途中で改行が入ることはなく、そのままボックスをはみ出します。
一方で日本語(カタカナ)の場合は単語の途中であっても改行が入り枠内に収まっています。
このword-break: normal
はデフォルト値のため、特に何もしていないサイトでは
- 英単語:ボックス突き抜ける
- 日本語:ちゃんと改行されて収まっている
word-break: keep-all
言語問わず単語の途中で改行はされず、単語の切れ目で改行される。つまり長い単語であればはみ出ることもある。
word-break: keep-all
は言語問わず単語の途中で改行されることはないため、英語であろうが日本語でも単語は改行されず、長い単語はボックスをはみ出します。
word-break: break-all;
言語問わず表示範囲に合わせて改行される。つまり単語の途中でも改行されることがある。
word-break: break-all;
が設定されると言語問わずボックスの中に収まるように、単語途中であろうと強制的に改行されます。つまり禁則処理が解除され、単語のどこでも改行される形になります。
※ブラウザによっては禁則処理が残る場合もあり
word-break: break-word;
word-break
のプロパティで紹介する最後の値がbreak-word
ですが、上記のサンプルコードではこのプロパティと他のプロパティでの表示を比べてみました。
break-word
は、break-all
のように英語・日本語の単語の途中でも改行が入っているのがわかるかと思います。また括弧の始まりが行頭に来ていることからも禁則処理としてはbreak-all
より強くword-break: normal
に近い性質を持っているようです。
CSSのoverflow-wrapで指定できる値
overflow-wrap: normal;
overflow-wrap: normal
は初期値で、word-break: normal
と同じ挙動です。
英単語では単語の区切り位置でのみ改行されるため、長い単語はボックスを突き抜けます。日本語は単語途中でも改行され、ボックス内に収まります。
overflow-wrap: break-word;
overflow-wrap: break-word
はword-break: break-word
と同じ挙動です。可能な限り禁則処理を残しつつ、英語・日本語問わずボックスに収まるように単語途中でも改行が入ります。
CSSのoverflow-wrapとword-breakを同時指定した場合
それでは最後の見ていきたいのがoverflow-wrap
とword-break
を同時指定するとどうなるのでしょうか?
上記のサンプルコードを見る限り、overflow-wrap
であろうとword-break
であろうと単語途中で改行させる値(break-word
)があると、改行させるルールが強く働きボックス内に収めようと単語途中で改行が入ります。この時にword-break
でkeep-all
を指定していてもoverflow-wrap
でbreak-word
がある場合は効かない事になります。
一方でword-break: keep-all
とoverflow-wrap: normal
の組み合わせではkeep-all
の方の設定も有効となり、日本語でも単語の途中で改行されずボックスをはみ出ているのが確認出来ます。
まとめるとword-break
とoverflow-wrap
の組み合わせで設定しても
- いずれかで単語途中でも改行させる値(break-●●)があれば、単語途中で改行が入る
- overflow-wrap側に単語途中で改行させる値がなければ、
keep-all
などword-break
のプロパティの値が有効になる