Flexboxを使う時に覚えておきたい!固定幅と可変幅を組み合わせたレイアウトを簡単に実装する方法
Post on:2019年7月18日
幅が決まっている固定要素と幅が決まっていない柔軟な可変要素をうまく組み合わせたレイアウトをFlexboxで実装するCSSのテクニックを紹介します。
画像とテキストを並べたり、ナビゲーションだったり、横に並べた際に高さが異なってしまったり、さまざまなレイアウトを解決するテクニックです。
Making width and flexible items play nice together
下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。
短い答え
flex-shrinkとflex-basisを使用します。
詳しく解説
下記のように、widthが決まっている画像とテキストを並べて配置したいとします。
画像とテキストを並べて配置したい
このような配置を実現するためには、Flexboxが簡単です。
まずは、親要素にdisplay: flex;を定義します。
参考: CSS Flexbox の基礎知識と使い方を詳しく解説
1 2 3 |
.container { display: flex; } |
このスタイルシートで、下記のように表示されます。
See the Pen
Flex-Shrink Example 1 by Robin Rendle (@robinrendle)
on CodePen.
なんとなく形はできました。
画像の幅を設定していないので、画像とテキストがくっつくのは理にかなっています。理想としては、画像の幅を固定し、適度にマージンを加えて、残りいっぱいにテキストが配置されるようにしたいです。
スタイルシートに、画像の幅とマージンを加えます。
1 2 3 4 5 6 7 8 |
.container { display: flex; } img { width: 50px; margin-right: 20px; } |
これで、理想に少し近づきました。
See the Pen
Flex-Shrink Example 2 by Robin Rendle (@robinrendle)
on CodePen.
これは確かに、Chromeだと素晴らしく見えます。でも、ちょっと待ってください。Firefoxのデベロッパーツールで画像のタグを調べると、設定したwidth値ではありません。
Firefoxのデベロッパーツールで検証
min-widthを使用すると、画像を希望する50pxの幅にすることができます。
1 2 3 4 |
img { min-width: 50px; margin-right: 20px; } |
しかし、これは幅だけです。マージンには効果がありません。
1 2 3 4 |
img { min-width: 50px; margin-right: 20px; } |
とりあえず、Firefoxで改善されました。
さらに詳しく解説
画像のサイズが小さくならないようにするには、flex-shrinkプロパティを使うと便利です。
flex-shrinkのデフォルト値は、1です。画像の元のサイズを維持するために、0を定義します。
参考: flex-shrinkプロパティとは
1 2 3 4 5 6 7 8 9 |
.container { display: flex; } img { width: 50px; margin-right: 20px; flex-shrink: 0; } |
「flex-shrink: 0;」を加えると、下記のようになります。
See the Pen
Flex-Shrink Example 3 by Robin Rendle (@robinrendle)
on CodePen.
これでだいぶ、よくなりました!
しかし、まだ改善の余地があります。
最終的な答え
flex-shrinkはflexプロパティのショートハンドに含まれているので、簡単に記述することができます。flexプロパティは、「flex-grow」「flex-shrink」「flex-basis」のショートハンドです。
参考: flexプロパティとは
1 |
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] |
flex-shrinkを0に設定し、flex-basisをデフォルトの幅に設定すると、widthプロパティは必要ありません。
1 2 3 4 5 6 7 8 |
.container { display: flex; } img { flex: 0 0 50px; margin-right: 20px; } |
これで、完成です。コードも非常にシンプルです。
See the Pen
Flex-Shrink Example 2 by Geoff Graham (@geoffgraham)
on CodePen.
このテクニックを使った応用技
flex-shrinkプロパティは他にも多くの問題を解決します。特に、Flexboxを使い始めたばかりなら、覚えておいて損はありません。CSS-Tricksのニュースレターで取り上げた例を紹介しましょう。
ユーザーが複数のアイテムを左右にスクロールできるナビゲーションのコンポーネントがあります。
See the Pen
flex-shrink nav item 1 by Robin Rendle (@robinrendle)
on CodePen.
この長いナビゲーションは、アイテムを複数行にするべきではありません。なぜ複数行になってしまったのか。flex-shrinkプロパティを0に設定すると、各アイテムは縮小しないように指示され、代わりにコンテンツの幅が仮定されます。
See the Pen
flex-shrink nav item by Robin Rendle (@robinrendle)
on CodePen.
flex-shrinkの代わりにflexプロパティを使用するため、コードを修正します。今回はコンテナのスペースを分割するときにすべてのアイテムの最大スペースを考慮する必要があるため、flex-basisはautoにします。
参考: flex-basisプロパティとは
See the Pen
Setting flex for flexible nav elements by Geoff Graham (@geoffgraham)
on CodePen.
追加したのはたった一行のスタイルシートですが、柔軟なレイアウトを作成するためには非常に重要です。
sponsors