海風テラスのサイトの初版をMikaに見せた翌日。Mikaからのフィードバックが届いた。
あなた: 「Mikaさんからメール来てるぞ。“構造はバッチリです!でも、もう少しカフェの雰囲気が伝わるデザインにできますか?参考にしたいサイトを3つ添付します”って。」
あなたがスマホを回して、参考サイトを見せてくれる。どれも写真が美しく配置され、メニューがカード形式で並び、余白が心地よいデザインだった。
あなた: 「うーん、プロのサイトって全然違いますね…。何が違うんだろう。」
Yuki: 「大きく2つ。レイアウトとデザインの一貫性だよ。今のサイトは要素が縦に並んでるだけでしょ?FlexboxやGridを使えば、要素を横に並べたり、カード形式にしたりできる。」
あなた: 「俺、デザインセンスないんだけど大丈夫?」
Yuki: 「デザインセンスは半分”知識”だよ。色の選び方、フォントの組み合わせ、余白の取り方——ルールを知れば、誰でもそれなりのデザインが作れる。逆に言えば、ルールを知らないとセンスがあっても崩れやすい。」
Yukiがテーブルの上にスケッチブックを広げた。海風テラスのトップページのワイヤーフレーム(設計図)が描かれている。
Yuki: 「今日学ぶのは4つ。Flexboxでの要素配置、CSS Gridの基本、タイポグラフィとカラーの原則、そしてコンポーネント思考。これがわかると、“プロっぽい”サイトが作れるようになるよ。」
あなた: 「Flexboxって名前だけ聞いたことあります。柔軟に配置できる仕組みですか?」
Yuki: 「そう!名前の通りFlexible Box。一次元のレイアウトに最適なんだ。さあ、始めよう。」
Flexbox — 柔軟なレイアウトの切り札
メニューカードを横に並べたい。ナビゲーションを等間隔に配置したい。要素を上下中央に揃えたい。こういったレイアウトの課題をスマートに解決するのがFlexboxだ。
Yuki: 「Flexboxが登場する前は、float や inline-block で苦しみながらレイアウトを組んでたんだ。Flexboxは革命的だったよ。」
Flexboxの基本概念
Flexboxは「親要素(コンテナ)」と「子要素(アイテム)」の関係で成り立つ:
/* 親要素にdisplay: flexを指定するだけ */
.container {
display: flex;
}
これだけで、子要素が横並びになる。
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
主軸と交差軸
Flexboxには2つの軸がある:
flex-direction: row(デフォルト)の場合
主軸(main axis)→ → → → →
↓ 交差軸(cross axis)
↓
↓
[A] [B] [C]
| プロパティ | 操作する軸 | よく使う値 |
|---|---|---|
justify-content | 主軸方向の配置 | center, space-between, space-around |
align-items | 交差軸方向の配置 | center, flex-start, stretch |
flex-direction | 主軸の方向 | row, column |
justify-content — 主軸方向の配置
.nav-links {
display: flex;
justify-content: space-between;
/* 両端揃えで、間隔が均等に */
}
| 値 | 動作 |
|---|---|
flex-start | 左揃え(デフォルト) |
center | 中央揃え |
flex-end | 右揃え |
space-between | 両端揃え、間隔均等 |
space-around | 均等配置(両端に半分の間隔) |
space-evenly | 完全均等配置 |
align-items — 交差軸方向の配置
.hero {
display: flex;
align-items: center;
/* 上下中央揃え */
height: 400px;
}
flex-wrap — 折り返し
デフォルトでは子要素は1行に収まろうとする。折り返したい場合は:
.menu-grid {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.menu-card {
flex: 1 1 280px;
/* 最小280px、余れば伸びる、足りなければ折り返す */
}
gap — 子要素間の間隔
.container {
display: flex;
gap: 20px; /* 子要素間にきっちり20pxの間隔 */
}
Yuki: 「昔は margin で間隔を作ってたけど、gap が使えるようになってすごく楽になった。FlexboxとGridの両方で使えるよ。」
海風テラスのナビゲーションをFlexboxで
/* ヘッダーナビ */
nav ul {
display: flex;
list-style: none;
padding: 0;
gap: 30px;
justify-content: center;
}
/* スマホでは縦並びに */
@media (max-width: 767px) {
nav ul {
flex-direction: column;
align-items: center;
gap: 15px;
}
}
メニューカードを横並びに
.menu-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
}
.menu-card {
flex: 0 1 300px; /* 伸びない、縮む、基準幅300px */
padding: 20px;
border: 1px solid #e0e0e0;
border-radius: 12px;
}
よく使うパターン集
/* 上下左右中央揃え(最頻出!) */
.center-all {
display: flex;
justify-content: center;
align-items: center;
}
/* ヘッダー:ロゴ左、ナビ右 */
.header-layout {
display: flex;
justify-content: space-between;
align-items: center;
}
/* フッター:均等3列 */
.footer-cols {
display: flex;
gap: 40px;
}
.footer-cols > div {
flex: 1;
}
ポイント
display: flexを親要素に指定するだけで、子要素が横並びになるjustify-content= 主軸方向(横)、align-items= 交差軸方向(縦)flex-wrap: wrapで折り返し可能にgapで子要素間の間隔を簡単に指定- Flexboxは一次元(行 or 列)のレイアウトに最適
CSS Grid入門 — 二次元レイアウトの王者
Flexboxが「一次元(行 or 列)」のレイアウトに強いなら、CSS Gridは「二次元(行 と 列)」のレイアウトに最適だ。
Yuki: 「ページ全体の骨組みを作るならGrid、コンポーネント内の配置ならFlexbox。両方使いこなせると最強だよ。」
Gridの基本
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3等分 */
gap: 20px;
}
<div class="grid-container">
<div>カード1</div>
<div>カード2</div>
<div>カード3</div>
<div>カード4</div>
<div>カード5</div>
<div>カード6</div>
</div>
これだけで3列のグリッドが完成する。4つ目以降は自動的に次の行に配置される。
fr単位 — 比率で分割
fr(fraction)は、利用可能な空間を比率で分割する単位:
/* 3等分 */
grid-template-columns: 1fr 1fr 1fr;
/* サイドバー(250px固定) + メイン(残り全部) */
grid-template-columns: 250px 1fr;
/* 1:2:1 の比率 */
grid-template-columns: 1fr 2fr 1fr;
repeat() — 繰り返し指定
/* 同じことの省略形 */
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-columns: repeat(4, 1fr);
/* レスポンシブグリッド(超便利!) */
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
auto-fit と minmax の組み合わせは、メディアクエリなしでレスポンシブなグリッドを実現する魔法のような記法だ。
.menu-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
/* 画面幅に応じて1列〜4列に自動調整される! */
Grid vs Flexbox — いつどちらを使う?
| 状況 | 選択 | 理由 |
|---|---|---|
| ナビゲーションのリンク配置 | Flexbox | 一次元、アイテム数が変動 |
| メニューカードのグリッド | Grid | 二次元、均等な格子状 |
| ヘッダーのレイアウト | Flexbox | 一次元、space-between |
| ページ全体の構成 | Grid | 二次元、行列の制御 |
| ボタン内のアイコン+テキスト | Flexbox | 一次元、小さなコンポーネント |
Yuki: 「迷ったら、“行だけでいい?“ならFlex、“行と列の両方?“ならGrid、って考えるといいよ。」
海風テラスをGridで再構成
/* メニューセクション */
.menu-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
padding: 20px;
}
/* ページ全体の構成 */
body {
display: grid;
grid-template-rows: auto 1fr auto;
/* ヘッダー、メインコンテンツ、フッター */
min-height: 100vh;
}
grid-template-areas — 名前付きレイアウト
複雑なページレイアウトを直感的に指定できる:
.page-layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
header { grid-area: header; }
aside { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }
将来サイドバーを追加するときに便利な手法だ。
ポイント
display: gridで二次元レイアウトを実現fr単位で比率ベースの分割ができるrepeat(auto-fit, minmax(280px, 1fr))はレスポンシブグリッドの定番- Flexboxは一次元、Gridは二次元と使い分ける
- 実務ではFlexboxとGridを組み合わせて使うことが多い
タイポグラフィとカラー — デザインの基礎原則
レイアウトが整っても、フォントや色の選び方が悪いとサイトは「素人感」が抜けない。デザインの基礎原則を知るだけで、見違えるほど品質が上がる。
Yuki: 「デザイナーじゃなくても、最低限のルールを知っていれば、80点のデザインは作れるよ。100点を目指すのはデザイナーの仕事だけどね。」
タイポグラフィの基本
フォントの選び方
body {
/* 日本語サイトの定番 */
font-family:
'Hiragino Kaku Gothic ProN', /* Mac */
'Meiryo', /* Windows */
'Noto Sans JP', /* Google Fonts */
sans-serif; /* フォールバック */
}
| カテゴリ | 特徴 | 用途 |
|---|---|---|
| ゴシック体(sans-serif) | すっきり、モダン | 本文、UI |
| 明朝体(serif) | 上品、伝統的 | 見出し、ブランド |
| 等幅(monospace) | 文字幅が均一 | コード表示 |
フォントサイズの階層
一貫したサイズの階層を作ることが大事:
:root {
--text-xs: 0.75rem; /* 12px — 注釈 */
--text-sm: 0.875rem; /* 14px — 小さなテキスト */
--text-base: 1rem; /* 16px — 本文 */
--text-lg: 1.25rem; /* 20px — 小見出し */
--text-xl: 1.5rem; /* 24px — 中見出し */
--text-2xl: 2rem; /* 32px — 大見出し */
--text-3xl: 2.5rem; /* 40px — ヒーロー */
}
h1 { font-size: var(--text-3xl); }
h2 { font-size: var(--text-2xl); }
h3 { font-size: var(--text-xl); }
p { font-size: var(--text-base); }
Yuki: 「CSS変数(
--で始まるやつ)を使うと、後から一括で変更できるから便利だよ。」
行間と文字間
body {
line-height: 1.8; /* 日本語は1.6〜2.0が読みやすい */
letter-spacing: 0.05em; /* 少し空けると読みやすくなる */
}
h1 {
line-height: 1.3; /* 見出しは詰めてOK */
letter-spacing: 0.02em;
}
カラーの基本原則
カラーパレットの作り方
プロのサイトは通常3〜5色で構成される:
| 役割 | 色の例 | 使用割合 |
|---|---|---|
| プライマリ | ブランドカラー(海風テラスなら海の青) | 60% |
| セカンダリ | アクセント(温かみのあるオレンジ) | 30% |
| アクセント | 強調(ボタン、CTA) | 10% |
| テキスト | ダークグレー(真っ黒は避ける) | — |
| 背景 | 白〜薄いグレー | — |
:root {
/* 海風テラスのカラーパレット */
--color-primary: #1a5276; /* 深い海の青 */
--color-secondary: #e67e22; /* 沖縄の夕日のオレンジ */
--color-accent: #27ae60; /* 予約ボタン用のグリーン */
--color-text: #2c3e50; /* テキスト(真っ黒ではない) */
--color-text-light: #7f8c8d; /* 補足テキスト */
--color-bg: #ffffff; /* 背景 */
--color-bg-alt: #f8f9fa; /* セクション背景(交互) */
--color-border: #e0e0e0; /* 境界線 */
}
コントラストの重要性
テキストと背景のコントラスト比が低いと読みにくい:
/* 悪い例:コントラスト不足 */
p {
color: #cccccc; /* 薄いグレー */
background-color: white; /* 白背景 */
/* → 読みにくい! */
}
/* 良い例:十分なコントラスト */
p {
color: #2c3e50; /* ダークグレー */
background-color: white;
/* → 読みやすい */
}
WCAG(Webアクセシビリティガイドライン)では、本文テキストのコントラスト比は4.5:1以上が推奨されている。
余白のルール — 8pxグリッド
プロのデザインでは、余白を8の倍数で統一することが多い:
:root {
--space-xs: 4px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 24px;
--space-xl: 32px;
--space-2xl: 48px;
--space-3xl: 64px;
}
section {
padding: var(--space-2xl) var(--space-lg);
}
.menu-card {
padding: var(--space-lg);
margin-bottom: var(--space-md);
}
海風テラスにデザインシステムを適用
:root {
/* カラー */
--color-primary: #1a5276;
--color-secondary: #e67e22;
--color-text: #2c3e50;
--color-bg-alt: #f8f9fa;
/* フォント */
--font-heading: 'Noto Sans JP', sans-serif;
--font-body: 'Noto Sans JP', sans-serif;
/* スペーシング */
--space-md: 16px;
--space-lg: 24px;
--space-xl: 32px;
--space-2xl: 48px;
}
body {
font-family: var(--font-body);
color: var(--color-text);
line-height: 1.8;
}
h1, h2, h3 {
font-family: var(--font-heading);
line-height: 1.3;
}
/* セクションを交互に色分け */
section:nth-child(even) {
background-color: var(--color-bg-alt);
}
ポイント
- フォントは2種類まで。日本語サイトはゴシック体が基本
- カラーパレットは3〜5色。CSS変数で管理する
- テキスト色に真っ黒(
#000)は避け、ダークグレー(#2c3e50など)を使う - 余白は8の倍数で統一すると整って見える
line-heightは日本語なら1.6〜2.0が読みやすい
コンポーネント設計 — 再利用できるパーツを作る
プロのWebサイトは、小さなパーツ(コンポーネント)の組み合わせでできている。同じスタイルのカードやボタンを何度も書くのではなく、再利用可能なCSSクラスを作ろう。
Yuki: 「LEGOブロックを思い浮かべて。1つ1つのブロックが小さなコンポーネント。それを組み合わせてページを作るんだ。」
コンポーネント思考とは
ページ全体
├── ヘッダーコンポーネント
│ ├── ロゴ
│ └── ナビゲーション
├── ヒーローコンポーネント
├── メニューセクション
│ ├── メニューカード ← 再利用
│ ├── メニューカード ← 再利用
│ └── メニューカード ← 再利用
├── アクセスセクション
└── フッターコンポーネント
ボタンコンポーネント
サイト内で使うボタンのバリエーションを作ろう:
/* ベースボタン */
.btn {
display: inline-block;
padding: 12px 24px;
border: none;
border-radius: 8px;
font-size: 1rem;
font-weight: bold;
text-decoration: none;
cursor: pointer;
transition: opacity 0.2s;
}
.btn:hover {
opacity: 0.85;
}
/* バリエーション */
.btn-primary {
background-color: var(--color-primary);
color: white;
}
.btn-secondary {
background-color: transparent;
color: var(--color-primary);
border: 2px solid var(--color-primary);
}
.btn-accent {
background-color: var(--color-secondary);
color: white;
}
<a href="#reservation" class="btn btn-primary">予約する</a>
<a href="#menu" class="btn btn-secondary">メニューを見る</a>
カードコンポーネント
.card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.2s, box-shadow 0.2s;
}
.card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
.card-image {
width: 100%;
height: 200px;
object-fit: cover;
}
.card-body {
padding: 20px;
}
.card-title {
font-size: 1.25rem;
margin: 0 0 8px 0;
color: var(--color-primary);
}
.card-text {
color: var(--color-text-light);
font-size: 0.9rem;
margin: 0 0 16px 0;
}
<div class="card">
<img class="card-image" src="champuru.jpg" alt="島豆腐チャンプルー">
<div class="card-body">
<h3 class="card-title">島豆腐チャンプルー</h3>
<p class="card-text">地元の島豆腐と新鮮な野菜を使った定番メニュー</p>
<span class="price">¥980</span>
</div>
</div>
ヒーローセクション
ページの最初に大きな画像と見出しを配置する、インパクトのあるセクション:
.hero {
position: relative;
height: 60vh;
min-height: 400px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
color: white;
background-image: url('cafe-hero.jpg');
background-size: cover;
background-position: center;
}
/* 画像の上にオーバーレイを重ねて文字を読みやすく */
.hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
}
.hero-content {
position: relative; /* オーバーレイの上に表示 */
z-index: 1;
}
.hero h1 {
font-size: 2.5rem;
margin-bottom: 16px;
}
.hero p {
font-size: 1.2rem;
margin-bottom: 24px;
}
transition — 滑らかな変化
transition を使うと、状態変化をアニメーションにできる:
.btn {
background-color: #1a5276;
transition: background-color 0.3s ease;
}
.btn:hover {
background-color: #2980b9;
/* 0.3秒かけて色が変わる */
}
.card {
transform: translateY(0);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card:hover {
transform: translateY(-4px);
/* 0.2秒かけて少し浮き上がる */
}
| transitionの値 | 意味 |
|---|---|
0.3s | アニメーションの時間 |
ease | 加速→減速(自然な動き) |
linear | 一定速度 |
ease-in-out | ゆっくり始まりゆっくり終わる |
BEM命名規則 — クラス名のルール
コンポーネントが増えると、クラス名の管理が大事になる。BEM(Block Element Modifier)は人気の命名規則:
/* Block: コンポーネント名 */
.menu-card { }
/* Element: ブロックの一部(__で接続) */
.menu-card__title { }
.menu-card__price { }
.menu-card__image { }
/* Modifier: バリエーション(--で接続) */
.menu-card--featured { }
.menu-card--sold-out { }
<div class="menu-card menu-card--featured">
<img class="menu-card__image" src="special.jpg" alt="特別メニュー">
<h3 class="menu-card__title">今週のスペシャル</h3>
<span class="menu-card__price">¥1,200</span>
</div>
ポイント
- ページをコンポーネント単位で考え、再利用できるCSSクラスを作る
- ボタン・カード・ヒーローはほぼすべてのサイトで使う汎用コンポーネント
transitionで滑らかなホバーエフェクトを加えるだけで品質が上がるbox-shadowとborder-radiusでモダンなカードデザインが作れる- BEM命名規則でクラス名を整理すると、大規模になっても管理しやすい
ブラウザをリロードする。海風テラスのサイトが、まるで別人のように生まれ変わっていた。
ヒーローセクションには海の写真が広がり、メニューカードが3列のグリッドで美しく並ぶ。フォントは統一され、色使いもカフェの温かみを感じさせる。スマホでは1列に自然に切り替わる。
あなた: 「やばい、これめちゃくちゃいいじゃん!Mikaさんに見せよう!」
あなたがすぐにスクリーンショットを撮ってMikaに送る。数分後、返信が来た。
あなた: 「Mikaさん、すごく喜んでる!“まさにこういうイメージでした!“って。それと…”予約フォームとメニューの絞り込み機能も付けられますか?“だって。」
あなた: 「予約フォーム?メニューの絞り込み?それって…」
Yuki: 「HTMLとCSSだけでは難しいね。ここからはJavaScriptの出番だよ。ページに”動き”と”反応”を加えるための言語。」
あなた: 「JavaScript…聞いたことはあるけど、難しいの?」
Yuki: 「基本はシンプルだよ。“ボタンが押されたら、こうする”——そういうルールを書いていくだけ。HTMLが骨格、CSSが見た目なら、JavaScriptは筋肉と神経系みたいなものかな。」
あなた: 「ページが動き出す…なんかワクワクしますね。」
次のチャプター: Chapter 4: 動き出すページ — JavaScriptの基本を学び、海風テラスに予約フォームとインタラクティブなメニューを実装する。
🧠 理解度チェック
Q1.Flexboxで子要素を横並びにするために、親要素に指定するプロパティはどれ?
💡 メニューカードを横に並べるとき、Yukiが最初に教えてくれたプロパティだ。
Q2.Flexboxで子要素を等間隔に配置するjustify-contentの値はどれ?
💡 ナビゲーションリンクを両端揃えで均等に配置するときに使ったね。
Q3.CSS Gridで3等分のカラムを作る正しい書き方はどれ?
💡 メニューカードを3列のグリッドに配置したときの設定だ。
Q4.メディアクエリなしでレスポンシブなグリッドを実現する記法はどれ?
💡 Yukiが「魔法のような記法」と言っていたGridの定番パターンだね。
Q5.Webサイトのテキスト色に純粋な黒(#000000)を避ける理由は?
💡 海風テラスのカラーパレットで、テキスト色にダークグレーを選んだ理由だ。
Q6.CSSの transition プロパティの役割は?
💡 メニューカードにホバーしたとき、ふわっと浮き上がるエフェクトを作ったよね。
Q7.BEM命名規則で「メニューカードのタイトル」を表すクラス名はどれ?
💡 コンポーネントが増えてきたときに、Yukiが提案した命名ルールだ。
Q8.CSS変数(カスタムプロパティ)を定義する正しい書き方はどれ?
💡 海風テラスのカラーパレットを管理するために使ったCSS変数だね。
❓ よくある質問
Flexboxで子要素が横並びにならない
`display: flex` が**親要素**に指定されているか確認してください: ```css /* 間違い:子要素に指定している */ .item { display: flex; } /* 正しい:親要素に指定 */ .container { display: flex; } ``` その他のチェックポイント: - 子要素の `width: 100%` が原因で1行に1つしか入らないことがある - `flex-direction: column` が指定されていると縦並びになる - 開発者ツールで親要素を選択すると、Flexboxのガイドが表示される
FlexboxとGridのどちらを使えばいいかわからない
シンプルな判断基準: | 状況 | 選択 | |------|------| | 要素を**一方向**に並べる | Flexbox | | **行と列**の両方を制御する | Grid | | ナビゲーション | Flexbox | | カードの一覧表示 | Grid | | ヘッダー内のレイアウト | Flexbox | | ページ全体の骨組み | Grid | **迷ったら**: 「行だけ?」→ Flex、「行と列?」→ Grid 実際のプロジェクトでは、両方を組み合わせて使います。ページ全体はGrid、コンポーネント内部はFlexbox、という使い分けが多いです。
CSS Gridの列数が期待通りにならない
よくある原因: **1. コンテナの幅が足りない** ```css /* minmax の最小値より幅が狭いと1列になる */ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); /* コンテナが560px未満なら2列にならない */ ``` **2. auto-fill と auto-fit の違い** ```css /* auto-fill: 空のカラムも確保される */ /* auto-fit: コンテンツがある分だけ伸びる */ repeat(auto-fit, minmax(280px, 1fr)) /* 通常はこちらを使う */ ``` **3. 子要素に幅が指定されている** ```css /* Grid の子要素には width を指定しない */ .card { width: 300px; } /* これが邪魔している可能性 */ ``` 開発者ツールでGrid コンテナを選択すると、グリッドラインが可視化されます。
hoverエフェクトが動かない
以下を確認してください: **1. `:hover` の書き方** ```css /* 正しい */ .card:hover { transform: translateY(-4px); } /* 間違い(スペースがある) */ .card :hover { ... } /* 子要素のhoverになってしまう */ ``` **2. transition が元の状態に書いてあるか** ```css /* 元の状態に transition を書く */ .card { transform: translateY(0); transition: transform 0.2s ease; /* ← ここ */ } /* hover 状態 */ .card:hover { transform: translateY(-4px); } ``` **3. スマホではhoverが効かない** タッチデバイスには `:hover` は不安定です。重要な情報はhoverに依存させないようにしましょう。
CSS変数が反映されない
CSS変数(カスタムプロパティ)のチェックポイント: **1. `:root` で定義しているか** ```css :root { --color-primary: #1a5276; } ``` **2. `var()` で参照しているか** ```css /* 正しい */ color: var(--color-primary); /* 間違い */ color: --color-primary; ``` **3. ハイフン2つで始まっているか** ```css /* 正しい */ --color-primary: #1a5276; /* 間違い(ハイフン1つ) */ -color-primary: #1a5276; ``` **4. フォールバック値を設定できる** ```css color: var(--color-primary, #333); /* 変数が未定義なら #333 が使われる */ ```
背景画像が表示されない
よくある原因と解決方法: **1. パスが間違っている** ```css /* HTMLファイルからの相対パス */ background-image: url('images/cafe-hero.jpg'); /* CSSファイルからの相対パス */ background-image: url('../images/cafe-hero.jpg'); ``` **2. 要素に高さがない** ```css .hero { background-image: url('hero.jpg'); /* 中身がないと高さが0になる */ height: 400px; /* 高さを指定 */ } ``` **3. background-size が未設定** ```css .hero { background-image: url('hero.jpg'); background-size: cover; /* 全体を覆う */ background-position: center; /* 中心を表示 */ } ``` **4. ファイル名の大文字小文字が違う** `Hero.jpg` と `hero.jpg` は別のファイルとして扱われます。
flexの値(flex: 1 1 300px)の意味がわからない
`flex` は3つの値のショートハンドです: ```css flex: [flex-grow] [flex-shrink] [flex-basis]; ``` | 値 | 意味 | 例 | |---|---|---| | `flex-grow` | 余白があるとき伸びる比率 | `1` = 伸びる、`0` = 伸びない | | `flex-shrink` | 足りないとき縮む比率 | `1` = 縮む、`0` = 縮まない | | `flex-basis` | 基準サイズ | `300px`, `auto` | **よく使うパターン**: ```css flex: 1; /* 均等に伸縮 */ flex: 0 1 300px; /* 伸びない、縮む、基準300px */ flex: 1 1 0; /* 均等分割(basisを0に) */ ```
フォントが反映されない(Google Fontsの使い方)
Google Fontsを使うには2ステップ必要です: **Step 1: HTMLの`<head>`に読み込みリンクを追加** ```html <link rel="preconnect" href="https://fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet"> ``` **Step 2: CSSで指定** ```css body { font-family: 'Noto Sans JP', sans-serif; } ``` **注意点**: - `<link>` タグは自分の `style.css` より**前**に記述する - フォント名のスペルが完全に一致しているか確認 - `wght@400;700` で必要なウェイトだけ読み込む(全部入れると重い)
box-shadowの書き方がわからない
`box-shadow` の構文: ```css box-shadow: [水平] [垂直] [ぼかし] [広がり] [色]; ``` | 値 | 意味 | |---|---| | 水平オフセット | 正=右、負=左 | | 垂直オフセット | 正=下、負=上 | | ぼかし半径 | 大きいほどぼやける | | 広がり | 影のサイズ調整(省略可) | **よく使うパターン**: ```css /* 軽い影(カード) */ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* ホバー時のやや強い影 */ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); /* 内側の影 */ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1); ``` `rgba` の最後の値(0.1 や 0.15)が透明度です。小さいほど薄い影になります。
object-fit: cover って何?
画像を指定サイズに収める方法を制御するプロパティです: | 値 | 動作 | |---|---| | `cover` | アスペクト比を保ちつつ、領域を完全に覆う(はみ出る部分は切れる) | | `contain` | アスペクト比を保ちつつ、領域に収まるように縮小 | | `fill` | 引き伸ばして領域を埋める(歪む可能性あり) | ```css .card-image { width: 100%; height: 200px; object-fit: cover; /* 高さ200pxに切り抜かれる */ } ``` **よくある使い方**: カードの画像を統一の高さで表示したいとき。元画像のサイズがバラバラでも、`cover` なら綺麗に揃います。