HTML/CSS / LESSON 18 / HT18

HTML/CSS:総合演習:企業サイトを作る

1学習の目的

2基礎解説

部品使う技術学んだ章
ページの骨組みセマンティックタグHT05
固定ヘッダーposition: fixed + FlexboxHT13・16
カード一覧Grid + 影 + ホバーHT14・17
スマホ対応メディアクエリHT15
✅ 制作の手順
  1. まずHTMLの骨組みを作る。header・main・footer から始め、セマンティックタグで構造を組む。この段階では見た目を気にしない
  2. 共通のリセットと基本設定を書く。* { box-sizing: border-box; }body { margin: 0; }img { max-width: 100%; } の3つは最初に。
  3. レイアウトを組む。大枠は Grid、部分的な並びは Flexbox——役割で使い分ける
  4. 装飾を加える。色・影・角丸・ホバー効果。ここまで来ると一気に「完成品」らしくなる。
  5. 最後にスマホ対応。画面幅を狭めて確認し、崩れる箇所をメディアクエリで直す。

この章の題材:カフェの1ページサイト。固定ヘッダー・ヒーロー・カード一覧・フッターという、実務で最も多い構成を作ります。

<!-- ページ全体の構成 -->
<header class="site-header">   <!-- 固定・Flexbox -->
<section class="hero">         <!-- グラデーション -->
<main>
  <section class="features">   <!-- Grid でカード一覧 -->
</main>
<footer class="site-footer">

/* 最初に書く3点セット */
* { box-sizing: border-box; }
body { margin: 0; }
img { max-width: 100%; height: auto; }

/* 中央寄せの共通コンテナ */
.container {
  max-width: 1000px;
  margin: 0 auto;
  padding: 0 20px;
}

/* 固定ヘッダー(本文に上余白が必要) */
.site-header {
  position: fixed;
  top: 0;
  width: 100%;
  height: 64px;
  z-index: 100;
}

.hero {
  margin-top: 64px;    /* ヘッダーの高さ分 */
}

/* カード一覧 */
.cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}

/* スマホ対応は最後に */
@media (max-width: 768px) {
  .cards { grid-template-columns: 1fr; }
}

3基本ドリル(10問)

HT18-D01 最初に書く3点セットを含むCSSを書け(全要素の box-sizing、body の margin 0、img の max-width 100% と height auto)。div も1つ配置すること。 コーディング★☆☆無料
期待される結果

3つの基本設定が正しい

ヒント

どのサイトでも最初に書く定型文。

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

  body {
    margin: 0;
  }

  img {
    max-width: 100%;
    height: auto;
  }
</style>

<div>本文</div>
解説

この3つを書かないと必ずどこかで崩れる。幅の計算がずれ、ページ端に隙間ができ、画像がはみ出す——最初に潰しておく。

HT18-D02 ページ制作の手順として適切な順番はどれか。
A. 装飾 → HTML → レイアウト B. HTML → レイアウト → 装飾 → スマホ対応 C. スマホ対応 → HTML D. レイアウト → HTML
選択★☆☆無料
期待される結果

解答 == B

ヒント

骨組みを作ってから肉付けする。

模範解答
B
解説

構造 → 配置 → 見た目 → 対応の順。装飾から始めると、レイアウトを変えるたびに作り直しになる。

HT18-D03 中央寄せの共通コンテナを作れ(max-width: 1000px、中央配置、左右 padding 20px、box-sizing 指定)。 コーディング★☆☆無料
期待される結果

max-widthと中央配置が正しい

ヒント

max-width と margin: 0 auto を組み合わせる。

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

  .container {
    max-width: 1000px;
    margin: 0 auto;
    padding: 0 20px;
  }
</style>

<div class="container">
  <p>コンテンツ</p>
</div>
解説

この container をページ中で使い回す。すべてのセクションで同じ幅に揃うので、縦のラインが通って整った印象になる。

