HTML/CSS / LESSON 13 / HT13

HTML/CSS:Flexbox

1学習の目的

2基礎解説

親要素に display: flex を指定するだけで、中の要素が横並びになります。あとは親側のプロパティで配置を調整していきます。

プロパティ役割よく使う値
display: flex横並びにするこれが出発点
justify-content横方向の配置center / space-between
align-items縦方向の配置center
gap要素同士の間隔16px / 24px
✅ 覚えるべき重要ポイント
  1. 指定するのは「親」、動くのは「子」display: flex は親に書き、子は自動的に横並びになる。子側に何も書かなくてよい。
  2. justify-content は横、align-items は縦。この2つを組み合わせれば、上下左右の中央揃えが2行で完成する
  3. gap で間隔を空ける。margin と違い、両端に余分な余白が付かないので、等間隔の配置が簡単になる。
  4. flex: 1 で残りの幅を埋める。固定幅の要素と組み合わせれば、「片方は固定、もう片方は伸縮」というレイアウトが作れる。
  5. 既定では折り返さない。画面が狭いと要素が縮んでしまうので、flex-wrap: wrap を指定すると折り返すようになる(レスポンシブで重要)。

現場使用例:ナビゲーションバー、カードの横並び、ヘッダーのロゴとメニュー、ボタンの並び、フォームの入力欄とボタン。現代のWebレイアウトの中心的な技術

/* 基本:親に display: flex */
.container {
  display: flex;
}

/* 横方向の配置 */
.container {
  display: flex;
  justify-content: center;         /* 中央 */
  /* flex-start(左)/ flex-end(右)
     space-between(両端に寄せて等間隔)
     space-around(周囲に均等な余白) */
}

/* 縦方向の配置 */
.container {
  display: flex;
  align-items: center;             /* 縦中央 */
  height: 200px;
}

/* ⭐ 上下左右の完全な中央揃え */
.center {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 300px;
}

/* 等間隔に配置(両端に余白なし) */
.list {
  display: flex;
  gap: 20px;
}

/* 片方を固定、もう片方を伸縮 */
.layout { display: flex; }
.sidebar { width: 200px; }         /* 固定 */
.main    { flex: 1; }              /* 残り全部 */

/* 縦並びに変える */
.vertical {
  display: flex;
  flex-direction: column;
}

/* 画面が狭いとき折り返す */
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

3基本ドリル(10問)

