目的
Flexbox の中の要素に関して、長い英単語などが含まれるときに強制的に折り返しをさせたい。但し、1単語が1行に収まらないときのみにしたいです。
現状
word-break: break-word;
… 非標準だがMDNには記載ありword-wrap: break-word;
… 標準(互換性のためoverflow-wrap
と併用)overflow-wrap: break-word;
… 標準(互換性のためword-wrap
と併用)
とりあえずこの3つと min-width: 0;
を記載していますが、word-break: break-word;
だけ効いて、ほかが全く効いていないように見えます。
- これは何故でしょうか?
- 非標準な解決策に見えるので、可能であれば標準的な解決策が知りたいです。
リンク
BASE64エンコードしたものも貼ってあります↓
(teratailには10000文字までしか入りませんでした)
Stylelint did not report word-break: break-word
as invalid value · Issue #2907 · stylelint/stylelint
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
原因
この問題の主な原因は、flex アイテムの配置方法 (align-items
プロパティ) です。flex アイテムに設定されるmin-width
プロパティの初期値とは関係がありません。
align-items
プロパティを指定しない状態では、 flex アイテムの幅が flex コンテナの幅に合う (width: 100%
みたいな感じ) ように動作します。そのため、 flex アイテムの子要素である長い URL にも、うまく折り返しが行われます (見本) 。
HTML
1 2<div class="box1"> 3 <div class="box2">texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext</div> 4</div>
CSS
1.box1 { 2 display: flex; 3 flex-direction: column; 4 border: 3px solid yellow; 5 align-items: stretch; /* 初期値なので指定しなくても良い。 */ 6} 7.box1 .box2 { 8 border: 3px solid green; 9 overflow-wrap: break-word; 10} 11
しかし、初期値以外の値を指定すると、 flex アイテムの幅はアイテム内のコンテンツの幅となり、整列されます。そのため、overflow-wrap
プロパティは折り返しをすることなく、長い URL は flex コンテナからはみ出します (見本) 。対して、word-break
プロパティは flex コンテナからはみ出そうになると、強制的に改行するので、質問文のような現象が起こります (たぶん) 。
CSS
1.box1 { 2 display: flex; 3 flex-direction: column; 4 border: 3px solid yellow; 5 align-items: start; /* 初期値から変更。 */ 6} 7.box1 .box2 { 8 border: 3px solid green; 9 overflow-wrap: break-word; 10}
解決策
width
, max-width
プロパティを指定し、 flex アイテムにalign-items: stretch
と同じ役割を設定することで、overflow-wrap
プロパティは折り返しを行うようになります。
上記のことから、質問文のコードを修正すると、このようになります (コードが長かったので CodePen に上げました) 。
コメントへの返信
横方向 Flex で
min-width: 0;
が効くのに 縦方向 Flex でmin-width: 0;
が効かない点だけイマイチしっくりこない
回答文の最初のほうにも書いたとおり、「縦方向 Flex」で単語がはみ出す原因に、min-width
プロパティは一切関係がありません。
flex-direction: row;
と、flex-direction: column
, align-items: start
を設定したときの2つの場合で、なぜ長い単語がはみ出るのかを以下に追記します。
flex-direction: row;
の場合
min-width
プロパティの値が flex アイテムの内容 (折り返しを考慮しない時の単語の長さ) になり、これがflex-basis
プロパティの値よりも優先して適用されるため、はみ出します。
このとき、min-width: 0;
を設定すると、最小横幅の制約がなくなり、flex-basis
プロパティの初期値が適用されます。その結果、 flex アイテムは flex コンテナの幅に合わせて伸縮するようになります。
flex-direction: column
, align-items: start
の場合
flexbox 特有の最小幅による制約は、主軸にかかります。今回考えている横幅方向は交叉軸のため、min-width: auto;
の値は、 flexbox 特有のものとは別の算出値 (たぶん0
) となります。そのため、min-width
プロパティは、はみ出してしまう問題と無関係だとわかります。
交叉軸における幅は、** flex アイテムの内容により決まります**。 (恐らく、このときにword-wrap
プロパティによる単語の折り返しが、考慮されていません。) そのため、交叉軸における幅(今回はwidth
プロパティの値)は、折り返しを考慮しない時の単語の長さとなり、 flex コンテナをはみ出します。 (ここで、もしもalign-items: stretch;
を設定していれば、** flex アイテムの交叉軸における幅は flex コンテナと同じ幅になる**ため、長い単語がはみ出すことはありません。)
このとき、width
, max-width
プロパティを使い、設定された横幅を上書きするか、 flex コンテナ以下の最大横幅値を設定することで、 flex アイテムが flex コンテナからはみ出さなくなります。
投稿2018/11/26 09:38
編集2018/12/15 20:12総合スコア14731
0
flex 絡みのバグを踏んでいる気がしないでもないですね。
確認手順
.NotificationCard__Body-sc-1xrzbu5-10
のword-break
を外す(→はみ出るようになる).NotificationCard__RightColumn-sc-1xrzbu5-2
のdisplay
を全部外す(→まだはみ出ている).NotificationCard__Container-sc-1xrzbu5-0
のdisplay
も全部外す(→収まるようになる)
投稿2018/11/25 09:58
総合スコア1610
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
仕様上の理由はわかりませんが、原因となる箇所はわかるかと思います。
(HTML構造をいまいち理解していないので変更することによって他に影響がでるかもしれませんが....)
まず単純な構造で word-break
、word-wrap
、overflow-wrap
の挙動を確認しました。
https://codepen.io/b7968/pen/yQENMB
親クラスに min-width:0;
を指定するという謎仕様がありますが、指定することで改行されました。
記述しているCSSプロパティの下記を変更すれば、おそらく word-break
、word-wrap
、overflow-wrap
のそれぞれの指定で改行されるかと思います。
追記
chromeでしか確認してません...
要因となるプロパティは親クラスにあたる .bw0sYo
に指定している align-items: flex-start;
のようですね。
このプロパティを外すと改行されるようになりますね。
投稿2018/11/25 13:14
編集2018/11/25 14:23総合スコア253
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
word-break: break-word; が効いて word-wrap: break-word; overflow-wrap: break-word; が効かない場合とは?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/26 13:11 編集
2018/12/13 15:59
2018/12/13 19:04
2018/12/15 19:14 編集
2018/12/16 08:39