モバイルファーストの考え方
モバイルファーストは、最初に狭い画面で読みやすく動くレイアウトを作り、画面が広くなるほど情報量を増やす設計です。後から削るより、後から足すほうがCSSの競合を減らしやすく、保守もしやすくなります。
- モバイル起点で基本形を作る
- スマホで窮屈にならない1カラムを先に完成させると、土台が安定します
- 広い画面では追加で拡張する
@media (min-width: ...)で列数や余白を段階的に増やすと管理しやすいです
- 上書きの衝突を減らせる
- 先にPC向けを作って縮める方法より、不要な打ち消しが少なくなります
- 体験を崩しにくい
- 通信環境や端末性能が厳しい環境でも、まず基本機能が成立しやすくなります
設計方針の違い
同じ完成形でも、作る順序で保守性が変わります
デスクトップファースト
最初に広い画面を作る
打ち消しが増える
狭い画面で上書きが多くなる
狭い画面で上書きが多くなる
調整点が散らばる
どの幅で変えたか追いにくい
どの幅で変えたか追いにくい
崩れの再発が起きやすい
一部修正で別幅が崩れやすい
一部修正で別幅が崩れやすい
モバイルファースト
最初に狭い画面を作る
追加の設計になる
必要な分だけ段階的に強化できる
必要な分だけ段階的に強化できる
意図が読み取りやすい
どの幅で何を足したか明確になる
どの幅で何を足したか明確になる
保守がしやすい
競合が減り変更の影響範囲を追いやすい
競合が減り変更の影響範囲を追いやすい
min-widthで積み上げる基本
ここでは、学習カード一覧を題材に、モバイルを基準にした積み上げを作ります。最初は1カラム、次に2カラム、最後に3カラムへ拡張します。
HTML
<section class="course-list">
<article class="course-card">HTML基礎</article>
<article class="course-card">CSS基礎</article>
<article class="course-card">JavaScript基礎</article>
<article class="course-card">レイアウト実践</article>
<article class="course-card">アクセシビリティ</article>
<article class="course-card">公開と運用</article>
</section> CSS
.course-list {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
padding: 16px;
}
.course-card {
padding: 16px;
border-radius: 12px;
background: #ecfdf5;
color: #065f46;
font-weight: 700;
}
@media (min-width: 640px) {
.course-list {
grid-template-columns: repeat(2, 1fr);
gap: 16px;
padding: 20px;
}
}
@media (min-width: 1024px) {
.course-list {
grid-template-columns: repeat(3, 1fr);
gap: 20px;
padding: 24px;
}
} CSSコード:
プレビュー:
※プレビューの右下にあるアイコンをドラッグして、実際の画面幅を動かして切り替えを確認できます。
実務で使える書き方テンプレート
ここでは「何を、どの順番で足していくか」が分かる書き方を練習します。
まず大事なのは次の3つです。
- 最初はスマホ1カラムで完成させる
- 先に土台を作ると、後で崩れた場所を見つけやすくなります
- 画面が広くなったときだけ追加する
@media (min-width: ...)を使って、必要な変更だけ足します
- なぜその幅かをコメントで残す
- 将来の自分やチームが見ても、判断理由をすぐ思い出せます
最小テンプレート(考え方の土台)
:root {
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
}
.dashboard-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-3);
padding: var(--space-4);
}
.dashboard-card {
border-radius: 12px;
padding: var(--space-4);
background: #ffffff;
}
/* 640px: 2カラムを無理なく読める幅 */
@media (min-width: 640px) {
.dashboard-grid {
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
padding: var(--space-5);
}
}
/* 1080px: 情報密度を上げても詰まらない幅 */
@media (min-width: 1080px) {
.dashboard-grid {
grid-template-columns: repeat(3, 1fr);
gap: var(--space-5);
padding: var(--space-6);
}
} ※この最小テンプレートと同じ考え方を、下の実務サンプルで「学習ダッシュボード」に広げています。
- このあと確認するポイント
- 360px付近: 1カラムで読めるか
- 640px付近での変化
- 2カラムになっても文字が詰まらないか
- 1024px付近での変化
- 3カラムでも情報が窮屈にならないか
- 下段カードの扱い
- 優先タスクカードが横幅いっぱいで読みやすく保たれるか
HTMLコード:
プレビュー:
※右下アイコンのドラッグで、プレビューを枠外へ拡大して崩れ位置を確認できます。
ブレークポイントを実測で決める手順
モバイルファーストでも、境界値を感覚で決めると再現性が下がります。実装後は「どこで読みにくくなるか」を観察し、候補値を比較して決める流れを徹底します。
- 幅を連続で縮めて崩れを見つける
- 例として 420px → 390px → 360px の順に確認します
- 読みにくさの種類を記録する
- 行長、改行、タップミス、余白不足を分けてメモします
- 候補値を前後で比較する
- 例として 620px / 640px / 660px を並べて、見た目差を確認します
- 最終値に根拠コメントを付ける
- チームで同じ判断を再現できるように残します
観察メモの例(テキストで十分)
[component] dashboard-grid
- 620px: 2カラムで本文が詰まり、ボタンが折り返す
- 640px: 2カラムでも本文2行で収まり、タップ領域も確保
- 660px: 問題なし
=> min-width: 640px を採用 境界値を安定させる判断軸
- 可読性
- 行長が長すぎないか、改行が不自然でないか
- 操作性
- ボタンとリンクのタップ領域が十分か
- 密度
- 情報を増やしても圧迫感が出ないか
- 再現性
- 別メンバーが見ても同じ値を選べる根拠があるか
崩れたときの切り分けフロー
モバイルファーストでも崩れは発生します。問題が出たときは、原因を種類で分けると修正が早くなります。
- 症状: 横スクロールが出る
- 原因候補: 固定幅、
min-widthの残存、長いURL文字列 - 先に確認する修正:
width: 100%、overflow-wrap: anywhere、不要固定値の削除
- 原因候補: 固定幅、
- 症状: 文字が詰まって読みにくい
- 原因候補: 余白不足、列数過多、フォントサイズ不足
- 先に確認する修正:
gapとpaddingの増加、1列への戻し、本文サイズの調整
- 症状: ボタンが押しづらい
- 原因候補: 高さ不足、間隔不足、隣接要素との密集
- 先に確認する修正:
min-height、padding-block、要素間gapの見直し
- 症状: 境界付近だけ崩れる
- 原因候補: 複数media queryの競合、条件順序の逆転
- 先に確認する修正: query順序の整理、不要な上書き削除、コメントで目的を明記
ありがちな失敗と修正
モバイルファーストでよくある失敗は、最初から固定幅や横並びを前提にしてしまうことです。まず失敗例を見て、どこで崩れるのかを確認しましょう。
失敗しやすいCSS
.profile-list {
display: flex;
gap: 16px;
}
.profile-card {
width: 280px;
padding: 16px;
border-radius: 12px;
background: #f0fdf4;
} このコードはPCでは見えますが、スマホ幅ではカードが横にあふれてスクロールが発生しやすくなります。固定幅と横並びが先にあるためです。
修正後CSS(モバイル起点)
.profile-list {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
.profile-card {
width: 100%;
padding: 16px;
border-radius: 12px;
background: #f0fdf4;
}
@media (min-width: 768px) {
.profile-list {
grid-template-columns: repeat(2, 1fr);
gap: 16px;
}
} 修正前: スマホで横はみ出し
幅360pxの画面に固定幅カードが2枚並ぶ
結果: 横スクロールが発生しやすい
修正後: モバイル起点で安定
初期1カラム。768px以上で2カラムへ拡張
プロフィールA
プロフィールB
768px以上: 2カラム
余白も段階的に拡張
結果: 可読性と操作性が維持される
失敗を防ぐ観点
- 固定幅から始めない
- モバイル起点では
width: 100%を基本にすると崩れにくいです
- モバイル起点では
- 横並びを初期値にしない
- まず縦積みにし、必要な幅で列を増やします
- 余白も段階的に拡張する
- 幅だけでなく
gapやpaddingもmin-widthで足すと整います
- 幅だけでなく
- 実機幅で早めに確認する
- 360px前後で文字の折り返しとタップ領域を先に確認します
理解度チェッククイズ
モバイルファースト ミニクイズ
モバイルファーストの説明として最も適切なのはどれですか?
次のうち、モバイルファーストで一般的なmedia queryの書き方はどれですか?
スマホで横スクロールが出る原因として起こりやすいものはどれですか?
モバイルファーストで保守しやすくするコツとして適切なのはどれですか?
次のうち、モバイルファーストの利点として適切でないものはどれですか?
まとめ
モバイルファースト実装の要点
- 基本は狭い画面で完成させる
- 1カラムで読みやすさと操作しやすさを確保してから拡張します
min-widthで上に積み上げる- 画面が広いほど、列数・余白・情報量を段階的に増やします
- 固定幅を初期値にしない
- はみ出しを避けるため、まず
width: 100%と縦積みを基準にします
- はみ出しを避けるため、まず
- 崩れの確認を早めに行う
- 360px前後を最初に確認すると、大きな手戻りを防げます
- 境界値は実測で決める
- 候補幅を前後比較し、根拠コメントとセットで運用します
- 崩れは症状別に切り分ける
- 横はみ出し、可読性低下、操作性低下を分けて対処すると修正が速くなります