Skill up Log

Let's get skills with me.

【CSS】いま一度Flexboxを見直す【レイアウト】

CSS
CSS

最近Twitterで「要素を横並びにするやり方」について悩んでいるツイートを見たので、自分もなんとなく使っていたFlexboxについて見直すことにしました。

  • 「Flexboxはなんとなく知ってる」
  • 「align-itemsとjustify-contentしか使ったことない」
  • 「横並びはfloat使ってますが?」
  • 「そもそも要素の横並びができない!」

という疑問を解決できると思うので是非最後まで読んでください。

Flexboxとは

FlexboxとはCSSレイアウトの一つです。
ボックスを横並びにするのはもちろん、縦並びや順番の入れ替えなどカンタンなコードで色々なことができます。

FlexboxのCSSプロパティは親要素(Flexコンテナー)に指定するもの子要素(Flexアイテム)に指定するものに分けられます。

※2020年2月現在のサポート状況はこちら
Can I use... Support tables for HTML5, CSS3, etc

今回サンプルで使用するHTMLはこちらになります。

<div id="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
</div>

ブロック要素
display: block;


親要素(Flexコンテナー)に指定するプロパティ

display: flex;

この指定は必須です。(インライン要素に指定するときはinline-flex
親要素はFlexコンテナー、子要素はFlexアイテムになります。
親要素にdisplay: flex;を指定することで子要素は横並びになります。

Flexbox
display: flex;

flex-direction

flex-directionは子要素の並ぶ向きを指定します。

  • row(初期値)… 左から右へ
  • row-reverse … 右から左
  • column … 上から下
  • column-reverse … 下から上

flex-direction
flex-direction

flex-wrap

flex-wrapは子要素の折返しを指定します。

  • nowrap(初期値)… 折り返さない
  • wrap … 折り返す
  • wrap-reverse … 折り返して順番を逆にする

flex-wrap
flex-wrap

justify-content

justify-contentは子要素の水平位置を揃えます。

  • flex-start(初期値)… 親要素の一番上に揃える
  • flex-end … 親要素の一番下に揃える
  • center … 親要素の水平中央に揃える
  • space-between … 親要素の上下を空けずに等間隔で揃える
  • space-around … 親要素の上下を空けて等間隔で揃える

justify-content
justify-content

align-items

align-itemsは子要素の垂直位置を揃えます。

  • stretch(初期値)… 親要素いっぱいに広げて揃える
  • flex-start … 親要素の一番上に揃える
  • flex-end … 親要素の一番下に揃える
  • center … 親要素の上下中央に揃える
  • baseline … ベースラインに沿って揃える

align-items
align-items


★小ワザ
親要素の中に子要素を天地中央に配置するというのはよくあります。
水平の中央揃えはtext-align: center;で難しくはないですが、天地の中央揃えは結構大変だと思います。

私もpaddingやpositionで揃えることが多かったのですが、レスポンシブへの対応の問題とコードの保守性がよくないと思っていました。
Flexboxのjustify-conetnt: center;align-items: center;で超カンタンに天地中央揃えができます!

下にサンプルコードを載せておきます。


See the Pen
justify-content, align-items
by piko525 (@piko525)
on CodePen.

align-content

align-contentは子要素が複数行になったときの垂直位置を揃えます。

  • stretch(初期値)… 親要素の上下いっぱいに広げて揃える
  • flex-start … 親要素の一番上に揃える
  • flex-end … 親要素の一番下に揃える
  • center … 親要素の上下中央に揃える
  • space-between … 親要素の上下を空けずに等間隔に揃える
  • space-around … 親要素の上下を空けて等間隔に揃える

align-content
align-content


子要素(Flexアイテム)に指定するプロパティ

基本的に子要素に指定するプロパティは個別にします。

order

orderは子要素の順番を指定します。

order
order


★小ワザ
デザイン上では画像→見出し→画像の説明の順番で並んでいて、HTMLのマークアップは見出し→画像→画像の説明としたい場合などに使えます。
HTMLでの順番を気にせずに要素の順番を自由に変えられるのが強みですね。

下にサンプルコードを載せておきます。


See the Pen
order
by piko525 (@piko525)
on CodePen.

flex-grow

flex-growは子要素を並べたときにフリースペースがある場合、
子要素の伸び率を指定
できます。

  • 0(初期値)マイナス値は無効

空いたスペースを誰がどのくらいの割合で使うかというイメージです。

flex-grow
flex-grow
flex-grow
flex-grow

flex-shrink

flex-shrinkは子要素を並べたときにフリースペースがない場合、
子要素の縮み率を指定
できます。

本来はみ出すはずの子要素を縮めて親要素に収めています。
縮めたときに誰がどのくらいの割合のスペースを使うかというイメージです。

  • 1(初期値)マイナス値は無効

flex-shrink
flex-shrink
flex-shrink
flex-shrink

flex-basis

flex-basisは子要素の初期サイズを指定できます。

  • auto(初期値)widthを指定

flex-basis
flex-basis

align-self

align-selfは子要素の垂直位置を揃えますalign-itemsを上書きできます。
align-itemsと異なるのは、個別に垂直位置を揃えられるところです。

  • auto(初期値)… 親要素の上下いっぱいに広げる
  • flex-start … 親要素の一番上に揃える
  • flex-end … 親要素の一番下に揃える
  • center … 親要素の上下中央に揃える
  • baseline … ベースラインに沿って揃える
  • stretch … 親要素の上下いっぱいに広げる

align-self
align-self



Flexboxのプロパティは組み合わせて使うことが多いので、複雑なレイアウトを少ないコードで実装していきたいですね。