レスポンシブデザイン
CSS
media queries、viewport、モバイルファースト
メディアクエリ
@media で画面サイズに応じたスタイルを適用
/* モバイルファースト(min-width 推奨)*/
/* ベース: スマホ */
.container { padding: 1rem; }
/* タブレット以上 */
@media (min-width: 768px) {
.container { padding: 2rem; }
.grid { grid-template-columns: repeat(2, 1fr); }
}
/* デスクトップ以上 */
@media (min-width: 1024px) {
.grid { grid-template-columns: repeat(3, 1fr); }
}
/* ワイドスクリーン */
@media (min-width: 1280px) {
.container { max-width: 1280px; margin: 0 auto; }
}
/* Tailwindの標準ブレークポイント */
/* sm: 640px md: 768px lg: 1024px xl: 1280px 2xl: 1536px */
/* デスクトップファースト(max-width)*/
@media (max-width: 767px) {
.sidebar { display: none; }
}
/* 範囲指定 */
@media (768px <= width <= 1023px) { /* 新構文 */
.nav { flex-direction: column; }
}メディア特性
orientation、hover、color-scheme など
/* 向き */
@media (orientation: portrait) { /* 縦向き */ }
@media (orientation: landscape) { /* 横向き */ }
/* ポインターデバイス */
@media (hover: hover) {
/* マウスあり(hover可能なデバイス)*/
.card:hover { transform: translateY(-4px); }
}
@media (pointer: coarse) {
/* タッチスクリーン → タップターゲットを大きく */
button { min-height: 44px; min-width: 44px; }
}
/* ダークモード */
@media (prefers-color-scheme: dark) {
:root {
--bg: #0f172a;
--text: #f1f5f9;
}
}
/* 高コントラスト */
@media (prefers-contrast: high) {
.card { border: 2px solid currentColor; }
}
/* 印刷 */
@media print {
.no-print { display: none; }
a::after { content: " (" attr(href) ")"; }
}流体タイポグラフィ
clamp() で画面サイズに応じて自動調整
/* clamp(最小値, 推奨値, 最大値) */
:root {
/* font-size: 画面幅768pxで1rem、1440pxで1.25rem の間で補間 */
font-size: clamp(1rem, 0.75rem + 0.5vw, 1.25rem);
}
h1 { font-size: clamp(2rem, 5vw, 4rem); }
h2 { font-size: clamp(1.5rem, 3vw, 2.5rem); }
/* 流体スペーシング */
.section {
padding: clamp(2rem, 8vw, 8rem);
margin-bottom: clamp(3rem, 10vw, 12rem);
}
/* 流体グリッド */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(clamp(200px, 30%, 300px), 1fr));
gap: clamp(1rem, 3vw, 2rem);
}
/* コンテナクエリ(親要素のサイズに応じて)*/
.card-container {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 400px) {
.card { flex-direction: row; }
}ビューポート単位
vw、vh、dvh、svh、cqw など
/* 従来のビューポート単位 */
.hero { height: 100vh; } /* ビューポートの高さ100% */
.banner { width: 50vw; } /* ビューポートの幅50% */
.text { font-size: 4vmin; } /* vw と vh の小さい方 */
/* 問題: モバイルではアドレスバーで 100vh がずれる */
/* 新しいビューポート単位(モバイル対応)*/
.hero {
/* svh: スモール(アドレスバー表示時) */
height: 100svh;
/* lvh: ラージ(アドレスバー非表示時) */
height: 100lvh;
/* dvh: ダイナミック(現在の状態)← 推奨 */
height: 100dvh;
}
/* コンテナクエリ単位 */
.child {
width: 50cqw; /* コンテナ幅の50% */
height: 50cqh; /* コンテナ高さの50% */
font-size: 4cqi; /* インラインサイズ基準 */
}