横並び配置 flexbox

横並び配置 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の影響があるので、重複するような指定は「だめじゃね?」と思っていたのは浅はかだった。