CSS

レスポンシブデザイン

CSS

media queries、viewport、モバイルファースト

メディアクエリ

@media で画面サイズに応じたスタイルを適用

media-queries.css css
/* モバイルファースト(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-features.css css
/* 向き */
@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() で画面サイズに応じて自動調整

fluid.css css
/* 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 など

viewport-units.css css
/* 従来のビューポート単位 */
.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; /* インラインサイズ基準 */
}