
CSSのwhite-space: nowrap;
やwhite-space: pre;
を使用すると、テキストが折り返されずに表示されます。しかし、Flexbox や CSS Grid のレイアウト内でこのような要素を含むと、コンテナの幅を超えてレイアウトが崩れることがあります。本記事では、そのような問題が発生する原因と対処法について解説します。
レイアウトが崩れる現象の確認
まずは、レイアウトが崩れる現象を確認していきます。Flexbox、CSS Grid ともに、サイドバーが 30% で、残りの幅がメインカラムというレイアウトを想定しています。
.flex {
display: flex;
gap: 15px;
}
.flex .main {
flex-basis: calc(70% - 15px);
}
.flex .sidebar {
flex-basis: 30%;
}
.grid {
display: grid;
grid-template-columns: 1fr 30%;
gap: 15px;
}
pre {
max-width: 100%;
color: #fff;
background: #222;
overflow: scroll;
}
このレイアウトで、中のpre
要素にwhite-space: wrap;
とwhite-space: pre;
を指定した場合の比較が以下のサンプルです。
See the Pen Untitled by YUTSUZO (@YUTSUZO) on CodePen.
white-space: pre;
が指定されている方は、サイドバーの幅が縮んだり、はみ出してしまっているのが確認できます。これは、pre
要素にmax-width: 100%;
やoverflow: scroll;
が指定されていても発生します。
レイアウトが崩れる原因
このような現象は、Flexbox や CSS Grid の子要素であるflex
アイテムやgrid
アイテムが、デフォルトでmin-width: auto;
となっているため起こります。
レイアウトが崩れる場合の対処法
Flexbox や CSS Grid で、nowrap
やpre
の影響でレイアウトが崩れる場合、そのような要素を含むflex
アイテムもしくはgrid
アイテムにmin-width: 0;
を指定することで解決できます。
今回の場合、pre
要素が含まれているのは.main
なので、以下のようにスタイルを追加します。
.main {
min-width: 0;
}
以下は、.main
にmin-width: 0;
を追加した場合のサンプルです。
See the Pen Untitled by YUTSUZO (@YUTSUZO) on CodePen.
Flexbox、CSS Grid ともに、レイアウトの崩れがなくなったのが確認できます。
まとめ
Flexbox や CSS Gridで、white-space: nowrap;
やpre
の影響でレイアウトが崩れる場合、min-width: 0;
を適用することで解決できます。レイアウトの崩れに悩んでいる方は、今回紹介した方法を試してみてください!