HTML/CSS:総合演習:企業サイトを作る
1学習の目的
- HT01〜HT17で学んだすべてを組み合わせ、実際に公開できる水準のWebページを1枚作り上げる。
- 「どの技術をどこで使うか」を自分で判断できるようになる。18章かけて積み上げたものが、1つの形になる。
2基礎解説
| 部品 | 使う技術 | 学んだ章 |
|---|---|---|
| ページの骨組み | セマンティックタグ | HT05 |
| 固定ヘッダー | position: fixed + Flexbox | HT13・16 |
| カード一覧 | Grid + 影 + ホバー | HT14・17 |
| スマホ対応 | メディアクエリ | HT15 |
- まずHTMLの骨組みを作る。header・main・footer から始め、セマンティックタグで構造を組む。この段階では見た目を気にしない。
- 共通のリセットと基本設定を書く。* { box-sizing: border-box; }、body { margin: 0; }、img { max-width: 100%; } の3つは最初に。
- レイアウトを組む。大枠は Grid、部分的な並びは Flexbox——役割で使い分ける。
- 装飾を加える。色・影・角丸・ホバー効果。ここまで来ると一気に「完成品」らしくなる。
- 最後にスマホ対応。画面幅を狭めて確認し、崩れる箇所をメディアクエリで直す。
この章の題材:カフェの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問)
3つの基本設定が正しい
どのサイトでも最初に書く定型文。
<style>
* {
box-sizing: border-box;
}
body {
margin: 0;
}
img {
max-width: 100%;
height: auto;
}
</style>
<div>本文</div>この3つを書かないと必ずどこかで崩れる。幅の計算がずれ、ページ端に隙間ができ、画像がはみ出す——最初に潰しておく。
A. 装飾 → HTML → レイアウト B. HTML → レイアウト → 装飾 → スマホ対応 C. スマホ対応 → HTML D. レイアウト → HTML 選択★☆☆無料
解答 == B
骨組みを作ってから肉付けする。
B
構造 → 配置 → 見た目 → 対応の順。装飾から始めると、レイアウトを変えるたびに作り直しになる。
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 をページ中で使い回す。すべてのセクションで同じ幅に揃うので、縦のラインが通って整った印象になる。
<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 でヘッダーの高さ分の余白が必要になる。
A. すべてFlexbox B. 大枠はGrid、部分はFlexbox C. すべてGrid D. すべてfloat 選択★☆☆無料
解答 == B
それぞれ得意分野が違う(HT14)。
B
格子状の配置はGrid、1方向の並びはFlexbox。実務では両方を併用するのが自然な形。
ヘッダーが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 を忘れると本文がヘッダーの下に潜る。固定ヘッダーを作ったら、必ずセットで余白を確保する。
<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つ直すだけで済む。
A. meta charset B. meta viewport C. title D. link 選択★★☆広告解放
解答 == B
これが無いとメディアクエリが効かない(HT15)。
B
viewport が無いとスマホでPC版が縮小表示される。CSSをどれだけ書いても無駄になる、最重要のタグ。
グラデーションと中央揃え
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>ヒーローエリアはページの第一印象を決める。同系色のグラデーションなら派手になりすぎず、上品にまとまる。
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問)
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 で幅を制限する。こうすると背景は画面いっぱいに広がり、中身だけが中央に揃う。
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 で横の幅——この役割分担が、整ったページの基本構造になる。
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と同じ余白では内容の表示領域が足りなくなる。
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>© 2026 ゼロカラカフェ</p>
</div>
</footer>暗い背景ではリンクの色を必ず指定する。既定の青のままだと、黒背景で極端に読みにくくなる。
バッジがカードの外にはみ出す
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仕上げ課題
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
・.card:relative、padding 24px、背景白、角丸 12px、影 0 2px 8px rgba(0,0,0,0.1)、transition: transform 0.25s, box-shadow 0.25s
・.card:hover:translateY(-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 .container → flex-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>© 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ページを作れる人です。次に必要なのは、教材ではなく作りたいものを実際に作ることだ。自分の紹介ページでも、好きなものをまとめたサイトでもいい。手を動かした分だけ、確実に上手くなる。
お疲れさまでした。