単語の折り返し処理

折り返し?

ホワイトスペース, ハイフン, クエスチョンマークなどが代表的な区切り

基本は単語区切りで折り返す、長いテキストは折り返さない(折り返せない)

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. https://hoge.com/k35406f3069020%202%2232975%22%2C20%223297622%2020f89954%20%3E%3D%20%221%22

レイアウトやデザインが崩れるので、奇麗に折り返したい

長いテキストも折り返えす

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. https://hoge.com/k35406f3069020%202%2232975%22%2C20%223297622%2020f89954%20%3E%3D%20%221%22

3つのプロパティ

word-break

改行に関する禁則処理の方法を指定する

IE Chrome Safari Firefox
normal, break-all
keep-all
normal デフォルト、単語中は改行されない(CJKの単語には適用されない)
break-all 単語中でも改行する(CJKの単語には適用されない)
keep-all CJKの単語も含めて単語中は改行されない

break-all を指定すると "consectetuer" が改行されています

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. https://hoge.com/k35406f3069020%202%2232975%22%2C20%223297622%2020f89954%20%3E%3D%20%221%22

keep-all は対応ブラウザが少ないのと、単語の解釈が難しいのでまだ実用的はないかなと

word-wrap (overflow-wrap)

文字列が長すぎてボックス要素に収まらない場合、単語の途中での改行を行うかどうかを指定する

IEの拡張プロパティ、現在の草案では overflow-wrap に改名されているので注意が必要

IE Chrome Safari Firefox
normal デフォルト、単語の分割位置でのみ改行する
break-word 文字列が長く、ボックス要素に収まらない場合、単語の途中での改行する

break-word を指定すると "consectetuer" は改行されず、URLのみ改行されます

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. https://hoge.com/k35406f3069020%202%2232975%22%2C20%223297622%2020f89954%20%3E%3D%20%221%22

hyphens

ブラウザが改行候補位置をどのように処理するかを指定する

改行候補位置とはテキスト中で改行が可能な位置をハイフン(­)などを利用して指定した位置

IE Chrome Safari Firefox
ベンダープレフィックスが必要 10~
none 改行候補位置があっても改行されない
manual 改行候補位置でのみ改行される
auto lang 属性で指定された言語により、ブラウザのハイフネーション規則に従い自動的に単語を改行する。
改行候補位置は、可能であれば改行位置として選択されます。

"con­sectetuer" に改行位置を指定 "con­sectetuer", hyphens:manual;

hyphens:manual; では ­ が "-" で表示され改行されます

Lorem ipsum dolor sit amet, con­sectetuer adipiscing elit. Aenean commodo ligula eget dolor.

hyphens:none; では ­ は何も表示されす、単語中は改行されません

Lorem ipsum dolor sit amet, con­sectetuer adipiscing elit. Aenean commodo ligula eget dolor.

上手く折り返されない?

文字列が長すぎてボックス要素に収まらない...とあるようにボックス要素の横幅が折り返しの基準になります

inline-block や table-cell要素は、内容によりの幅が決まることがあるので、 "ボックス要素に収まらない" という判断ができなく、折り返しされないように見えることがあります

width や max-width プロパティを利用して auto 以外の値、ボックスの最大の幅を指定すると折り返されるようになると思います

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. https://hoge.com/k35406f3069020%202%2232975%22%2C20%223297622%2020f89954%20%3E%3D%20%221%22

何で折り返される?

IE では、word-wrap: break-word が指定(継承)されていると white-space: nowrap; text-overflow: ellipsis; が効きかず折り返されてしまいます

その場合 word-wrap: normal; を指定すると省略表示されるようになると思います

word-break: break-word;?

Compass Mixins word-break("break-all") の出力

break-word は標準の値ではありません、元は webkit 向けのものです

Firefox の折り返し(デフォルトで自動折り返しがある)をハックするための指定みたいです

まとめ

  • overflow-wrap(word-wrap), break-word, hyphens どれもまだ草案なので w3c を watch してましょう
  • Compass 使えるなら Mixins word-break(value) 使え
  • @include word-break(value) 使いたくないなら 自分で placeholder selector 作れ
  • 細かいこと気にしないなら word-wrap: break-word; だけでいいんじゃない

参考