HT18-D04 ヘッダーを画面に固定するコードを完成させよ。 穴埋め★☆☆無料
コード
<style>
  .site-header {
    position: ____;
    top: 0;
    width: 100%;
    height: 64px;
    background: #fff;
    z-index: 100;
  }
</style>

<header class="site-header">ヘッダー</header>
期待される結果

position が fixed

ヒント

画面に固定する値(5文字)。

模範解答
fixed
解説

fixed は場所を取らないので、下のコンテンツに margin-top でヘッダーの高さ分の余白が必要になる。

HT18-D05 大枠のレイアウトと部分的な横並びの使い分けとして適切なのはどれか。
A. すべてFlexbox B. 大枠はGrid、部分はFlexbox C. すべてGrid D. すべてfloat
選択★☆☆無料
期待される結果

解答 == B

ヒント

それぞれ得意分野が違う(HT14)。

模範解答
B
解説

格子状の配置はGrid、1方向の並びはFlexbox。実務では両方を併用するのが自然な形。

HT18-D06 固定ヘッダーとその下のコンテンツを作れ(ヘッダー:fixed・高さ64px・背景白・影・z-index 100/コンテンツ:margin-top: 64px)。 コーディング★★☆広告解放
期待される結果

ヘッダーがfixed、本文に上余白

ヒント

fixed は場所を取らないので、本文に必ず上余白を付ける。

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

  .site-header {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 64px;
    background-color: #ffffff;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
    z-index: 100;
  }

  .content {
    margin-top: 64px;
    padding: 40px 20px;
  }
</style>

<header class="site-header">ヘッダー</header>
<div class="content">本文コンテンツ</div>
解説

margin-top を忘れると本文がヘッダーの下に潜る。固定ヘッダーを作ったら、必ずセットで余白を確保する。

HT18-D07 カードを3列に並べるコードを完成させよ。 穴埋め★★☆広告解放
コード
<style>
  .cards {
    display: grid;
    grid-template-columns: ____(3, 1fr);
    gap: 24px;
  }
</style>

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

3列になる

ヒント

繰り返しを表す6文字の関数。

模範解答
repeat
解説

repeat(3, 1fr) は 1fr 1fr 1fr と同じ。列数を変えたいとき、数字1つ直すだけで済む。

HT18-D08 スマホ対応で最も重要な、head に書くタグはどれか。
A. meta charset B. meta viewport C. title D. link
選択★★☆広告解放
期待される結果

解答 == B

ヒント

これが無いとメディアクエリが効かない(HT15)。

模範解答
B
解説

viewport が無いとスマホでPC版が縮小表示される。CSSをどれだけ書いても無駄になる、最重要のタグ。

