flexプロパティとは?子要素の伸縮率をショートハンドで書ける便利CSS

公開日 :

  • コーディング

こんにちは!AndHAコーディング部です。

みなさん、「flexbox子要素の幅がうまく調整できない…」という経験は無いですか?
本記事ではそんな悩みを解決しつつ、より効率的なコーディングができる「flexプロパティ」についてご紹介します!

子要素の伸縮率をショートハンドのように書けるflexプロパティ

flexプロパティとは

flexプロパティとは、flexbox子要素に対して伸び縮みの比率を指定できるプロパティです。

具体的には、「flex-grow」「flex-shrink」「flex-basis」という3つの値を、ショートハンドのようにまとめて指定することができる便利なCSSです。

子要素のサイズ(伸縮する方法や比率)を一括で簡単に指定できるため、より効率的なコーディングが可能になります。

※CSSの基本書式は { プロパティ: 値; } となりますが、この記事では、「プロパティ」は左側に入れる内容、「値」は右側に入れる内容として解説します。

そもそも「flex-grow」「flex-shrink」「flex-basis」って?

そもそも、「flex-grow」「flex-shrink」「flex-basis」が分からない方も多いかと思います。

簡単に言うと、比率や幅を制御するflexプロパティで、それぞれ下記のような意味合いをもっているCSSです。

  • flex-grow = 伸長(初期値:0)
  • flex-shrink = 圧縮(初期値:1)
  • flex-basis = 長さ(初期値:auto)

なお、「flex-grow」「flex-shrink」「flex-basis」については、下記記事でより詳しく解説しています。
これらを理解していないと今回の記事の内容は難しく感じてしまうと思うので、ぜひ一度ご覧ください。

比率や幅を制御するflexプロパティについて

https://and-ha.com/coding/flex-properties-control/

実際の記述の仕方(基本形)

まずは実際のコードから。以下が基本形です。

.content {
  display: flex;
}
.content_child {
  flex: auto;
}

flexプロパティは、flexbox子要素に対して有効なCSSです。そのため、flexbox親要素に display: flex; を、flexbox子要素にこのflexプロパティを記述します。

flexプロパティの初期値

flexプロパティの初期値は「0 1 auto」です。
ようは、flex-grow: 0;flex-shrink: 1;flex-basis: auto; の状態です。

flex: 0 1 auto; と指定すると、以下のように、flex子要素の横幅はそれぞれの最小の横幅となります。

See the Pen flex: 0 1 auto; by ha-01 (@hasamplecom) on CodePen.

いろいろな値を指定してみる

次に、初期値以外の値を実際に指定し、どう変化するのかを見てみます。

flexプロパティでは、指定する値、値の数、値に対しての単位(「px」や「%」など)の有無に応じて、flex-grow、flex-shrink、flex-basisのどのプロパティを適用するか自動的に変化します。

なお値の指定には順番があり、1.flex-grow、2.flex-shrink、3.flex-basisで指定する必要があるのでご注意ください。

値を3つ指定する場合

flexプロパティの値を3つ指定する場合、以下のような記述ルールになります。

  • 1つ目の値
    flex-growとして指定できる数値
  • 2つ目の値
    flex-shrinkとして指定できる数値
  • 3つ目の値
    widthとして指定できる値(「px」や「%」)、かつ、flex-basisとして指定できる値

下記、item1の子要素に対して、flex: 1 2 100%; と指定しています。
これは、flex-grow: 1; flex-shrink: 2; flex-basis: 100%; と指定する場合と同様の意味になります。

See the Pen flex: 1 2 100px; by ha-01 (@hasamplecom) on CodePen.

値を2つ指定する場合

flexプロパティの値を2つ指定する場合、以下のような記述ルールになります。

  • 1つ目の値
    flex-growとして指定できる数値
  • 2つ目の値
    flex-basisまたはflex-shrinkとして指定できる値

以下、記述例です。

/* flex-grow: 1; flex-basis: 50px; と同意 */
.content_child {
  flex: 1 50px;
}

/* flex-grow: 2; flex-shrink: 2; と同意 */
.content_child{
  flex: 2 2;
}

以下は、item1要素に対して flex: 1 50px; を指定しています。

See the Pen flex: 1 50px; by ha-01 (@hasamplecom) on CodePen.

値を1つだけ指定する場合

値を1つだけ指定する場合、ようは flex: 1; と指定する場合
flex-growは「1」
flex-shrink は「1」
flex-basis は「0」
とみなされます。

以下は、item2要素に対して flex:1 と指定した場合の例です。
これは、flex-grow: 1; と指定する場合と同意です。

See the Pen flex: number 1 0; by ha-01 (@hasamplecom) on CodePen.

なお上記は、数値に単位をつけない場合として認識( flex-grow の値が1つ)になりますが、 flex: 10em;flex: 30%; のように数値に単位をつけると、「 flex-basis の値が1つ」として認識されます。

値を1つだけ指定するその他の書き方

flex: initial;

flex: 0 1 auto と同じ意味です。
親コンテナ要素に合うように最小サイズまで収縮しますが、 子アイテム要素が空き領域を埋めるよう伸縮することはありません。

flex: auto;

flex: 1 1 auto と同じ意味です。
子アイテム要素は空き領域を埋めるよう伸縮します。

flex: none;

flex: 0 0 auto と同じ意味です。
親コンテナ要素の寸法は完全に固定されるため、 子アイテム要素が空き領域を埋めるよう伸縮することはありません。

最後に|参考にしたいサイト・おすすめ記事

flexプロパティについての公式サイト

flexプロパティについて詳しくは、以下MDNサイトの記事を参考にしてみてください。

flex – CSS: カスケーディングスタイルシート | MDN

flexboxについてもっと知りたい方へ

これまで複数の記事でflexboxプロパティについてご紹介しています。
ぜひこちらもご覧ください!

flexboxの概要と「flex-direction」について

https://and-ha.com/coding/flexbox-and-flexdirection/

flexboxの「flex-wrap」と「flex-flow」について

https://and-ha.com/coding/flex-wrap-and-flex-flow/

flexboxの「justify-content」と「align-items」について

https://and-ha.com/coding/justify-content-align-items/

flexboxの「align-content」と「order」について

https://and-ha.com/coding/align-content-order/

比率や幅を制御するflexプロパティについて

https://and-ha.com/coding/align-content-order/

合わせて読みたい!