Web開発7分で読める

レスポンシブデザイン入門 - スマホ対応サイトの作り方

PC、タブレット、スマートフォンに対応したWebサイトを作るための基本テクニックを解説します。

レスポンシブデザインとは

レスポンシブデザインとは、1つのHTMLで様々な画面サイズに対応するWebデザイン手法です。PC、タブレット、スマートフォンなど、どのデバイスでも最適な表示を実現します。

現在、Webトラフィックの約60%がモバイルデバイスからです。レスポンシブデザインはSEOの観点からも必須となっています。

ビューポートの設定

HTMLのhead内にビューポートメタタグを追加します。これがないとモバイルで正しく表示されません。

必須のビューポート設定
<!-- 基本的なビューポート設定 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<!-- 各属性の意味 -->
width=device-width   → 幅をデバイスの幅に合わせる
initial-scale=1.0    → 初期ズーム倍率を100%に
maximum-scale=1.0    → 最大ズーム倍率(ユーザビリティのため非推奨)
user-scalable=no     → ズーム禁止(アクセシビリティのため非推奨)

メディアクエリの使い方

画面幅に応じてCSSを切り替えます。モバイルファーストで書くのが現在の主流です。

ブレークポイントの設計

一般的なブレークポイント
/* モバイルファースト:小さい画面から順に定義 */

/* デフォルト: モバイル(〜767px) */
.container {
  width: 100%;
  padding: 0 16px;
}

/* タブレット(768px〜) */
@media (min-width: 768px) {
  .container {
    max-width: 720px;
    margin: 0 auto;
  }
}

/* PC(1024px〜) */
@media (min-width: 1024px) {
  .container {
    max-width: 960px;
  }
}

/* 大画面PC(1280px〜) */
@media (min-width: 1280px) {
  .container {
    max-width: 1200px;
  }
}

よく使うメディアクエリパターン

メディアクエリの書き方
/* 最小幅(モバイルファースト) */
@media (min-width: 768px) { ... }

/* 最大幅(デスクトップファースト) */
@media (max-width: 767px) { ... }

/* 範囲指定 */
@media (min-width: 768px) and (max-width: 1023px) { ... }

/* 向き */
@media (orientation: landscape) { ... }
@media (orientation: portrait) { ... }

/* 高解像度ディスプレイ(Retina) */
@media (min-resolution: 2dppx) { ... }

/* ホバー対応デバイス(タッチ非対応) */
@media (hover: hover) {
  .button:hover {
    background: #0066cc;
  }
}

相対単位の活用

固定のpxではなく、相対的な単位を使うことで柔軟なレイアウトが作れます。

各単位の使い分け
/* rem - ルート要素のfont-sizeを基準(推奨) */
html { font-size: 16px; }  /* 1rem = 16px */
.heading { font-size: 1.5rem; }  /* = 24px */
.text { font-size: 1rem; }      /* = 16px */
.small { font-size: 0.875rem; } /* = 14px */

/* em - 親要素のfont-sizeを基準 */
.card { padding: 1.5em; }  /* 親のフォントサイズ × 1.5 */

/* % - 親要素を基準 */
.sidebar { width: 30%; }
.main { width: 70%; }

/* vw/vh - ビューポート幅/高さを基準 */
.hero {
  height: 100vh;     /* 画面の高さいっぱい */
  width: 100vw;      /* 画面の幅いっぱい */
}

/* clamp() - 最小値と最大値を設定(レスポンシブに最適) */
.title {
  /* 最小16px、理想は4vw、最大32px */
  font-size: clamp(16px, 4vw, 32px);
}

.container {
  /* 最小300px、理想は90%、最大1200px */
  width: clamp(300px, 90%, 1200px);
}

レスポンシブレイアウト実装

Flexboxによるレスポンシブ

Flexboxでカード並び替え
/* HTML: <div class="card-grid"><div class="card">...</div></div> */

.card-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.card {
  /* モバイル: 1列 */
  flex: 1 1 100%;
}

@media (min-width: 768px) {
  .card {
    /* タブレット: 2列 */
    flex: 1 1 calc(50% - 8px);
  }
}

