flexなWebサイトが作りたい！

webサイトなどの装飾を行う上で避けては通れないflexbox。
しかし自分自身flexboxに苦戦しているところなので、
今回は備忘録としてflexboxについてまとめていきたいと思います。
# flexboxとは?
flexboxは要素を並べるためのレイアウトの方法ことです。
要素自体ではなく周りの空間の使い方を指定することで要素を配置するため、
要素のサイズにとらわれない柔軟な配置を行うことができます。
行か列(縦軸か横軸)で要素を並べるため一次元のレイアウト方法になります。

# flexboxの基本概念

 ## 〇flexboxの構成
 
flexboxは以下の二つの要素から構成されています。
- コンテナ（親要素）
- アイテム（子要素）

![Qiita用1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/4b5dc428-e2a6-d18b-8cf8-55fe166deb41.png)


## 〇flexbox２つの軸
flexboxを使うときは 2 つの軸、主軸 (main axis) と交差軸 (cross axis) の観点から考える必要があります。
デフォルトでは主軸は水平方向であり、左から右へ進んでいきます。
             交差軸は垂直方向で上から下へ進んでいきます。

※デフォルトの軸の状態
![Qiita用2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/14d84bb8-9884-ea80-2058-86e30d86f1d6.png)


# flexboxで指定できるプロパティ

Flexboxでレイアウトをする時には、コンテナとアイテムにそれぞれプロパティを指定していきます。

## 〇コンテナに指定できるプロパティ

1. **flex-direction**
→主軸方向のが指定します
1. **justify-content**
→主軸に対してアイテムの配置の仕方を指定します
1. **flex-wrap**
→アイテムの折り返し(改行)を指定します
1. **align-items**
交差軸にどのようにアイテムを配置するか指定します
1. **align-content**
→アイテムが複数行にわたって存在するとき、
　列と列、行と行の間スペースの配分を指定します。

## 〇子要素に指定できるプロパティ
1. **order**
→アイテムの並び順を指定します
1. **flex-basis**
→アイテムの基本幅を指定します
1. **flex-grow**
→コンテナ内の余った空間の割り当て方について指定します
1. **flex-shrink**
→アイテムがコンテナより大きいときの縮小のさせ方を指定します
1. **flex**
→flex-grow、flex-shrink、flex-basisを同時に指定します

flexboxのプロパティを並べてみましたが、正直文章だけではイメージしづらいですね…。
ここからは実際にそれぞれのプロパティを使ったflexboxのコードを書いていきたいと思います。
# flexbox実践

## 〇flexbox使用前の準備
ここから実際にflexboxを使っていくにあたってHTMLとCSSのファイルの準備をします。
**HTML**
親要素であるdivに対してclassでcontainerを割り当て、
子要素を四つ用意し、classでitemを割り当てています。
![Qiita用３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/032e3894-11b8-e8e8-b2d7-25d308e6e1c4.png)
**CSS**
背景、子要素それぞれの色とサイズを設定します。
![Qiita用４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/05038df3-2960-4d18-11d2-ddac63524efa.png)


## 〇flexboxの適用
CSSで親要素(コンテナ)にdisplay:flexと記述します。
flexboxを使うためのおまじないみたいなものです。
![Qiita用６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/33164912-4ee3-abaf-6ecc-68dc2d7a5f53.png)
準備は以上になります。
ここからは実際にプロパティを指定して、レイアウトを変更していきたいと思います。

## 親要素編
### flex-direction
主軸の方向の指定ができます。
以下の値が入れられます。

・row(初期値)
…主軸が水平方向、左から右
・row-reverse
…主軸が水平方向、右から左
・colmn
…主軸が垂直方向、上から下
・colmn-reverse
…主軸が垂直方向、下から上

CSSの記述例↓
![Qiita用8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/3de33c68-4f46-179c-a5de-79f5f8bc8619.png)

**〇row(初期値)**
主軸が水平方向、左から右
初期値なので特に配置に変更はありません。
![Qiita用９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/ffb4381e-9e76-8ad9-4d65-7bbc9b147ea4.png)

**〇row-reverse**
主軸が水平方向、右から左
アイテム全体が右寄せになります。
![Qiita用９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/7925ce6d-a0dc-5b40-518f-4060caea55d4.png)

**〇colmn**
主軸が垂直方向、上から下
![Qiita用９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/16a21e36-47f3-b24a-1bb3-d93bb11fa42f.png)

**〇colmn-reverse**
主軸が垂直方向、下から上
![Qiita用９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/39c4b2c7-2a45-c94b-8123-ca1d3811d49f.png)

### justify-content
主軸に対してアイテムの配置の仕方を指定することができます。
以下の値が入れられます。