HT18-D09 グラデーションのヒーローエリアを作れ(135deg#0066cc#004499、文字白、中央揃え、padding 80px 20px)。 コーディング★★☆広告解放
期待される結果

グラデーションと中央揃え

ヒント

linear-gradient と text-align: center を組み合わせる。

模範解答
<style>
  .hero {
    background: linear-gradient(135deg, #0066cc, #004499);
    color: #ffffff;
    text-align: center;
    padding: 80px 20px;
  }
</style>

<section class="hero">
  <h1>ゼロカラカフェ</h1>
  <p>静かな時間を過ごせる隠れ家カフェ</p>
</section>
解説

ヒーローエリアはページの第一印象を決める。同系色のグラデーションなら派手になりすぎず、上品にまとまる。

HT18-D10 ホバーで浮き上がるカードを3つ、Gridで横に並べよ(gap 24px、影・角丸12px・translateY(-6px)・0.25秒)。 コーディング★★☆広告解放
期待される結果

3列のGrid、transitionあり

ヒント

HT14のGridとHT17のホバー効果を組み合わせる。

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

  .cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
  }

  .card {
    padding: 24px;
    background-color: #ffffff;
    border-radius: 12px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
    transition: transform 0.25s, box-shadow 0.25s;
  }

  .card:hover {
    transform: translateY(-6px);
    box-shadow: 0 12px 28px rgba(0, 0, 0, 0.18);
  }
</style>

<div class="cards">
  <div class="card">コーヒー</div>
  <div class="card">ケーキ</div>
  <div class="card">ランチ</div>
</div>
解説

GridとホバーはWebサイトの定番の組み合わせ。この2つが書ければ、商品一覧やサービス紹介はほぼ作れる。

4実践シナリオ(5問)

HT18-S01 【ヘッダーの中身】固定ヘッダーの中に container を置き、ロゴを左・ナビを右に配置せよ(Flexbox、space-between、縦中央、高さ100%)。 コーディング★★☆広告解放
期待される結果

space-betweenとalign-items

ヒント

ヘッダー自体ではなく、中の container を Flexbox にする。

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

  .container {
    max-width: 1000px;
    margin: 0 auto;
    padding: 0 20px;
  }

  .site-header {
    position: fixed;
    top: 0;
    width: 100%;
    height: 64px;
    background-color: #ffffff;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
    z-index: 100;
  }

  .site-header .container {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 100%;
  }

  .site-header nav {
    display: flex;
    gap: 24px;
  }

  .site-header a {
    text-decoration: none;
    color: #333333;
  }
</style>

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

    <nav>
      <a href="#menu">メニュー</a>
      <a href="#access">アクセス</a>
    </nav>
  </div>
</header>
解説

ヘッダー自体は全幅、中の container で幅を制限する。こうすると背景は画面いっぱいに広がり、中身だけが中央に揃う。

HT18-S02 【セクションの構成】section に上下 padding 64px を付け、中に container・h2(中央揃え)・カード一覧(3列Grid)を配置せよ。 コーディング★★☆広告解放
期待される結果

paddingとGridが正しい

ヒント

section で余白、container で幅制限、Gridでカード配置。

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

  .container {
    max-width: 1000px;
    margin: 0 auto;
    padding: 0 20px;
  }

  .section {
    padding: 64px 0;
  }

  .section h2 {
    text-align: center;
    margin-bottom: 40px;
  }

  .cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
  }

  .card {
    padding: 24px;
    border: 1px solid #ddd;
    border-radius: 12px;
  }
</style>

<section class="section">
  <div class="container">
    <h2>メニュー</h2>

    <div class="cards">
      <div class="card">コーヒー</div>
      <div class="card">ケーキ</div>
      <div class="card">ランチ</div>
    </div>
  </div>
</section>
解説

section で縦の余白、container で横の幅——この役割分担が、整ったページの基本構造になる。

HT18-S03 【スマホ対応】3列のカード一覧を、768px以下で1列に切り替えよ(gap は PC 24px / スマホ 16px)。 コーディング★★☆広告解放
期待される結果

PC3列/SP1列

ヒント

メディアクエリの中で grid-template-columns と gap を上書きする。

模範解答
<style>
  .cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
  }

  @media (max-width: 768px) {
    .cards {
      grid-template-columns: 1fr;
      gap: 16px;
    }
  }

  .card {
    padding: 24px;
    background-color: #f5f5f5;
  }
</style>

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

スマホでは gap も詰める。画面が狭いので、PCと同じ余白では内容の表示領域が足りなくなる。

