UIXHERO

Responsive Patterns(レスポンシブパターン)

画面サイズに応じてUIレイアウトを適応させる設計パターン集。ナビゲーションの変形・グリッドの折り畳み・コンポーネントの切り替えなど、モバイル・タブレット・デスクトップでの代表的な対応パターンとブレークポイント設計を解説する。

2026年3月3日
更新: 2026年9月11日
30
by Dengen Yosho(DGYS)

画面サイズ(モバイル・タブレット・デスクトップ)に応じてのレイアウトや表示方式を切り替える設計パターン集。単なる「幅が変わる」だけでなく、ナビゲーションの形態変化・グリッドの折り畳み・コンポーネントの完全な入れ替えまで、UIの根本的な適応方法を扱う。

この記事を読むと、モバイルファーストの設計原則・代表的な5つのレスポンシブパターン・ブレークポイント選定の考え方・コンポーネントレベルのレスポンシブ実装が自分でできるようになります。


1. UI例(Preview / Live)


2. 定義(Definition)

画面サイズに応じてUIのレイアウト・コンポーネント・操作方式を適応させる設計パターンの総称。CSSのメディアクエリ(@media)とTailwindのブレークポイントプレフィックス(sm: / md: / lg:)で実装される。

代表的な5つのレスポンシブパターン

パターン名内容
リフロー(Reflow)レイアウトの方向・カラム数を変える3カラム→1カラム
リビール(Reveal)大画面で追加要素を表示するデスクトップでサイドバー表示
コンポーネント置換コンポーネントそのものを入れ替えるテーブル→カード、→ハンバーガー
コンパクト化ラベルを隠してアイコンのみにするタブレットでアイコンサイドバー
オフスクリーン使用頻度が低いUIをドロワーに移動モバイルでフィルターをSheetに

3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • ナビゲーション:デスクトップ横並び → タブレット省略 → モバイルハンバーガー
  • データテーブル:デスクトップ全カラム → モバイルカード形式
  • サイドバー:デスクトップ常時表示 → タブレットアイコンのみ → モバイルSheet/Drawer
  • フォーム:デスクトップ横並びフィールド → モバイル縦積み

3.2 When NOT to use(避けるべきアンチパターン)

  • モバイルで単純に縮小するだけ:レイアウトを変えず縮小すると、が小さくなり操作しにくい
  • デスクトップで全情報・モバイルで一部非表示:重要情報がモバイルで見えないのはの問題

4. 設計判断の核(Decision Principles)

レスポンシブパターンの核は「モバイルファースト」——小さな画面から設計し、大きな画面に機能を追加する。大きな画面を縮小してモバイルに対応しようとすると、必ず破綻する。

判断の優先順位:① モバイルファーストのブレークポイント設計 → ② コンポーネント置換の判断 → ③ タッチの確保 → ④ ARIAの維持

  • ブレークポイントはコンテンツが壊れる点で決める:デバイスサイズ(375px / 768px / 1024px)で決めるのではなく、「このコンテンツがこの幅では崩れる」という点にブレークポイントを置く。Tailwindの sm: (640px) / md: (768px) / lg: (1024px) / xl: (1280px) はあくまで目安
  • テーブルはモバイルでカードに変換する:横スクロールテーブルは多くのモバイルUXで最悪のパターン。block md:table でモバイルのみカード形式に切り替えると、情報が読みやすくなる
  • ナビゲーションのハンバーガーメニューには aria-expanded が必須aria-expanded="false" → 開いた後 aria-expanded="true" に更新することで、スクリーンリーダーがメニューの開閉状態を認識できる
  • タッチターゲットは最低44×44px:モバイルのタップ対象は指の大きさに合わせて44×44px以上確保する。デスクトップでは24px程度でも機能するが、モバイルでは必ず拡大する

5. ブレークポイント設計(Breakpoints)

Tailwindのデフォルトブレークポイント

プレフィックス対象デバイス
(なし)0px〜モバイル(デフォルト)
sm:640px〜大きいスマートフォン・タブレット縦
md:768px〜タブレット横
lg:1024px〜ノートPC・デスクトップ
xl:1280px〜大きなデスクトップ
2xl:1536px〜ワイドモニター

モバイルファーストの書き方

/* ✅ モバイルファースト:まずモバイルを書いて、大きい画面で上書き */
.grid { grid-template-columns: 1fr; }
@media (min-width: 768px) { .grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .grid { grid-template-columns: repeat(3, 1fr); } }

/* ❌ デスクトップファースト(非推奨) */
.grid { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 1024px) { .grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 768px) { .grid { grid-template-columns: 1fr; } }

6. パターン集(Good / Bad / How to fix)

