CSSスタイリングとレスポンシブデザイン
AIでウェブサイトをスタイリング——FlexboxとGridによるレスポンシブレイアウト、モダンCSS技法、デザイントークン、モバイルファーストデザイン。
プレミアムコースコンテンツ
このレッスンはプレミアムコースの一部です。Proにアップグレードすると、すべてのプレミアムコースとコンテンツを利用できます。
- すべてのプレミアムコースを利用
- 1,000以上のAIスキルテンプレート付き
- 毎週新しいコンテンツを追加
🔄 Quick Recall: 前のレッスンでは、AIでセマンティックHTML構造を構築した——ページレイアウト、フォーム、アクセシブルなナビゲーション。次はそれを見た目よくするCSS。
デザイントークン:CSSの基盤
コンポーネントスタイルを書く前に、デザインシステムを確立する:
ウェブサイトデザインシステムのCSSカスタムプロパティ(変数)ファイルを作成:
ブランドカラー:
- プライマリ:[ブランドカラー 例: #3b82f6]
- セカンダリ:[セカンダリカラー]
- アクセント:[CTA用アクセントカラー]
これらのベースカラーから生成:
1. カラースケール:プライマリとセカンダリの50, 100, 200, ..., 900
2. セマンティックカラー:success, warning, error, info
3. サーフェスカラー:background, surface, surface-raised(ライト&ダークモード)
4. テキストカラー:primary, secondary, muted, on-primary
スペーシングスケール:
- 8pxベース:space-1(4px)〜space-20(160px)
タイポグラフィ:
- フォントファミリー:heading, body, mono
- サイズスケール:xsから4xl、clamp()でフルイドサイジング
- line-heightとfont-weight
Border radius:sm, md, lg, xl, full
Shadows:sm, md, lg, xl
:rootでライトモードデフォルト、@media (prefers-color-scheme: dark)でダークモード。
✅ Quick Check: フォントサイズに固定値ではなく
clamp()を使う理由は?
clamp()はスクリーンサイズ間でスムーズにスケールするフルイドタイポグラフィを作る。font-size: clamp(1rem, 2.5vw, 1.5rem)は、1rem以下にはならず、1.5rem以上にもならず、その間をなめらかに変化する——メディアクエリのブレークポイント不要。モバイルで常に読みやすく、デスクトップで常にバランスが取れる。
Gridによるレスポンシブレイアウト
ページレイアウト
CSS Gridでレスポンシブページレイアウトを作成:
構造:
- ヘッダー(全幅、スティッキー)
- サイドバー(左、デスクトップで280px、モバイルでトグル付き非表示)
- メインコンテンツ(フレキシブル、中央寄せ、可読性のためmax-width 800px)
- フッター(全幅)
レスポンシブ動作:
- モバイル(< 768px):1カラム、サイドバーなし、ハンバーガーメニュー
- タブレット(768px - 1024px):サイドバーはアイコンのみ(64px)
- デスクトップ(> 1024px):フルサイドバー表示
モバイルファースト(ベーススタイルはモバイル用、大きいサイズにmin-widthクエリ)。
CSSカスタムプロパティを使用。
フレームワークなし——バニラCSSのみ。
カードグリッド
CSS Gridでレスポンシブカードグリッドを作成:
要件:
- カードが利用可能な幅を自動で埋める
- 最小カード幅:280px
- 最大カード幅:1fr(フレキシブル)
- 統一的なガップ:var(--space-6)
- カードは同じ高さ(行内の最も高いものに揃える)
- カード内容:画像、タイトル、説明、最下部に固定されたボタン
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); を使用。
モバイル:1カラム。タブレット:2カラム。デスクトップ:3-4カラム(自動)。
コンポーネントスタイリング
ボタン
CSSでボタンシステムを作成:
ボタンタイプ:
- Primary(ベタ塗り背景、白テキスト)
- Secondary(アウトライン、カラーのボーダーとテキスト)
- Ghost(テキストのみ、控えめなホバー)
- Danger(破壊的アクション用の赤バリアント)
サイズ:sm, md(デフォルト), lg
各ステート:default, hover, focus-visible, active, disabled
要件:
- すべての色にCSSカスタムプロパティ
- focus-visible(focusではなく)でキーボード専用インジケーター
- スムーズなトランジション(150ms ease)
- disabledは不透明度を下げ、pointer-eventsを無効化
- すべてのサイズで一貫したパディング比率
.btnをベースクラス、修飾子クラス(.btn-primary, .btn-smなど)。
ナビゲーションバー
CSSでレスポンシブナビゲーションバーを作成:
デスクトップ(> 768px):
- 水平レイアウト、左にロゴ、中央にリンク、右にCTAボタン
- ドロップダウンメニューはホバーでスムーズアニメーション表示
- アクティブリンクは下線で表示
モバイル(< 768px):
- 左にロゴ、右にハンバーガーアイコン
- メニューは右からスライドイン(オフキャンバス)
- 大きなタッチターゲット(最低48px)のフルハイトオーバーレイ
- ドロップダウン項目は縦に展開
ナビレイアウトにFlexbox使用。
ホバーステートとモバイルメニュートグルにスムーズトランジション。
モバイルメニュートグルには小さなJavaScriptスニペットが必要(別途提供)。
ダークモード
このスタイルシートにダークモードサポートを追加:
[既存CSSを貼り付け]
要件:
1. @media (prefers-color-scheme: dark)でシステム設定を検出
2. CSSカスタムプロパティ(色、シャドウ)のみをオーバーライド——コンポーネントスタイルではなく
3. 十分なコントラスト比を確保(WCAG AA: テキストに4.5:1)
4. シャドウ色を調整(ダークモードではより暗いrgba値)
5. 画像:明るさを若干下げる
手動トグルクラス(body.dark-mode)も追加してシステム設定をオーバーライド可能に。
✅ Quick Check: ダークモードでコンポーネントスタイルを書き直すのではなく、カスタムプロパティをオーバーライドする理由は?
コンポーネントがvar(--color-bg)とvar(--color-text)を使っていれば、ダークモードへの切り替えは変数定義を変えるだけ。background: var(--color-primary)とcolor: var(--color-on-primary)を使うボタンは、追加CSSなしで両モードで動く。デザイントークンの力:1つの変更がすべてに伝搬する。
CSS検証
AI生成CSSの後、よくある問題をチェック:
このCSSの品質とベストプラクティスをレビュー:
[CSSを貼り付け]
確認項目:
1. ハードコードされた色やスペーシング(カスタムプロパティを使うべき)
2. モバイルファーストメディアクエリの欠如(max-widthではなくmin-widthを使うべき)
3. アクセシビリティの問題(コントラスト、フォーカスステート、タッチターゲット)
4. パフォーマンスの問題(高コストなセレクター、大きなbox-shadow、過剰なアニメーション)
5. ダークモードの考慮漏れ
6. 一貫性のない命名規則
7. 詳細度の衝突や!importantの使用
各問題の改善策を提案。
演習:ページをスタイリング
- カスタムプロパティプロンプトでデザイントークンファイルを作成
- レッスン2で構築したHTMLにレスポンシブレイアウト(Grid)を適用
- 4枚以上のカードグリッドセクションを追加
- プライマリとセカンダリのバリアント付きボタンシステムを追加
- カスタムプロパティオーバーライドでダークモードサポートを追加
- モバイル(375px)、タブレット(768px)、デスクトップ(1200px)幅でテスト
Key Takeaways
- プロジェクトはデザイントークン(CSSカスタムプロパティ)から始める——色、スペーシング、タイポグラフィ、シャドウを1回定義してどこでも使う
- モバイルファーストCSS(ベーススタイル+min-widthクエリ)はデスクトップファースト(オーバーライド+max-widthクエリ)よりクリーン
- CSS Gridは2次元レイアウト(ページ構造、カードグリッド)、Flexboxは1次元の配置(ナビバー、カード内部)
clamp()でブレークポイント不要のフルイドタイポグラフィ- カスタムプロパティを使えばダークモードは簡単——コンポーネントではなくトークンをオーバーライド
- AI生成CSSは常にハードコード値、フォーカスステートの欠如、アクセシビリティのコントラスト問題を検証する
Up Next: 次のレッスンでは、JavaScriptでインタラクティビティを追加する——DOM操作、イベントハンドリング、ページに命を吹き込む動的機能。
理解度チェック
まず上のクイズを完了してください
レッスン完了!