HT18-S04 【フッター】footer を作れ(背景 #333、文字色白、padding 40px 0、中に container、address と著作権表示、リンクは白で下線なし)。 コーディング★★★広告解放
期待される結果

footerの装飾が正しい

ヒント

address タグを使う(HT05)。リンクの色は明示的に指定する。

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

  .container {
    max-width: 1000px;
    margin: 0 auto;
    padding: 0 20px;
  }

  .site-footer {
    background-color: #333333;
    color: #ffffff;
    padding: 40px 0;
  }

  .site-footer a {
    color: #ffffff;
    text-decoration: none;
  }
</style>

<footer class="site-footer">
  <div class="container">
    <address>東京都渋谷区1-2-3</address>
    <p><a href="tel:0312345678">03-1234-5678</a></p>
    <p>&copy; 2026 ゼロカラカフェ</p>
  </div>
</footer>
解説

暗い背景ではリンクの色を必ず指定する。既定の青のままだと、黒背景で極端に読みにくくなる。

HT18-S05 【バッジ付きカード】カード(relative)の右上にはみ出すバッジ(上 -8px・右 -8px、28×28px、円形、背景 #ff6600・文字白)を配置せよ。 コーディング★★★広告解放
期待される結果

バッジがカードの外にはみ出す

ヒント

HT16の負の値による配置を使う。カードに relative が必須。

模範解答
<style>
  .card {
    position: relative;
    width: 240px;
    padding: 24px;
    background-color: #ffffff;
    border-radius: 12px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  }

  .badge {
    position: absolute;
    top: -8px;
    right: -8px;
    width: 28px;
    height: 28px;
    background-color: #ff6600;
    color: #ffffff;
    border-radius: 50%;
    text-align: center;
    line-height: 28px;
  }
</style>

<div class="card">
  <span class="badge">3</span>
  <h3>本日のおすすめ</h3>
</div>
解説

line-height を高さと同じにすると、文字が縦中央に来る。1行だけの文字を丸の中央に置くときの簡単な手法。

5仕上げ課題

HT18-FINAL 【卒業課題:カフェの1ページサイト】HT01〜HT17のすべてを統合し、実際に公開できる水準のページを作れ。

head:文字コード・viewport・title

■ 基本設定
*:box-sizing/body:margin 0、フォント sans-serif、行間 1.8、文字色 #333
img:max-width 100%、height auto
.container:max-width 1000px、中央配置、padding 0 20px

■ ① 固定ヘッダー.site-header
・fixed、上0、幅100%、高さ 64px、背景白、影、z-index: 100
・中の container を Flexbox(space-between・縦中央・高さ100%)
・ロゴ(div)とナビ(nav、Flexbox で gap 24px、リンク2つ)

■ ② ヒーロー.hero
margin-top: 64px、padding 80px 20px、中央揃え
・グラデーション(135deg#0066cc#004499)、文字色白
・h1 と p を配置

■ ③ メニュー.menu-section
・padding 64px 0、中に container
・h2(中央揃え、下 margin 40px
.cards:Grid repeat(3, 1fr)、gap 24px
.cardrelative、padding 24px、背景白、角丸 12px、影 0 2px 8px rgba(0,0,0,0.1)transition: transform 0.25s, box-shadow 0.25s
.card:hovertranslateY(-6px)、影 0 12px 28px rgba(0,0,0,0.18)
・1枚目にバッジ(absolute、上右 -8px、28×28、円形、背景 #ff6600

■ ④ フッター.site-footer
・背景 #333、文字白、padding 40px 0、中に container
・address とリンク(白・下線なし)と著作権表示

■ ⑤ スマホ対応(768px以下)
.cards → 1列
.hero → padding 48px 20px
.site-header .containerflex-direction: column

確認すること:PC幅でカードが1行、スマホ幅で3行になる
総合★★★広告解放
期待される結果

全機能がPC/SPで正しく動作

ヒント

HTMLの骨組み(header/section/main/footer)から書き始め、基本設定→レイアウト→装飾→スマホ対応の順に進める。カードに relative を忘れるとバッジが飛ぶ。ヒーローの margin-top はヘッダーの高さと同じ64px。

模範解答
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ゼロカラカフェ</title>

  <style>
    /* ===== 基本設定 ===== */
    * {
      box-sizing: border-box;
    }

    body {
      margin: 0;
      font-family: sans-serif;
      line-height: 1.8;
      color: #333333;
    }

    img {
      max-width: 100%;
      height: auto;
    }

    .container {
      max-width: 1000px;
      margin: 0 auto;
      padding: 0 20px;
    }

    /* ===== ヘッダー ===== */
    .site-header {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 64px;
      background-color: #ffffff;
      box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
      z-index: 100;
    }

    .site-header .container {
      display: flex;
      justify-content: space-between;
      align-items: center;
      height: 100%;
    }

    .site-header nav {
      display: flex;
      gap: 24px;
    }

    .site-header a {
      text-decoration: none;
      color: #333333;
    }

    /* ===== ヒーロー ===== */
    .hero {
      margin-top: 64px;
      padding: 80px 20px;
      text-align: center;
      background: linear-gradient(135deg, #0066cc, #004499);
      color: #ffffff;
    }

    /* ===== メニュー ===== */
    .menu-section {
      padding: 64px 0;
    }

    .menu-section h2 {
      text-align: center;
      margin-bottom: 40px;
    }

    .cards {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 24px;
    }

    .card {
      position: relative;
      padding: 24px;
      background-color: #ffffff;
      border-radius: 12px;
      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
      transition: transform 0.25s, box-shadow 0.25s;
    }

    .card:hover {
      transform: translateY(-6px);
      box-shadow: 0 12px 28px rgba(0, 0, 0, 0.18);
    }

    .badge {
      position: absolute;
      top: -8px;
      right: -8px;
      width: 28px;
      height: 28px;
      background-color: #ff6600;
      color: #ffffff;
      border-radius: 50%;
      text-align: center;
      line-height: 28px;
    }

    /* ===== フッター ===== */
    .site-footer {
      background-color: #333333;
      color: #ffffff;
      padding: 40px 0;
    }

    .site-footer a {
      color: #ffffff;
      text-decoration: none;
    }

    /* ===== スマホ対応 ===== */
    @media (max-width: 768px) {
      .cards {
        grid-template-columns: 1fr;
      }

      .hero {
        padding: 48px 20px;
      }

      .site-header .container {
        flex-direction: column;
      }
    }
  </style>
</head>
<body>

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

      <nav>
        <a href="#menu">メニュー</a>
        <a href="#access">アクセス</a>
      </nav>
    </div>
  </header>

  <section class="hero">
    <h1>ゼロカラカフェ</h1>
    <p>静かな時間を過ごせる隠れ家カフェ</p>
  </section>

  <main>
    <section class="menu-section" id="menu">
      <div class="container">
        <h2>メニュー</h2>

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

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

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

  <footer class="site-footer" id="access">
    <div class="container">
      <address>東京都渋谷区1-2-3</address>
      <p><a href="tel:0312345678">03-1234-5678</a></p>
      <p>&copy; 2026 ゼロカラカフェ</p>
    </div>
  </footer>

</body>
</html>
解説

これがHTML/CSS編の到達点だ。このファイルを index.html という名前で保存すれば、そのままWebサイトとして公開できる。サーバーにアップロードするだけで、世界中の誰でもアクセスできるようになる。

このページには、18章で学んだほぼすべてが入っている。セマンティックタグで構造を作り(HT05)、Flexboxでヘッダーを両端に配置し(HT13)、Gridでカードを並べ(HT14)、positionでヘッダーを固定しバッジを重ね(HT16)、影とトランジションで仕上げ(HT17)、メディアクエリでスマホに対応した(HT15)。

とくに見落としやすい3点を確認してほしい。
.hero { margin-top: 64px; }——固定ヘッダーは場所を取らないので、これが無いとヒーローが隠れる。
.card { position: relative; }——これが無いとバッジが画面の右上へ飛ぶ。
meta viewport——これが無いとスマホ対応が一切効かない。
どれも1行だが、忘れると致命的に崩れる。

——HT01では <h1>こんにちは</h1> と書くところから始まった。文字を表示するだけだったページが、18章を経て固定ヘッダーもホバー効果もスマホ対応も備えた、実用的なWebサイトになった。

ここまで来たあなたは、もう「HTMLを勉強している人」ではありません。Webページを作れる人です。次に必要なのは、教材ではなく作りたいものを実際に作ることだ。自分の紹介ページでも、好きなものをまとめたサイトでもいい。手を動かした分だけ、確実に上手くなる。

お疲れさまでした。