6.0 よく崩れる設計パターン(3つ)

  • デスクトップのテーブルをモバイルで横スクロールに:ユーザーが横スクロールを必要とするテーブルはモバイルで最悪のUX。カード形式への変換が解決策
  • ハンバーガーメニューに aria-expanded がない:スクリーンリーダーがメニューの開閉状態を把握できない
  • モバイルでタップターゲットが小さすぎる:デスクトップ向けの小さなリンクやボタン(16〜20px)がモバイルでタップしにくい

6.1 Bad(典型3つ)

  • モバイルでデスクトップ用のデータテーブルを表示し、右側の重要カラムが見切れる
  • ハンバーガーボタンを <div onClick> で実装し、role="button" もARtabIndex もない
  • デスクトップの12カラムグリッドをモバイルで transform: scale(0.5) で縮小して表示する

6.2 Good(対になる3つ)

  • <table className="hidden md:table"> + <div className="md:hidden space-y-2"> でモバイルはカード、デスクトップはテーブルを表示する
  • ハンバーガーボタンを <button aria-expanded={isOpen} aria-controls="mobile-menu" aria-label="メニュー"> で実装する
  • モバイルのリンク・ボタンに min-h-[44px] min-w-[44px] を設定してタップしやすくする

6.3 How to fix(手順)

  1. 全コンポーネントのモバイル表示を確認し、「テーブル」「横並びナビ」「小さいボタン」をリストアップする
  2. テーブルにモバイル用のカード表示を追加する(display: none / display: block の切り替え)
  3. ナビゲーションのハンバーガーメニューに aria-expanded + aria-controls + aria-label を付与する
  4. モバイルの全タップターゲットに最低44×44pxを確保する

7. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


8. アクセシビリティ要件(必須)

ハンバーガーメニュー

<button
  aria-expanded="false"
  aria-controls="mobile-nav"
  aria-label="ナビゲーションメニューを開く"
>
  <!-- ハンバーガーアイコン -->
</button>

<nav id="mobile-nav" hidden>
  <!-- ナビゲーション項目 -->
</nav>

aria-expanded を開閉に合わせて動的に更新し、hidden 属性でコンテンツの可視性を制御する。

Focus Management

モバイルメニューを開いた時は、メニュー内の最初のフォーカス可能な要素にフォーカスを移動する。閉じた時はハンバーガーボタンにフォーカスを戻す。


9. 実装メモ(Implementation Notes)

  • Tailwindのレスポンシブクラスhidden sm:block(smサイズ以上で表示)、block md:hidden(mdサイズ以上で非表示)を組み合わせてコンポーネントの表示・非表示を制御する
  • useMediaQuery フック:JSで画面サイズを検知して完全に異なるコンポーネントをレンダリングする場合(テーブル→カード)、カスタムフック useMediaQuery('(min-width: 768px)') を使って isMobile フラグを管理する
  • Container Query(CSS):Tailwind v3.2+ の @containercontainer-type を使うと、親コンテナのサイズに応じたスタイリングが可能。ビューポート幅ではなくコンポーネントのコンテナ幅で条件分岐できるため、再利用性が高い

10. 関連リンク


11. まとめ

Responsive Patternsの設計で最重要なのは「モバイルファーストの原則」と「コンポーネント置換の判断」です。迷ったら 4. 設計判断の核 に戻り、「モバイルから設計しているか」「テーブルをモバイルでカードに変換しているか」「ハンバーガーメニューに aria-expanded があるか」の3点を確認してください。「デスクトップで見せているものをモバイルでも見せる方法」を考えるのではなく、「モバイルで必要な情報は何か」から考えることがレスポンシブ設計の出発点です。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月11日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Day Band(いちにちの帯)

1日を1本の帯にして、時間帯を面で、節目を印で、いまの時刻とつまみを重ねて見せるUIコンポーネント。器が1日に固定されることの意味、4つの層の重ね方、印のラベルと時刻の数字を分ける理由、触った瞬間に動かさない理由を解説する。

2026年9月14日
24

Live Badge(LIVEの札)

隣の数字がいまの値かどうかを示す小さな札。状態を表す語を枠で囲って独立させる理由、明滅と色を補助に留める理由、実時間から外れたときに「古い」ではなく「いつの値か」を出す設計判断とARIA実装を解説する。

2026年9月14日
21

Time Transport(時間の操作盤)

いま映している時刻を、名前をつけた速さの段で動かし、決まった幅で飛ばし、ひと押しで「いま」へ戻すための操作盤。速さを連続値にしない理由、向きをアイコンに持たせる理由、状態を大きい表示の色で示さない理由を解説する。

2026年9月14日
25

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る