・flex-start（初期値）
…主軸の始まる方向から配置します
・flex-end
…主軸の終わる方向に配置します
・center
…主軸に対して左右中央揃えで配置します
・space-between
…アイテム同士の間の間隔が均等に割り当てられた状態で配置します
・space-around
…アイテムの両端を含めた間の間隔が均等に割り当てられた状態で配置します

CSS記述例↓
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/241e2d93-d591-f939-47c3-f4b2c2e8c3dc.png)

**〇flex-start（初期値）**
主軸の始まる方向から配置します
初期値なので特に変更はありません。
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/c6724c36-b494-f740-1a04-f7af103986d5.png)

**〇flex-end**
主軸の終わる方向に配置します
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/550b492a-c44f-db3d-5f94-8fa2dd5176bc.png)

**〇center**
主軸に対して左右中央揃えで配置します
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/6c925898-7cae-f4ad-59cb-8a9adaef0f6b.png)

**〇space-between**
アイテム同士の間の間隔が均等に開けられた状態で配置します
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/cb19419d-be1f-14dd-477e-1e21d8580a8a.png)

**〇space-around**
アイテムの両端を含めた間の間隔が均等に割り当てられた状態で配置します
※両端の間隔とアイテム同士の間隔は異なります。
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/75b78b5e-2a35-2d84-9610-23c14aa5fe32.png)

### flex-wrap
アイテムが一つの列や業に収まりきらないときの配置の仕方について指定します。
以下の値が入れられます。

・nowrap（初期値）
…アイテムを横一列に配置します
・wrap
…入りきらなかったアイテムを別の行へ配置します。
・wrap-reverse
…アイテムを(左)下から上へ複数行にわたって配置

CSS記述例↓
![Qiita用12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/e877c770-f1ad-ba17-107a-2840969b8c0b.png)

**〇nowrap(初期値)**
アイテムを横一列に配置します
※アイテムのサイズを変更しています。
それぞれのアイテムの横幅は300pxですが、
親要素の横幅が1000pxのため本来のサイズより小さくなっています。
![Qiita用13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/34c16490-56d7-4f10-976e-4ad991da3f90.png)

**〇wrap**
入りきらなかったアイテムは次の行へ改行されます。
交差軸が上から下方向なので、下の行へ配置されます。
![Qiita用13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/56e82768-d19f-d247-f599-d7138a48e573.png)

**〇wrap-reverse**
入りきらなかったアイテムは次の行へ改行されます。
交差軸が下から上の方向になるので、
入りきらなかったアイテムは下から上の行へ配置されます。
![Qiita用13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/fda0731b-bec1-7abe-caf4-c41043a6f4b1.png)

### align-items
交差軸にどのようにアイテムを配置するか指定します。
以下の値が入れられます↓

・flex-start（初期値）
…アイテムを交差軸の始まる方向から配置します
・center
…アイテムを交差軸に対して上下中央揃えで配置します
・flex-end
…アイテムを交差軸の終わる方向に配置します
・stretch
…アイテムを交差軸方向に余白を埋めるよう変形させて配置します
・baseline
…アイテムをベースライン(文字列の下線)に合わせて配置します

CSS記述例↓
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/dd5cdc26-c1f2-9436-037b-8db4de1c2c75.png)

**flex-start（初期値）**
アイテムを交差軸の始まる方向から配置します
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/70e8bc2b-029b-9018-ba99-50598bb1d0e3.png)

**center**
アイテムを交差軸に対して上下中央揃えで配置します
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/30397c5c-e852-a326-ad22-f913261bcc92.png)

**flex-end**
アイテムを交差軸の終わる方向に配置します
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/d16644f1-b13f-bb78-b344-36b3e4d264fc.png)

**stretch**
アイテムを交差軸方向に余白を埋めるよう変形させて配置します
※CSSなどでアイテムのheightが指定されていると適用されないため
一時的にコメントアウトしています。
![Qiita用14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/97f98d39-4dfa-7914-28ce-6904a87a202c.png)

**baseline**
アイテムをベースライン(文字列の下線)に合わせて配置します
※主軸に対して左右中央揃えで配置、アイテム、文字のサイズを変更しています。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/6f3027fa-1ab0-05ec-a354-531bc3c7f29c.png)

### align-content
アイテムが複数行にわたって存在するとき、
列と列、行と行の間スペースの配分を指定します。
交差軸が基準となります。
※flex-wrapで、wrap、wrap-reverseが指定されていることが前提のため、
　flex-wrapでwrapを適用しています。
以下の値が入れられます↓

