CSSのflexboxで要素を横並びにする基本(display: flex)

ブロック要素を横に並べたいとき、最も手軽で確実な方法が display: flex だ。親要素に flex を指定するだけで子要素が横並びになり、間隔や配置も柔軟に制御できる。

基本の横並び

親要素に display: flex を指定すると、直接の子要素(フレックスアイテム)が自動的に横並びになる。

HTML
CSS
JavaScript
<div class="flex-container">
  <div class="item">A</div>
  <div class="item">B</div>
  <div class="item">C</div>
</div>
.flex-container {
  display: flex;
  gap: 12px;
}
.item {
  background: #6366f1;
  color: #fff;
  padding: 16px 24px;
  border-radius: 6px;
  font-weight: bold;
}

gap プロパティで子要素間のスペースを設定している。margin で個別に指定するより管理しやすい。

主軸と交差軸

flexbox には 2 つの軸がある。要素が並ぶ方向を主軸(main axis)、それに直交する方向を交差軸(cross axis)と呼ぶ。初期状態では主軸が横方向、交差軸が縦方向になっている。

flex-direction: row(初期値)

主軸が横方向。子要素は左から右に並ぶ。一般的な横並びレイアウトで使用する。

flex-direction: column

主軸が縦方向。子要素は上から下に並ぶ。通常のブロック要素と同じ方向だが、flexbox の整列プロパティが使えるメリットがある。

justify-content で主軸方向の配置を制御する

子要素を主軸上のどこに置くかを決めるのが justify-content だ。

HTML
CSS
JavaScript
<div class="jc-demo between">
  <div class="item">A</div>
  <div class="item">B</div>
  <div class="item">C</div>
</div>
.jc-demo {
  display: flex;
  padding: 12px;
  background: #f1f5f9;
  border-radius: 6px;
}
.between {
  justify-content: space-between;
}
.item {
  background: #6366f1;
  color: #fff;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 14px;
}

space-between を指定すると、最初と最後の要素が端に寄り、残りの要素が均等に配置される。ナビゲーションバーでロゴを左端、メニューを右端に配置するパターンでよく使われる。

配置
flex-start左寄せ(初期値)
flex-end右寄せ
center中央揃え

space-around や space-evenly もあるが、実務で使う頻度が高いのは上の 3 つと space-between だ。

align-items で交差軸方向の配置を制御する

主軸に対して垂直方向の揃え方を決めるのが align-items になる。高さの異なる要素を縦方向に揃えるときに欠かせない。

.flex-container {
  display: flex;
  align-items: center;
  min-height: 100px;
}

center を指定すると、高さの異なる子要素が縦方向の中央に揃う。初期値は stretch で、子要素が親の高さいっぱいに引き伸ばされる。

flex-wrap で折り返す

初期状態では子要素は 1 行に収まるよう縮小される。要素数が多いとき、折り返して複数行にするには flex-wrap: wrap を使う。

.flex-container {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}
.item {
  flex: 0 0 calc(33.333% - 8px);
}

この例では各アイテムの幅を約 3 分の 1 に設定し、3 列で折り返すレイアウトを実現している。calc の中で gap 分を引くのが正確なサイズ調整のポイントだ。

flex プロパティで伸縮を制御する

子要素の flex プロパティは、余白をどう分配するかを決める。flex: 1 を指定すると、利用可能なスペースを均等に分け合う。

HTML
CSS
JavaScript
<div class="flex-grow-demo">
  <div class="sidebar">sidebar</div>
  <div class="main">main(flex: 1)</div>
</div>
.flex-grow-demo {
  display: flex;
  gap: 12px;
  font-size: 14px;
}
.sidebar {
  background: #e2e8f0;
  padding: 16px;
  border-radius: 6px;
  width: 120px;
}
.main {
  background: #dbeafe;
  padding: 16px;
  border-radius: 6px;
  flex: 1;
}

サイドバーは固定幅 120px、メインコンテンツが残りの幅をすべて占める。この「固定幅 + 可変幅」の組み合わせは、実務のレイアウトで非常によく登場するパターンだ。

flexbox は横並びだけでなく、中央寄せや均等配置など多くのレイアウト課題を解決する。まずは display: flex と gap、justify-content、align-items の 4 つを覚えておけば、大半のケースに対応できる。