【CSS】いま一度Flexboxを見直す【レイアウト】
最近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>
親要素(Flexコンテナー)に指定するプロパティ
display: flex;
この指定は必須です。(インライン要素に指定するときはinline-flex)
親要素はFlexコンテナー、子要素はFlexアイテムになります。
親要素にdisplay: flex;を指定することで子要素は横並びになります。
flex-direction
flex-directionは子要素の並ぶ向きを指定します。
- row(初期値)… 左から右へ
- row-reverse … 右から左
- column … 上から下
- column-reverse … 下から上
justify-content
justify-contentは子要素の水平位置を揃えます。
align-items
align-itemsは子要素の垂直位置を揃えます。
- stretch(初期値)… 親要素いっぱいに広げて揃える
- flex-start … 親要素の一番上に揃える
- flex-end … 親要素の一番下に揃える
- center … 親要素の上下中央に揃える
- baseline … ベースラインに沿って揃える
★小ワザ
親要素の中に子要素を天地中央に配置するというのはよくあります。
水平の中央揃えはtext-align: center;で難しくはないですが、天地の中央揃えは結構大変だと思います。
私もpaddingやpositionで揃えることが多かったのですが、レスポンシブへの対応の問題とコードの保守性がよくないと思っていました。
Flexboxのjustify-conetnt: center;とalign-items: center;で超カンタンに天地中央揃えができます!
下にサンプルコードを載せておきます。
See the Pen
justify-content, align-items by piko525 (@piko525)
on CodePen.
子要素(Flexアイテム)に指定するプロパティ
基本的に子要素に指定するプロパティは個別にします。
order
orderは子要素の順番を指定します。
★小ワザ
デザイン上では画像→見出し→画像の説明の順番で並んでいて、HTMLのマークアップは見出し→画像→画像の説明としたい場合などに使えます。
HTMLでの順番を気にせずに要素の順番を自由に変えられるのが強みですね。
下にサンプルコードを載せておきます。
flex-grow
flex-growは子要素を並べたときにフリースペースがある場合、
子要素の伸び率を指定できます。
- 0(初期値)マイナス値は無効
空いたスペースを誰がどのくらいの割合で使うかというイメージです。