レイアウトを組む際、Flexboxを使うことは多くあります。
Flexboxの基本的な使い方はわかっていても意外と細かい点については曖昧だったり、たまにしか使わないプロパティは忘れてしまうこともあると思います。
- 駆け出しの方は1から学ぶため
- 学習済みの方は改めて確認や忘れた時のため
これらの用途で役に立つように、"覚えるべき"Flexboxの全プロパティや注意点を図解も使ってまとめました。駆け出しの方向けに、サンプルや関連記事も載せているので是非参考にしてみてください。
✋ 注意
- 全てのプロパティを紹介しているわけではありません
- "覚えるべき"全てのプロパティを紹介しています
👇 メンターやってます 👇
模写修行やこのメディアを作ったエンジニア中心に、メンタリングサービスHello Mentorを運営しています。
- 独学に限界を感じている...
- 何をどこまで勉強すれば良いかわからない...
- 自分の書き方が正しいかわからない...
- 検索しても解決しない問題が多い...
- 転職や副業のアドバイスが欲しい...
このような方は、ぜひ下記のリンクからサービス詳細をご覧ください。個別説明会もお気軽にお申し込みください。
👆 メンターやってます 👆
この記事の目次
Flexboxとは?
FlexboxとはFlexible Box Layout Moduleのことで、横並びなどのレイアウトを実装する時に使います。
一昔前はtableやfloatを使ってレイアウトを実装していましたが、今はFlexboxやCSS Gridを使った方がより効率的にスッキリ書くことができます。
CSS Gridに関しては、下記の記事で詳しく紹介しています。
【CSS Grid入門】図解も交えて使い方を詳しく解説!Flexboxの基本
<div class="flex-container"><!-- flexコンテナ -->
<div class="flex-item">flex item</div><!-- flexアイテム -->
<div class="flex-item">flex item</div><!-- flexアイテム -->
...
<div class="flex-item">flex item</div><!-- flexアイテム -->
</div>
/* flexコンテナ */
.flex-container {
display: flex;
...
}
/* flexアイテム */
.flex-item {
...
}
Flexboxの基本的な形です。
上の図やコードのように、Flexboxには、flexコンテナとflexアイテムがあります。
- flexコンテナに対して
display: flex;
- flexコンテナの"直下"にflexアイテムを配置
これだけでflexアイテムが横並びになります。これに加え、Flexbox関連の様々なプロパティを使い、レイアウトを作っていくことになります。
- flexコンテナに指定するもの
- flexアイテムに指定するもの
Flexbox関連のプロパティは上の2つに別れます。
👇 flexコンテナに指定するもの
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
- gap
👇 flexアイテムに指定するもの
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
- order
次のセクションからこれら全てについて解説していきます。プロパティによっては使用用途のサンプルも紹介します。
【初心者向け】注意したいポイント!
<!-- これだとダメ! -->
<h2 class="service-title">サービス</h2>
<div class="service-list">
<div class="service-item">web制作</div>
...
<div class="service-item">マーケティング支援</div>
<p class="service-note">詳しいサービス内容についてはお問い合わせください。</p>
</div>
service-itemを横並びにしたい場合、上のようにすると、service-noteも横に並んでしまいます。flexコンテナの直下には"横並びにしたい要素のみ"を配置する点に注意してください。
<!-- 正しくはこう! -->
<h2 class="service-title">サービス</h2>
<div class="service-list">
<div class="service-item">web制作</div>
...
<div class="service-item">マーケティング支援</div>
</div>
<p class="service-note">詳しいサービス内容についてはお問い合わせください。</p>
このようにすればOKです。
【駆け出しの方へ】独学に限界を感じてませんか?
プログラミングやデザインは独学可能ですが、ほとんんどの方が苦戦します。
↓このように感じていませんか?
- 何をどこまで勉強すれば良いかわからない...
- 自分の書き方が正しいかわからない...
- 検索しても解決しない問題が多い...
- 転職や副業するまでの道が見えない...
そんな問題を解決するために、模写修行やこのメディアを作ったエンジニア/デザイナー中心に、メンタリングサービスHello Mentorを始めました。
スクールのような大金は必要ありません。高額な費用は払いたくないけど、プロのサポートが欲しい方は、ぜひ下記のリンクからサービス詳細をご覧ください。
👆 メンターは全員現役エンジニア 👆
flexコンテナに指定するもの
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
- gap
これらの『flexコンテナに指定するもの』について1つずつ解説します。
flex-direction
flex-direction
は、flexアイテムの並ぶ方向(主軸)を指定するプロパティです。
row
(初期値)やrow-reverse
を指定した場合は主軸が横方向column
やcolumn-reverse
を指定した場合は主軸が縦方向
このようになります。『主軸とは何か』については後述します。
👇 指定できる値
- row(初期値)
- row-reverse
- column
- column-reverse
row(初期値)
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
}
row
を指定した場合、主軸が横方向になり、先頭(左)から横並びになります。
row-reverse
.flex-container {
display: flex;
flex-direction: row-reverse;
}
row-reverse
を指定した場合、主軸が横方向になり、末尾(右)から横並びになります。
column
.flex-container {
display: flex;
flex-direction: column;
}
column
を指定した場合、主軸が縦方向になり、先頭(上)から縦並びになります。
column-reverse
.flex-container {
display: flex;
flex-direction: column-reverse;
}
column-reverse
を指定した場合、主軸が縦方向になり、末尾(下)から縦並びになります。
超重要!Flexboxにおける軸とは?
Flexboxには軸という概念があり、主軸とクロス軸を考慮する必要があります。その主軸を決めるのがflex-direction
でした。
flex-direction
でrow
やrow-reverse
を指定した場合は横方向が主軸に、column
やcolumn-reverse
を指定した場合は縦方向に主軸になります。
上の図は主軸が横方向の場合です。主軸とクロス軸に加えて、それぞれ先頭と末尾があります。
Flexboxのプロパティは主軸が横方向 / 縦方向のどちらかによって各プロパティの挙動が変わる点に注意しないといけません。
主軸が横方向の場合
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: space-between;
}
主軸が横方向の場合は、space-between
は flex アイテム間の横方向の間隔を指定しています。(space-between
に関しては後述します)
主軸が縦方向の場合
.flex-container {
display: flex;
flex-direction: column;
justify-content: space-between;
}
主軸が縦方向の場合は、space-between
はflexアイテム間の縦方向の間隔を指定しています。
このように主軸によって、横方向の間隔を指定するか縦方向の間隔を指定するかが変わります。
意外と使えるrow-reverse
例えば上のようなデザインの場合、偶数番目だけrow-reverse
にすれば実装できます。
.flex-container {
display: flex;
...
}
.flex-container:nth-child(2n){
flex-direction: row-reverse;
}
これだけでOKです。
flex-wrap
flex-wrap
はflexアイテムがflexコンテナの幅や高さを超えた時に折り返すかどうかを指定するプロパティです。
👇 指定できる値
- nowrap(初期値)
- wrap
- wrap-reverse
nowrap(初期値)
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
flex-wrap: nowrap; /* 初期値なので指定しなくても良い */
}
nowrap
を指定した場合、flexアイテムに幅を指定しても縮小されて折り返しません。
wrap
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
flex-wrap: wrap;
}
wrap
を指定した場合、flexコンテナにflexアイテムが収まりきらなければ、図のように折り返します。
wrap-reverse
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
flex-wrap: wrap-reverse;
}
wrap-reverse
を指定した場合、flexコンテナにflexアイテムが収まりきらなければ、図のように折り返します。
flex-flow
- flex-direction
- flex-wrap
これら2つをまとめて指定するためのプロパティです。初期値はrow nowrap
です。
使用例
.flex-container{
flex-flow: row nowrap;
...
}
justify-content
justify-content
は主軸方向の、flexアイテム間やflexアイテム周囲の配置を指定するプロパティです。
👇 指定できる値
- flex-start(初期値)
- flex-end
- center
- space-between
- space-around
flex-start(初期値)
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: flex-start; /* 初期値なので指定しなくても良い */
}
flex-start
を指定した場合、flexアイテムは先頭寄りで配置されます。
flex-end
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: flex-end;
}
flex-end
を指定した場合、flexアイテムは末尾寄りで配置されます。
center
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: center;
}
center
を指定した場合、flexアイテムは中央に配置されます。
space-between
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: space-between;
}
space-between
を指定した場合、flexコンテナの余った部分が、flexアイテム間に均等に割り振られます。
space-around
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
justify-content: space-around;
}
space-around
を指定した場合、flexコンテナの余った部分が、flexアイテムに均等に割り振られます。各flexアイテムに均等に割り振られるので、flexアイテム間の余白は両端の余白の2倍になります。
最後の1つだけ右寄せや下寄せにしたい場合
上の図のように、最後のユーザーアイコンだけ右寄せにしたい場合は、ユーザーアイコンに対して、margin-left: auto;
をするだけでOKです。
上の図のように、ボタンの横のラインを揃えたい場合は、ボタンに対して、margin-top: auto;
で揃います。
紹介した2つのケースは、割と使う方法なので、詳しくは下記の記事をご覧ください。
Flexboxで最後の1つだけ右寄せや下寄せにする方法!space-betweenの注意点
例えばユーザーが投稿するコンテンツ(メディアなど)で上の図のようなレイアウトにする場合、space-between
を指定すると問題が生じます。
.posts{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.posts-item{
width: 30%;
...
}
👆 NGなコード例です。投稿数がカラム数のn倍の場合は問題ありませんが、そうではない場合、意図しない見た目になります。
3カラムで投稿数が5つの場合、上の画像のようになります。(本来2行目は左から順に配置にしたい)
余白は後述する、gap
を使うと良いです。
align-items
align-items
はクロス軸に対してflexアイテムの配置を指定するプロパティです。
👇 指定できる値
- stretch(初期値)
- flex-start
- flex-end
- center
- baseline
stretch(初期値)
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-items: stretch; /* 初期値なので指定しなくても良い */
}
stretch
を指定した場合、flexコンテナ埋めるように広がります。
flex-start
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-items: flex-start;
}
flex-start
を指定した場合、flexアイテムは先頭寄りで配置されます。
flex-end
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-items: flex-end;
}
flex-end
を指定した場合、flexアイテムは末尾寄りで配置されます。
center
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-items: center;
}
center
を指定した場合、flexアイテムは中央に配置されます。
baseline
.flex-container {
display: flex;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-items: baseline;
}
baseline
を指定した場合、ベースラインに揃います。
baselineの使い所
baseline
の使い所はあまり多くありませんが、上の図のようなデザインの時は使えます。
つまずきポイントを事前に回避!
HTMLの書き方によって初期値のstretch
が原因で画像が伸びてしまう場合があります。対処方法は下記の記事で紹介しています。
align-content
align-content
はクロス軸方向の、flexアイテム間やflexアイテム周囲の配置を指定するプロパティです。
justify-content
の逆軸方向版だと考えると分かりやすいかもしれません。
👇 指定できる値
- stretch(初期値)
- flex-start
- flex-end
- center
- space-between
- space-around
stretch(初期値)
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: stretch; /* 初期値なので指定しなくても良い */
}
stretch
を指定した場合、flexコンテナの高さを全て埋めるように配置されます。
flex-start
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: flex-start;
}
flex-start
を指定した場合、先頭に詰めて配置されます。
flex-end
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: flex-end;
}
flex-start
を指定した場合、末尾に詰めて配置されます。
center
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: center;
}
center
を指定した場合、中央配置されます。
space-between
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: space-between;
}
space-between
を指定した場合、flexコンテナの余った部分が、flexアイテム間に均等に割り振られます。
space-around
.flex-container {
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
align-content: space-around;
}
space-around
を指定した場合、flexコンテナの余った部分が、flexアイテムに均等に割り振られます。
gap
.flex-container{
display: flex;
flex-wrap: wrap;
gap: 50px 25px;
...
}
.flex-item{
width: 100px;
...
}
gap
はflexアイテム間の余白を具体的な数値で指定することが出来ます。
gap: 50px 25px;
の1つ目が上下の余白、2つ目は左右の余白になります。
flexアイテムに指定するもの
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
- order
これらの『flexアイテムに指定するもの』について1つずつ解説します。
flex-grow
flex-grow
はflexコンテナの余ったスペースをどれだけの比率でflexアイテムに分配するかを指定するプロパティです。
👇 指定できる値
- 数値
※ 負の値は不可 / 初期値は0
※ 初期値は0なのでflex-grow
を指定しない場合、余ったスペースは分配しされません。
flexアイテムの大きさを指定しているわけじゃない
この図のように余ったスペースの分配比率を決めるのがflex-grow
です。flexアイテムの大きさの比率を決めているわけではありません。(flexアイテムの大きさの比率の決め方は後述します。)
flex-shrink
flex-shrink
はflexコンテナに余ったスペースがない場合、他のflexアイテムに対してどれだけの比率で縮小させるか指定するプロパティです。
👇 指定できる値
- 数値
※ 負の値は不可 / 初期値は1
※ flex-grow
は余ったスペースがあった場合の指定に対して、flex-shrink
は余ったスペースがなかった場合の指定です。
計算方法はややこしい...
.flex-container{
display: flex;
width: 600px;
}
.flex-item:nth-child(1){
flex-shrink: 2;
width: 300px;
}
.flex-item:nth-child(2){
flex-shrink: 3;
width: 600px;
}
flex-shrink
の計算方法は結構ややこしいです。上のような指定があり、flexコンテナに余ったスペースがない場合、単純に2:3の比率で縮小するわけではありません。
指定されている幅や高さ(上の例の場合300pxや600px)も考慮して、どれくらい縮小するか決まります。
コーディング中に計算が必要になったことは1度もないので、下の計算式は理解しなくても良いです。
詳しい解説はしませんが、上の計算式のように、flex-shrink
の値とwidth
の値を考慮して縮小する幅が決まります。興味がある方は調べてみてください。
つまずきポイントを事前に回避!
条件によっては画像や要素が潰れてしまう場合がありますが、flex-shrink: 0;
を使うと解決できます。詳しくは下記の記事で紹介しています。
flex-basis
flex-basis
は flexアイテムの幅や高さを指定するプロパティです。
👇 指定できる値
- 数値(widthやhightと同じ単位が使用可)
※ 負の値は不可 / 初期値はauto
widthやheightと何が違う?
.flex-container{
display: flex;
flex-direction: row; /* もしくはrow-reverse */
}
.flex-item{
flex-basis: 100px; /* width: 100px;と同じ意味 */
}
flex-direction
がrow
やrow-reverse
の場合はflex-basis
はwidth
と同じです。
.flex-container{
display: flex;
flex-direction: column; /* もしくはcolumn-reverse */
}
.flex-item{
flex-basis: 100px; /* height: 100px;と同じ意味 */
}
flex-direction
がcolumn
やcolumn-reverse
の場合はflex-basis
はheight
と同じです。
widthやheightは幅や高さを指定するプロパティですが、flex-basis
は主軸と同じ方向のflexアイテムのサイズを指定しています。従って、主軸によっては幅になったり、高さになったりします。
flex
- flex-grow
- flex-shrink
- flex-basis
これら3つをまとめて指定するためのプロパティです。初期値は0 1 auto
です
使用例
.flex-item{
flex: 0 1 auto;
}
知っておくと便利
flexアイテムを全て同じ大きさで配置したい場合は、flexアイテムに対して、flex:1
を指定すれば実装できます。
flexの初期値は0 1 auto
ですが、flex:1
を指定すると、1 1 auto
になるわけではなく、1 1 0
になります。flex:1
で flex アイテムが全て同じ大きさになるのは、この仕様のせい(おかげ?)です。
詳しくは下記の記事をご覧ください。
Flexboxで均等幅(同じサイズ)で横並び配置する方法!align-self
align-self
はクロス軸に対して、flexアイテムの配置を個別に指定するプロパティです。align-items
での指定を上書き出来ます。
align-items
はflexコンテナに対して指定することで、flexアイテム全ての配置を指定できました。それに対して、align-self
はflexアイテムに対して、個別に指定するものです。
👇 指定できる値
- auto(初期値)
- flex-start
- flex-end
- center
- baseline
- stretch
使用例
.flex-container {
display: flex;
align-items: stretch; /* 初期値なので指定しなくても良い */
...
}
.flex-item:nth-child(1) { align-self: auto; } /* 初期値なので指定しなくても良い */
.flex-item:nth-child(2) { align-self: flex-start; }
.flex-item:nth-child(3) { align-self: flex-end; }
.flex-item:nth-child(4) { align-self: center; }
.flex-item:nth-child(5) { align-self: baseline; }
.flex-item:nth-child(6) { align-self: stretch; }
この例では、flexコンテナにalign-items: stretch
を指定しているので、1と6や2と5が同じになっていますが、align-items
の値が変われば、違う結果になるので試してみてください。
order
order
はflexアイテムの順番を指定するプロパティです。デフォルトではHTMLに記述した順で表示されますが、order
を使うことで自由に順番を変更できます。
👇 指定できる値
- 数値
※ 負の値も可 / 初期値は0
使用例
.flex-container{
display: flex;
flex-wrap: wrap;
flex-direction: row; /* 初期値なので指定しなくても良い */
}
.flex-item:nth-child(1){ order: 3; }
.flex-item:nth-child(2){ order: 4; }
.flex-item:nth-child(3){ order: 1; }
.flex-item:nth-child(4){ order: 2; }
Flexboxの初期値まとめ
.flex-container {
display: flex;
}
.flex-item {
width: 100px;
}
例えば、👆 上のように指定した場合、👇 下のコードが適応されているのと同じことになります。
.flex-container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: stretch;
align-content: stretch;
}
.flex-item {
width: 100px;
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
}
思い通りに実装出来ない場合は、初期値を確認することで解決の糸口になるかもしれません。
たくさん書いて覚えよう!
駆け出しの方にとって、Flexboxはややこしく、覚えるのが大変かもしれません。
なるべく分かりやすく、網羅的に解説したつもりですが、この記事でもイメージがつきにくかった箇所もあったと思います。
1回読んだだけで理解できて使いこなせる人はいないので、自分で書いてみてどんな挙動になるのか確かめながら覚えることがおすすめです。
サイトを制作する上で、Flexboxの使用頻度は多いので、しっかり理解しましょう。
独学に限界を感じていませんか?
模写修行やこのメディアを作ったエンジニア中心に、メンタリングサービスHello Mentorを運営しています。
👇 こんな方のためのサービスです。
- 独学に限界を感じている...
- 何をどこまで勉強すれば良いかわからない...
- 自分の書き方が正しいかわからない...
- 検索しても解決しない問題が多い...
- 転職や副業のアドバイスが欲しい...
メンターを務めるのは、今も現役でコードを書いているエンジニアのみです。駆け出しの方やメンターだけをやっている方はいません。
高額な料金はかかりません。サブスク&入会金・解約料なしなので、リスクなく始められます。
少しでも興味がある方は、ぜひ下記のリンクからサービスサイトをご覧ください。個別説明会もお気軽にお越しください。(無理な営業等一切ございません!)
当メディア運営メンバーでメンターやってます!👉
詳しく見る
0からweb制作やプログラミングの勉強を始める方はもちろん、12ヶ月以上独学している方や既にお仕事をしている方にもご利用いただいています!