レスポンシブデザイン
1つのHTML/CSSで、スマホからPCまで多様な画面幅にしなやかに対応する設計手法。ビューポート設定とメディアクエリ、相対単位、Flex/Grid が土台。
- 1.同じHTMLのまま、CSS側で画面幅に応じてレイアウトを切り替える。デバイスごとに別ページを作らない。
- 2.土台は3点セット:viewport メタタグ+相対単位(%, rem, fr, vw)+メディアクエリ。固定px幅を避けるのが基本。
- 3.今の定石はモバイルファースト。狭い画面を基準に書き、min-width のブレークポイントで広い画面へ“足していく”。
「スマホ用サイト(m.example.com)とPC用サイトを別々に作る」時代もありましたが、画面サイズは無段階に多様化し、それでは管理しきれません。今は 同じコンテンツを1セットだけ持ち、表示方法だけを可変にする のが標準です。
土台になる3点セット
レスポンシブは魔法ではなく、3つの仕組みの組み合わせで成り立ちます。
- ビューポート設定(meta タグ)— スマホに「実寸で表示して」と指示する
- 相対単位+可変レイアウト(%, rem, fr, Flex/Grid)— 幅を固定しない
- メディアクエリ(
@media)— 画面幅の境目でスタイルを切り替える
順に見ていきます。
① ビューポート:まず最初に書く1行
スマホのブラウザは、何も指定しないと「横幅980px相当の仮想画面でページを描画し、それを縮小表示」します。PC向けに作られた古いサイトでも崩れず読めるようにするための互換挙動ですが、レスポンシブ対応サイトではこれが邪魔になり、全体が極端に縮んで表示されてしまいます。
そこで <head> に次の1行を入れ、「実機の幅(device-width)で、等倍(initial-scale=1)で描画して」と伝えます。
<meta name="viewport" content="width=device-width, initial-scale=1" />
メディアクエリを正しく書いても、viewport メタタグが無いとスマホは「自分は980px幅だ」と思い込み、PC向けの広い側のスタイルを当ててから全体を縮小します。結果、文字が極小になりレイアウトも崩れる。レスポンシブの“出発点”であり、最初に書くべき1行です。
なお user-scalable=no や maximum-scale=1 でピンチズームを禁止するのは、拡大できないと困る人(弱視など)を締め出すためアクセシビリティ上避けるべきです。
② 固定px幅をやめる:相対単位
レスポンシブの本質は「幅を画面に委ねる」こと。width: 960px のように絶対値で固定すると、その幅より狭い画面で横スクロールが発生します。代わりに相対的な単位を使います。
| 単位 | 何に対して相対? | 主な用途 |
|---|---|---|
| % | 親要素のサイズ | 幅・余白を親に比例させる |
| rem | ルート(html)のフォントサイズ | 文字・余白の一貫したスケール |
| em | その要素自身のフォントサイズ | ボタン内の余白などローカルな比率 |
| vw / vh | ビューポートの幅 / 高さの1% | 画面いっぱいの見出しやヒーロー |
| fr | Grid内の余りスペースの割合 | Grid列の柔軟な配分 |
たとえば「画面幅の90%・ただし最大720pxまで」は、固定値を併用しつつ次のように書けます。
.container {
width: 90%; /* 狭い画面では画面に追従 */
max-width: 720px; /* 広い画面では広がりすぎない */
margin-inline: auto;
}
枠線(border: 1px)や角丸の半径など「画面幅で伸縮させたくない」ものは px のままが自然です。要は “レイアウトの幅と、文字サイズ”を相対化 するのが肝。font-size を rem 基準にすると、ユーザーがブラウザの既定文字サイズを大きくした設定も尊重できます。
③ メディアクエリ:境目でスタイルを切り替える
@media を使うと、「画面幅が〜のときだけこのCSSを適用」と条件分岐できます。最も使うのは幅の条件です。
/* 画面幅が 768px 以上のときだけ適用 */
@media (min-width: 768px) {
.layout { display: grid; grid-template-columns: 1fr 2fr; }
}
min-width(その値以上で適用)と max-width(その値以下で適用)の2系統があります。どちらを基準にするかが、次の「モバイルファースト」の話に直結します。
幅以外にも、印刷用(@media print)、ユーザーの設定を尊重する条件などが書けます。
/* OS側で「動きを減らす」設定の人にはアニメを止める(配慮) */
@media (prefers-reduced-motion: reduce) {
* { animation: none !important; transition: none !important; }
}
モバイルファースト:狭い側を基準に“足していく”
ブレークポイントの書き方には2方向あります。
- モバイルファースト:まず狭い画面(スマホ)向けのスタイルを素のCSSで書き、
min-widthで広い画面向けを 上書き・追加 していく。 - デスクトップファースト:まず広い画面向けに書き、
max-widthで狭い画面向けに打ち消していく。
| 観点 | モバイルファースト | デスクトップファースト |
|---|---|---|
| 基準 | 狭い画面(既定スタイル) | 広い画面(既定スタイル) |
| 主に使う条件 | min-width で上に積む | max-width で下に打ち消す |
| CSSの傾向 | 足し算(加えていく) | 引き算(上書きで消す) |
| 性能・保守 | スマホで余計なCSSを読まず軽い | 上書きが増えて複雑になりがち |
今の定石はモバイルファーストです。スマホの方が回線・CPUが非力なことが多く、「まず1カラムの素直なレイアウト=余計な上書きなし」を基準にできるのが効きます。広くなったら段組みを“足す”という発想は、CSSの見通しも良くします。
/* 既定(モバイル):縦積み。メディアクエリ無しで成立させる */
.cards { display: grid; gap: 16px; }
/* 中画面:2カラムに */
@media (min-width: 600px) {
.cards { grid-template-columns: repeat(2, 1fr); }
}
/* 広画面:3カラムに */
@media (min-width: 960px) {
.cards { grid-template-columns: repeat(3, 1fr); }
}
Flex と Grid:そもそも崩れにくいレイアウト
メディアクエリで“切り替える”前に、幅に応じて自然に折り返すレイアウトを使えば、ブレークポイントの数を減らせます。CSSの2大レイアウト手法が役立ちます。
| 手法 | 得意なこと | 向く場面 |
|---|---|---|
| Flexbox | 一方向(横 or 縦)の並びと折り返し | ナビ、ボタン列、カードの横並び |
| Grid | 行と列の2次元レイアウト | ページ全体の骨格、カードの格子 |
たとえば Grid の auto-fit + minmax() を使うと、メディアクエリを1つも書かずに「入るだけ並べ、入らなければ自動で折り返す(=列数が画面幅で勝手に変わる)」が実現できます。
.cards {
display: grid;
/* 最小240px・余れば均等に伸びる列を、入るだけ自動配置 */
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 16px;
}
「iPhoneは375px、iPadは768px……」と機種を覚えて合わせるのは筋が悪い(機種は無数にあり、毎年増える)。正しくは、ウィンドウを少しずつ広げて“レイアウトが窮屈・間延びして見えた幅”をブレークポイントにする=コンテンツ起点で決めるのが定石です。
つまずきポイント
スマホで「右に少しスクロールできてしまう」典型原因は、画面より広い固定px要素(width: 500px の画像や表など)。画像は max-width: 100%; height: auto; を既定にし、box-sizing: border-box(padding/border を幅に含める)で計算ズレを防ぐのが定番の予防策です。
/* レスポンシブの“地味だが効く”定番リセット */
*, *::before, *::after { box-sizing: border-box; }
img, video { max-width: 100%; height: auto; }
幅に合わせてレイアウトを変えても、スマホで重い高解像度画像をそのまま読み込むと通信は重いまま。中身の最適化は別問題で、<img srcset>/<picture> で画面に応じた画像を出し分ける、遅延読み込み(loading="lazy")を使う、といった配信側の工夫が必要です。見た目の可変化と、データ量の最適化は分けて考えましょう。
スマホは指で操作します。リンクやボタンが小さすぎると押し間違える(推奨は概ね44px四方以上)、:hover 前提のUIはタッチ端末で発火しない、といった操作面の差も“レスポンシブ”の一部。幅だけでなく入力手段の違いまで意識すると、実用的な対応になります。
まとめ
レスポンシブの芯は3つ:①viewport メタタグで等倍表示、②固定px幅をやめ相対単位+Flex/Gridで伸縮、③メディアクエリ(min-width)で境目を切り替え。発想はモバイルファーストで、狭い画面を基準に広い側を“足していく”。ブレークポイントは機種ではなくコンテンツが崩れる幅で決める——ここを押さえれば、どんな画面幅にも破綻しないページが作れます。土台のCSSそのものはCSSの基礎、配置の仕組みはブラウザのレンダリングも合わせてどうぞ。
Web/フロントエンド Article
レスポンシブデザインを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
レスポンシブ
比較で見る軸
難易度: intermediate / カテゴリ: Web/フロントエンド / タグ数: 4
導入後に効く点
土台は3点セット:viewport メタタグ+相対単位(%, rem, fr, vw)+メディアクエリ。固定px幅を避けるのが基本。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- Web/フロントエンド
- タグ数
- 4
判断チェックリスト
- 自社の用途が「レスポンシブ / CSS」に近いか確認する。
- 強みである「同じHTMLのまま、CSS側で画面幅に応じてレイアウトを切り替える。デバイスごとに別ページを作らない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。