フレックスボックスレイアウトでよこ並び
CSSの「フレックスボックスレイアウト」は、要素を“柔軟に並べる”ために、用意されたレイアウトモデルです。displayプロパティにflexという値を指定することで利用できます。そんなフレックスボックスレイアウトを使って、よこ並び、始めます!
フレックスボックスこそよこ並び
floatプロパティは要素を左右に寄せるためのプロパティだし、displayプロパティのtable
は、テーブル(表)をレイアウトするための値だし、inline-block
はあくまでブロック要素だし、どれも特別にコンテンツを並べるためのプロパティというわけではありませんでした。
けれどもフレックスボックスレイアウト(CSS Flexible Box Layout)は、指定した要素の大きさを柔軟に伸縮させ、画面サイズに対して最適な大きさで表示させるために用意されたレイアウトモデルなんです。ただし“一次元でのレイアウト”に特化したプロパティなので、つまり並べるためのプロパティってことになります。
ナビゲーションをよこ並び
ul要素にdisplayプロパティでflex
を指定します。
フレックスボックスレイアウトでは、flex
を指定した要素自体がよこ並びになるわけではなくて、flex
を指定した要素の直接の子要素が並ぶ対象となります。
ただ、テーブルレイアウトでは、子要素にもtable-cell
と明示的に指定する必要がありましたが、フレックスボックスレイアウトでは、特別にスタイルを指定しなくても、親要素にdisplay: flex
と指定するだけで、子要素が勝手によこ並びになるので、ちょっと不思議な感じですよね。
さぁ、これでli要素はすべて、フレキシブルな要素になりました:D!
現状、フレックスボックスレイアウト関連プロパティの初期値によって、すべてよこ並びでレイアウトされた状態です。
フレックスボックスの基本概念
displayプロパティでflex
と指定した要素は「フレックスコンテナー」、その直接の子要素は「フレックスアイテム」という状態になります。
要素が並ぶ方向の軸を「主軸」、それに垂直に交わる軸を「交差軸」と呼びます。
フレックスボックスレイアウト関連プロパティには、コンテナーに指定するプロパティ、アイテムに指定するプロパティや、主軸に効くプロパティ、交差軸に効くプロパティが個々にあるので、この基本概念はとても大事です¦‹。
直接の子要素というのもポイントで、孫要素はフレキシブルにはならないので注意です。
フレックスボックスについて、詳しくは下記ページを参照のこと。
フレックスボックスの基本概念 - CSS: カスケーディングスタイルシート | MDN
中央に配置する
要素を中央に配置するには、justify-contentプロパティを使います。justify-contentプロパティはコンテナーに指定するプロパティで、アイテムの主軸方向の配置の仕方を決めるためのプロパティです。ここではcenter
という値を指定しています。
ボタンのサイズを揃える
アイテムの横幅を制限するには、アイテムに対してflex-basisプロパティを使います。下のサンプルでは、12em
に指定しています。
文字数によってリンクボタンの大きさが揃わないのは、フレックスボックスレイアウトでも同じですね…。
よく見ると、li要素の高さは揃っているので、a要素の高さを100%
と指定してやればリンクボタンの高さも揃いそうです。a要素にはパディングが付いているので、box-sizingプロパティでborder-box
を指定するのも忘れずに:‹。
リンクボタンの高さが揃いましたね!あとは中のテキストも中央に配置したいところなのですが、ここでまたフレックスボックスです、a要素もフレックスボックスにしちゃいます:)。
a要素がフレックスコンテナーになると、その中のテキストがフレックスアイテムになります。
フレックスアイテムを中央に配置するには、justify-contentプロパティとalign-itemsプロパティを使います。どちらもコンテナーに対して指定するプロパティで、ここではどっち共にcenter
を指定します。
横幅いっぱいに広げる
横幅いっぱいに広げるには、アイテムに対して、flex-growプロパティで1
以上の数値を指定します。
ここで指定した数値は、コンテナー内の余った領域を、各アイテムにどう分配するかの割合を表します。ここではアイテム全てに対して1
を指定しているので、アイテムそれぞれに同じ分ずつ余白が分配されることになります。
上サンプルの下段はテーブルレイアウトでよこ並びしたもの。きちんと分配している分、フレックスボックスレイアウトの方がアイテムのバランスがよいのがわかりますね:o。
レスポンシブにする
スマホではたて並びになるようにしましょう。他の記事の時みたく、ビューポート幅が狭い時だけフレックスボックスレイアウトにするという指定でもよいのですけれど、せっかくフレキシブルなので、この切り替えもフレキシブルに行うことにします:D!
前述のflex-directionプロパティを使って並びの向きを変えます。メディアクエリで、767px以下の時のみ、ul要素にflex-direction: column
と指定します。
フレックスボックスで商品一覧
ul要素に、displayプロパティでflex
とすれば、ul要素がフレックスコンテナー、li要素がフレックスアイテムと成り、フレックスボックスレイアウト関連のプロパティで扱えるようになるんでしたね。
さっそく、おもむろに、商品一覧にもdisplay: flex
を適用し、商品が3列に並ぶよう、li要素にflex-basisプロパティで33.333%
と指定します。
よこ並びになりましたが、全部一列に並んじゃいましたー⁑|!
フレックスボックスレイアウトでは、専用のflex-wrapプロパティというプロパティの初期値がnowrap
となっていて、改行しないことになってるんです。フレックスアイテムを改行させたい場合には、改行する旨を指定しなくてはいけません。
flex-wrap: wrap
と指定すると、うまく改行するようになりました。
レスポンシブにする
他の記事と同じく、メディアクエリを使って、767px以下の時は2列、428px以下の時には1列になるように調整します。
下サンプルでは、ビューポート幅ごとにflex-basisプロパティの値を50%
、auto
と切り替えています。
より意図にあったカタチで、効率よく指定するならば以下のようになります。
他の記事の時みたく「429px以上の時だけにフレックスボックスレイアウトを適用する」というやり方じゃなくて、常にフレックスボックスレイアウトのまま、縦一列になる時だけflex-directionでたて並びとなるようにしました:)。フレックスボックスレイアウトの「アイテム並び替え」という機能を享受したいのでね;D。
グリッドでよこ並び