HT13-D01 3つの div を Flexbox で横並びにせよ(各 幅 100px・高さ 50px・背景 #ccc)。 コーディング★☆☆無料
期待される結果

3つが横に並ぶ

ヒント

親に display: flex; を指定するだけ。子には何も書かなくてよい。

模範解答
<style>
  .container {
    display: flex;
  }

  .box {
    width: 100px;
    height: 50px;
    background-color: #ccc;
  }
</style>

<div class="container">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
</div>
解説

div は block なのに横に並んだ。親が flex になると、子の display は無視されて自動的に横並びになる。

HT13-D02 display: flex はどこに指定するか。
A. 並べたい要素すべて B. 親要素だけ C. body D. 子要素だけ
選択★☆☆無料
期待される結果

解答 == B

ヒント

指定するのは1箇所だけ。

模範解答
B
解説

親に1行書くだけ。子側には何も指定しなくてよいので、inline-block より記述量が少ない。

HT13-D03 Flexbox で横方向の中央に要素を配置せよ(親の幅 600px、子は幅 100px が2つ)。 コーディング★☆☆無料
期待される結果

justify-content が center

ヒント

justify-content: center; を使う。

模範解答
<style>
  .container {
    display: flex;
    justify-content: center;
    width: 600px;
  }

  .box {
    width: 100px;
    height: 50px;
    background-color: #ccc;
  }
</style>

<div class="container">
  <div class="box">1</div>
  <div class="box">2</div>
</div>
解説

justify-content は横方向の配置を決める。center のほか、flex-end(右寄せ)や space-between(両端寄せ)がある。

HT13-D04 縦方向の配置を指定するプロパティを補ってコードを完成させよ。 穴埋め★☆☆無料
コード
<style>
  .container {
    display: flex;
    ____: center;
    height: 200px;
  }
</style>

<div class="container">
  <div>縦中央</div>
</div>
期待される結果

align-items が center

ヒント

「項目を揃える」を意味する11文字のプロパティ(ハイフン含む)。

模範解答
align-items
解説

align-items は縦方向。justify-content(横)と対になっており、この2つで上下左右の配置が決まる。

HT13-D05 要素を両端に寄せて等間隔に配置する値はどれか。
A. center B. space-between C. flex-end D. stretch
選択★☆☆無料
期待される結果

解答 == B

ヒント

「間にスペースを配る」という意味の値。

模範解答
B
解説

space-between は最初と最後を端に置き、間を均等に空ける。ヘッダーで「ロゴを左、メニューを右」にするときの定番。

HT13-D06 上下左右の完全な中央に要素を配置せよ(親の高さ 300px・幅 400px、背景 #eee)。 コーディング★★☆広告解放
期待される結果

justify-contentとalign-itemsが両方center

ヒント

justify-content と align-items の両方を center にする。

模範解答
<style>
  .center {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 400px;
    height: 300px;
    background-color: #eee;
  }
</style>

<div class="center">
  <p>完全な中央</p>
</div>
解説

たった2行で上下左右の中央揃えが完成する。Flexbox以前は、この単純な要求に複雑な手法が必要だった。

HT13-D07 要素同士の間隔を空けるプロパティを補ってコードを完成させよ。 穴埋め★★☆広告解放
コード
<style>
  .container {
    display: flex;
    ____: 20px;
  }

  .box { width: 100px; }
</style>

<div class="container">
  <div class="box">1</div>
  <div class="box">2</div>
</div>
期待される結果

gap が 20px

ヒント

「隙間」を意味する3文字のプロパティ。

模範解答
gap
解説

gap は要素の「間」だけに余白を作る。margin と違って両端に余分な余白が付かないので、等間隔の配置が簡単になる。

HT13-D08 flex: 1 を指定するとどうなるか。
A. 幅が1pxになる B. 残りの幅をすべて埋める C. 1番目に表示される D. 変化しない
選択★★☆広告解放
期待される結果

解答 == B

ヒント

余った空間をどう使うかの指定。

模範解答
B
解説

他の要素の幅を引いた残り全部に広がる。「サイドバーは200px固定、本文は残り全部」というレイアウトが簡単に作れる。

HT13-D09 サイドバー(幅200px固定)と本文(残り全部)の2カラムレイアウトを作れ(親の幅 500px)。 コーディング★★☆広告解放
期待される結果

サイドバー200px、本文300px

ヒント

サイドバーに width: 200px、本文に flex: 1 を指定する。

模範解答
<style>
  .layout {
    display: flex;
    width: 500px;
  }

  .sidebar {
    width: 200px;
    background-color: #ddd;
  }

  .main {
    flex: 1;
    background-color: #f5f5f5;
  }
</style>

<div class="layout">
  <div class="sidebar">サイドバー</div>
  <div class="main">本文</div>
</div>
解説

本文は自動的に300pxになる(500 − 200)。親の幅が変わっても、本文が伸縮して隙間なく収まる。

HT13-D10 Flexbox で要素を縦並びにせよ(2つの div、各高さ 40px)。 コーディング★★☆広告解放
期待される結果

flex-direction が column

ヒント

flex-direction: column; を指定する。

模範解答
<style>
  .container {
    display: flex;
    flex-direction: column;
  }

  .box {
    height: 40px;
    background-color: #ccc;
  }
</style>

<div class="container">
  <div class="box">1</div>
  <div class="box">2</div>
</div>
解説

column にすると縦に積まれる。このとき justify-content が縦方向、align-items が横方向に入れ替わる点に注意。

4実践シナリオ(5問)

HT13-S01 【ヘッダーのレイアウト】header を Flexbox にし、ロゴを左・メニューを右に配置せよ(space-between を使い、縦は中央揃え。親の幅 800px・高さ 60px)。 コーディング★★☆広告解放
期待される結果

space-betweenとalign-items:centerが正しい

ヒント

justify-content: space-between; と align-items: center; を組み合わせる。

模範解答
<style>
  header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 800px;
    height: 60px;
    padding: 0 20px;
    box-sizing: border-box;
    background-color: #f5f5f5;
  }

  nav a {
    margin-left: 16px;
    text-decoration: none;
  }
</style>

<header>
  <div class="logo">ゼロカラカフェ</div>

  <nav>
    <a href="#">ホーム</a>
    <a href="#">メニュー</a>
  </nav>
</header>
解説

これが現代的なヘッダーの標準形。space-between で両端に寄せ、align-items で高さの中央に揃える——2行でほぼ完成する。

HT13-S02 【カードの等間隔配置】3つのカード(幅 150px・高さ 100px)を gap 20px で横に並べよ。 コーディング★★☆広告解放
期待される結果

gapが20px、3つが等間隔

ヒント

gap を使えば margin より簡単に等間隔になる。

模範解答
<style>
  .cards {
    display: flex;
    gap: 20px;
  }

  .card {
    width: 150px;
    height: 100px;
    background-color: #ddd;
  }
</style>

<div class="cards">
  <div class="card">1</div>
  <div class="card">2</div>
  <div class="card">3</div>
</div>
解説

margin-right だと最後の要素にも余白が付いてしまう。gap なら間だけに空くので、余計な調整が不要になる。

HT13-S03 【ボタンの中央配置】幅 500px・高さ 200px の領域のど真ん中にボタンを配置せよ。 コーディング★★☆広告解放
期待される結果

上下左右とも中央

ヒント

justify-content と align-items の両方を center にする。

模範解答
<style>
  .hero {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 500px;
    height: 200px;
    background-color: #eee;
  }

  .btn {
    padding: 12px 32px;
    background-color: #0066cc;
    color: #ffffff;
    border: none;
    border-radius: 4px;
  }
</style>

<div class="hero">
  <button class="btn">今すぐ始める</button>
</div>
解説

ヒーローエリアの定番。中身が何であっても(文字・ボタン・画像)、この2行で確実に中央に来る。

HT13-S04 【折り返すカード一覧】幅 250px の親の中に、幅 100px のカードを3つ配置し、入りきらない分は折り返すようにせよ(gap 20px)。 コーディング★★★広告解放
期待される結果

3つ目が2行目に折り返す

ヒント

flex-wrap: wrap; を指定しないと、カードが縮んで1行に収まってしまう。

模範解答
<style>
  .cards {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
    width: 250px;
  }

  .card {
    width: 100px;
    height: 60px;
    background-color: #ddd;
  }
</style>

<div class="cards">
  <div class="card">1</div>
  <div class="card">2</div>
  <div class="card">3</div>
</div>
解説

wrap が無いと、カードが潰れて1行に押し込まれる。指定した幅が守られなくなるので、カード一覧では必須の指定になる。

HT13-S05 【入力欄とボタン】幅 500px の中に、入力欄(伸縮)とボタン(120px固定)を横に並べよ(gap 8px)。 コーディング★★★広告解放
期待される結果

入力欄が伸縮、ボタンが120px

ヒント

入力欄に flex: 1、ボタンに width: 120px を指定する。

模範解答
<style>
  .search {
    display: flex;
    gap: 8px;
    width: 500px;
  }

  .search input {
    flex: 1;
    padding: 10px;
    border: 1px solid #ccc;
  }

  .search button {
    width: 120px;
    background-color: #0066cc;
    color: #ffffff;
    border: none;
  }
</style>

<div class="search">
  <input type="text" placeholder="検索キーワード">
  <button>検索</button>
</div>
解説

入力欄が残りの幅をすべて使う。画面幅が変わってもボタンは120pxのまま、入力欄だけが伸縮する——検索フォームの定番構成。

5仕上げ課題

HT13-FINAL 【ページ全体のレイアウト】Flexbox を使い、実務的なページ構造を組み立てよ。

① ヘッダー.header
display: flexspace-between、縦中央
・幅 900px、高さ 64px、padding 0 24px、box-sizing 指定
・中身:div.logo と nav(nav の中に a × 2、gap は nav 側で 20px

② カード一覧.cards
display: flexflex-wrap: wrapgap: 24px、幅 900px
.card:幅 280px、padding 20px、枠線 1px solid #ddd、box-sizing 指定
・カードを3つ配置(各カードに h3 と p)

③ 2カラム.layout
display: flexgap: 24px、幅 900px
.sidebar:幅 240px 固定
.mainflex: 1(残り全部)

確認したいこと
・カードは3つとも1行に収まる(280×3 + 24×2 = 888 ≤ 900)
.main の幅が636px(900 − 240 − 24)
総合★★★広告解放
期待される結果

すべてのレイアウトと寸法が正しい

ヒント

nav にも display: flex と gap を指定する。カードは 280px × 3 + gap 24px × 2 = 888px なので900pxに収まる。main は flex: 1 で残り幅(900 - 240 - 24 = 636px)になる。

模範解答
<style>
  * {
    box-sizing: border-box;
  }

  .header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 900px;
    height: 64px;
    padding: 0 24px;
    background-color: #f5f5f5;
  }

  .header nav {
    display: flex;
    gap: 20px;
  }

  .header a {
    text-decoration: none;
    color: #0066cc;
  }

  .cards {
    display: flex;
    flex-wrap: wrap;
    gap: 24px;
    width: 900px;
  }

  .card {
    width: 280px;
    padding: 20px;
    border: 1px solid #ddd;
  }

  .layout {
    display: flex;
    gap: 24px;
    width: 900px;
  }

  .sidebar {
    width: 240px;
    background-color: #eee;
  }

  .main {
    flex: 1;
    background-color: #f9f9f9;
  }
</style>

<div class="header">
  <div class="logo">ゼロカラカフェ</div>

  <nav>
    <a href="#">ホーム</a>
    <a href="#">メニュー</a>
  </nav>
</div>

<div class="cards">
  <div class="card">
    <h3>ブレンドコーヒー</h3>
    <p>当店自慢の一杯です。</p>
  </div>

  <div class="card">
    <h3>季節のケーキ</h3>
    <p>旬の素材を使っています。</p>
  </div>

  <div class="card">
    <h3>ランチセット</h3>
    <p>平日限定でご用意。</p>
  </div>
</div>

<div class="layout">
  <div class="sidebar">サイドバー</div>
  <div class="main">本文エリア</div>
</div>
解説

3種類のレイアウトが、すべて Flexbox だけで組めている。ヘッダーの両端配置、カードの折り返し、2カラム——かつては float や position を駆使して実現していたものが、数行で書ける。

.main { flex: 1; } の計算に注目してほしい。親が900px、サイドバーが240px、gap が24px——残りの636pxを main が自動的に埋める。数値を計算して書く必要がないのが重要で、親の幅が変わっても常に隙間なく収まる。

カードの flex-wrap: wrap も欠かせない。280px × 3 + gap 48px = 888px でギリギリ収まっているが、もし親が800pxになれば3つ目が自動的に次の行へ折り返す。wrap が無ければカードが潰れて幅280pxが守られない。

そして gap だ。margin で間隔を作ると最後の要素にも余白が付いて右端がずれるが、gap なら間だけに空く。この小さな違いが、レイアウトの精度を大きく左右する。

次章では Grid を学ぶ。Flexbox が1方向の並びを得意とするのに対し、Grid は行と列の両方を同時に制御できる——用途に応じた使い分けを身につける。