・stretch（初期値）
…アイテムで余白を埋めるように配置します
・flex-start
…複数行のアイテムを上揃えで配置します
・flex-end
…複数行のアイテムを下揃えで配置します
・center
…複数行のアイテムを上下中央揃えで配置します
・space-between
…一番上の行と一番下の行のアイテムは余白なしで配置し、間に入っているアイテムは均等に間隔を空けて配置される
・space-around
…上下の空白がすべて均等な間隔で配置される

CSS記述例↓
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/41ae3888-bf05-d38c-d92a-746613011e60.png)

**stretch（初期値）**
アイテムで余白を埋めるように配置します
初期値なので、flex-wrapのwrapと同じ配置になります。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/a048c5b0-0514-d0d2-519a-9b056c6e9779.png)

**flex-start**
複数行のアイテムを交差軸の始まる方向へ詰めて配置します。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/3deb33d3-73a6-7f43-a3a4-17eca078ecd5.png)

**flex-end**
複数行のアイテムを交差軸の終わる方向へ詰めて配置します。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/f2c012cb-c307-b73b-0066-d1dd71f07775.png)

**center**
複数行のアイテムを交差軸に対して上下中央揃えで配置します
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/3d63ccfb-e637-4e73-c523-58998662b793.png)

**space-between**
行と行の間のスペースを最大に使用するようにアイテムを配置します。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/4be73ee4-a7e4-d71f-e38e-8086001e8bfc.png)

**space-around**
両端も含め行と行のスペースを確保した状態で配置します。
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/f4d6f0f6-c194-a23e-df7e-cba6b7f3870e.png)

以上が親要素に指定できるプロパティになります。
プロパティやそれぞれのプロパティに入れられる値、
親要素だけでもたくさん種類がありますね…。
それぞれのプロパティが主軸、交差軸どの軸に対しての
配置を指定するものかを理解して、レイアウトをしていきましょう！
続いては子要素に指定できるプロパティになります。

## 子要素編

### order
アイテムの並び順を指定します

CSSで{order: 〇;}と記述し、〇の部分に変更したい順番の数字を入れます。
２番目にしたい場合は{order: 2;}と入力します。
以下CSS記述例↓
![Qiita用15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/fe7598ce-4351-3891-25f5-31402a2cd3fd.png)

結果↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/c6b98b43-959a-890f-2413-27c0e57daa2b.png)

### flex-basis
主軸をもとにしたアイテムの基本幅を指定します。
主軸が水平方向のためアイテムの横幅の指定になります。

CSSで{flex-basis: 〇;}と記述し、〇の部分に数値を入力します。
数値はpxや%などの単位を使います。
以下CSS記述例↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/3250dc9d-dcd9-967d-dec4-f423058c4d03.png)

結果↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/e27cb9d1-1a78-7ec0-e4fd-0cbe26e62751.png)

### flex-grow
コンテナ内の余った空間の割り当て方について指定します
CSSで{flex-grow: 〇;}と記述し、〇の部分に数値を入力します。
〇の値は余った空間へ当てられる割合となります。
(値が大きい方が余ったスペースを広く割り当てられる)
以下CSS記述例↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/7ffb7d79-05e1-f77a-f6ed-7b65c8e67ec2.png)

結果↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/d41b7efc-7751-1a82-b244-34b4607f6646.png)

### flex-shrink
アイテムがコンテナより大きいときの縮小のさせ方を指定します
CSSで{flex-shrink: 〇;}と記述し、〇の部分に数値を入力します。
〇の値は縮小される場合の優先度となります。
(値が大きい方が他の要素より縮小する割合が大きくなる)
以下CSS記述例↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/c164ffc4-5418-a825-cc4c-561edbd85a98.png)

結果↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/c97d27a0-6b26-0eea-1c43-4c09f27822f0.png)

### flex
flex-grow、flex-shrink、flex-basisを同時に指定します
記述する際は左から[flex-growの値]　[flex-shrinkの値]　[flex-basisの値]と記述します。
それぞれの値は半角スペースで区切ります。
以下CSS記述例↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/db81c1c5-9249-7789-0ae8-5227122c3591.png)

結果↓
![Qiita用16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632606/5ebda3fb-822f-f897-cdd2-453a77bb85e3.png)

以上が子要素に指定できるプロパティになります。

# まとめ
　以上がflexboxについてのまとめとなります。
本記事を読んでflexboxへの解像度が高まった！という風に思っていただければ幸いです。
自分自身この記事をまとめていく中で、flexboxのプロパティ、
それぞれの値についてまとめの理解が以前より深まったように感じました。

ですが、flexbox含めCSSは言葉の意味を覚えるより実際に書くことが一番の上達の道だと
思うので、実際にコードを書くうえでflexboxに対する理解を深めていければと思います。

最後までご覧いただきありがとうございました。

# 参考
https://breezegroup.co.jp/202006/css-boxmodel-flexbox/