横並び配置 flexbox
Image by 5311692 from Pixabay
2020.12.09(更新日:2021.03.23)
中央、均等揃えなど比較的シンプルな記述で表示出来る、今や当たり前の様に使つてる「flexbox」。
子要素の順番入れ替えなんかも出来て、レスポンシブデザインには欠かせない。
そんなflexboxの普段使いのまとめ。
この記事は1年以上経過しています。内容的に古い場合があります。
HTML
親要素の中に横並びにしたい子要素(直下)が基本型。
/* HTML */
<div class="wrapper"></div>
<div>要素1</div>
<div>要素2</div>
<div>要素3</div>
</div>
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
これだけで要素1、2、3が横並びになる。また初期値で範疇に含まれる子要素たちは、親要素の高さに合わせて伸びてくれる。(ただし設定により変動)以下これをベースにまとめる。
(ベンダープリフィクスは「Autoprefixer CSS online」でBrowsers: last 4 versionのものを使用)
子要素を折り返し指定 flex-wrap
通常そのままだと子要素の幅が設定されていても折り返さない。親要素の幅が縮む分、子要素も小さくなる。
折返しを決める「flex-wrap」が「nowrap」が初期値となるようだ。
/* 折り返さないコード */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: nowrap; /* 初期値 */
flex-wrap: nowrap; /* 初期値 */
}
折り返す場合は「wrap」に変更する。
/* 折り返すコード */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
当然だが、子要素の幅を設定しておかないと意味がない。
なお親の幅(ブラウザの幅)で子の幅を変更したい場合などはメディアクエリで分ける。
/* 例:ブラウザ幅が768px以内の場合 */
@media (max-width: 768px) {
.wrapper > div {
width: 100%; /* 横並びしない */
}
}
/* 例:ブラウザ幅が769px以上の場合 */
@media (min-width: 769px) {
.wrapper > div {
width: 30%; /* 3つ並ぶ */
}
}
横並びの「揃え方」を指定 justify-content
均等割り space-between
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
}
DTPでいう「行頭行末揃え」。これだけで余白分を均等にして左右いっぱいに広がってくれる。
「画像と文章を横並び」なんてレイアウトはこれで解決。
中央揃え center
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
子要素たちを中央寄せにしてくれる。(余白分は左右均等に空く)
justify-contentの値は他にあるが、大抵使うのはこんなところなので詳しく知りたい人は以下参照。
並び方・方向の変更 flex-direction
例えば「画像が左、文章右」のレイアウトで、次の段は「画像が右、文章左」…でもスマホでは「画像が上で文章下」にしたい場合など、いちいちHTMLコードをテレコにしたり、それ用の重複コードを書かなくとも済むので大変重宝。
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row; /* 初期値(横) */
}
横並びを逆順に row-reverse
子要素の並び順が左から「要素3、要素2、要素1」となる。
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:reverse;
-ms-flex-direction:row-reverse;
flex-direction:row-reverse;
}
縦並びの場合は column
積み重なる並びにする場合。(縦方向に要素を並べる)
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
縦並びを逆順に column-reverse
積み重なった子要素の並び順が上から「要素3、要素2、要素1」となる。
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: reverse;
-ms-flex-direction: column-reverse;
flex-direction: column-reverse;
}
縦軸位置指定 align-items
子要素の縦位置の指定が出来る。実際center以外はそんなに使わないけど。
/* CSS */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center; /* startで先頭、endで末尾 */
}
値をcenter、start、end(他もあり?かも)にすると、子要素本来の高さになる。(つまり高さを合わすことはしない)
横並び要素の高さを揃え、更に中身の縦位置を中心に…ってどうする?
flexboxを使い始めた頃、これで七転八倒した。解決方法はなんてことない「子要素にもflexbox」だった。
/* 子要素内にもう1階層pタグを加える */
<div class="wrapper"></div>
<div><p>要素1</p></div>
<div><p>要素2</p></div>
<div><p>要素3</p></div>
</div>
/* 親要素にflex */
.wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
/* 子要素にもflex */
.wrapper > div {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
フレックスのアイテム(子要素)にはすでに親要素のflexboxの影響があるので、重複するような指定は「だめじゃね?」と思っていたのは浅はかだった。