@media (min-width: 1024px) {
  .card {
    /* PC: 3列 */
    flex: 1 1 calc(33.333% - 11px);
  }
}

CSS Gridによるレスポンシブ

CSS Gridの自動調整
/* メディアクエリなしで自動的に列数が変わる */
.auto-grid {
  display: grid;
  /* 最小250px、利用可能な幅で自動調整 */
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
}

/* auto-fit vs auto-fill */
/* auto-fit: 要素が少ない場合、引き伸ばして埋める */
/* auto-fill: 要素が少ない場合、空のスペースを維持 */

レスポンシブナビゲーション

ハンバーガーメニュー対応
/* HTML構造 */
<nav class="nav">
  <button class="menu-toggle">☰</button>
  <ul class="nav-list">...</ul>
</nav>

/* CSS */
.nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.menu-toggle {
  display: block;  /* モバイルで表示 */
  background: none;
  border: none;
  font-size: 24px;
}

.nav-list {
  /* モバイル: 隠す */
  display: none;
  position: absolute;
  top: 60px;
  left: 0;
  right: 0;
  background: #fff;
}

.nav-list.open {
  display: block;
}

@media (min-width: 768px) {
  .menu-toggle {
    display: none;  /* PCで非表示 */
  }

  .nav-list {
    display: flex;  /* PCで常に表示 */
    position: static;
    gap: 24px;
  }
}

実践的なデザインパターン

レスポンシブ画像

画像の最適化
/* 基本: 親要素に収める */
img {
  max-width: 100%;
  height: auto;
}

/* object-fit: アスペクト比を維持しながら収める */
.thumbnail {
  width: 100%;
  height: 200px;
  object-fit: cover;  /* 切り抜きで埋める */
}

/* HTML: srcset で解像度別の画像を提供 */
<img
  src="image.jpg"
  srcset="image-320.jpg 320w,
          image-640.jpg 640w,
          image-1280.jpg 1280w"
  sizes="(max-width: 600px) 100vw, 50vw"
  alt="説明">

レスポンシブテーブル

テーブルのモバイル対応
/* 方法1: 横スクロール */
.table-wrapper {
  overflow-x: auto;
}

/* 方法2: カード形式に変換 */
@media (max-width: 767px) {
  table, thead, tbody, tr, th, td {
    display: block;
  }

  thead {
    display: none;  /* ヘッダーを隠す */
  }

  tr {
    margin-bottom: 16px;
    border: 1px solid #ddd;
  }

  td {
    display: flex;
    justify-content: space-between;
    padding: 8px;
  }

  td::before {
    content: attr(data-label);  /* data属性からラベル表示 */
    font-weight: bold;
  }
}

モバイルファーストの完全例

ヘッダー+サイドバー+メインのレイアウト
/* HTML構造 */
<div class="layout">
  <header>ヘッダー</header>
  <aside>サイドバー</aside>
  <main>メインコンテンツ</main>
  <footer>フッター</footer>
</div>

/* モバイル(デフォルト): 縦並び */
.layout {
  display: grid;
  grid-template-areas:
    "header"
    "main"
    "aside"
    "footer";
  gap: 16px;
}

header { grid-area: header; }
aside  { grid-area: aside; }
main   { grid-area: main; }
footer { grid-area: footer; }

/* PC: サイドバーを左に配置 */
@media (min-width: 1024px) {
  .layout {
    grid-template-columns: 250px 1fr;
    grid-template-areas:
      "header header"
      "aside  main"
      "footer footer";
  }
}

まとめ

レスポンシブデザインは現代のWebサイトでは必須です。モバイルファーストで設計し、メディアクエリで大画面に対応させるアプローチが主流です。FlexboxやCSS Gridを活用すれば、複雑なレイアウトも簡潔に実装できます。当サイトもレスポンシブ対応しているので、PC・スマホ両方で確認してみてください。

H
honualohak編集部

テクノロジーで人々の日常をより便利に。AI、プログラミング、Web開発に関する情報を発信しています。