Responsive Design — 基礎、画面に合わせたインターフェースの適応

著者: IT Sectr 公開日: 2026-02-25 読了時間: 9 分

Responsive Designは、レイアウトがデバイスのサイズ、向き、種類に自動的に適応するインターフェース構築のアプローチです。モバイル開発では、responsive designはiOSのsize classesとAndroidのconfiguration qualifiersを通じて実装されます。この記事では、アダプティブレイアウトの原則、両プラットフォームのツール、コード例を解説します。

重要なポイント

  • Responsive Design — さまざまな画面サイズ、向き、デバイスタイプへのインターフェース適応
  • Size Classes — 横方向と縦方向のコンパクトまたはレギュラーサイズを判定するiOSのメカニズム
  • Configuration Qualifiers — さまざまな画面設定のためのAndroidリソース(layout-w600dp、values-sw600dp)
  • アダプティブグリッド — 画面幅の変更時の要素の再構成、単なる引き伸ばしではない
  • Breakpoints — レイアウト状態間の移行ポイント(例:iPhoneの375 pt、iPadの768 pt)

Responsive Designとは?

Responsive Designは、レイアウトが画面サイズ、向き、利用可能なスペースに応答し、機能を失うことなく要素を再配置するインターフェース構築の手法です。この用語は2010年にEthan Marcotteがウェブデザインのために提唱しましたが、その原則はネイティブモバイルアプリケーションにも完全に適用できます。

モバイル開発において、responsive designは同じアプリケーションがすべてのデバイスで正しく表示されることを意味します:iPhone SE(375 pt)からiPad Pro(ポートレート1024 pt)、Androidスマートフォン(360 dp)からタブレット(800 dp)まで。主要な要素はフレキシブルグリッドアダプティブ画像、およびフレームワークレベルのメディアクエリ(size classes、qualifiers)です。

Apple Developer Documentationによると、アプリケーションはユニバーサルであるべきです — 別途iPadビルドなしですべてのデバイスで動作する必要があります。Google PlayはJetpack WindowManagerとcanonical layoutsを通じたアダプティブレイアウトの使用を推奨しています。タブレット対応の欠如は否定的なレビューの一般的な原因です。

Responsive vs Adaptive Design

Responsiveadaptiveという用語は、異なるアプローチを説明しているにもかかわらず、しばしば混同されます。Responsive designは画面幅に継続的に調整される柔軟なグリッドを使用します。Adaptive designは事前に定義されたbreakpoints用の固定レイアウトを使用し、アプリケーションはそれらの間を段階的に切り替えます。

特性Responsive DesignAdaptive Design
アプローチスムーズな流動個別の切り替え
グリッドパーセンテージベース、流動的各breakpointごとに固定
実装Auto Layout、Flexbox、ConstraintLayoutSize Classes、layout-w600dp、個別のstoryboards
デザインレイアウト数1つだが柔軟複数(ポートレート、ランドスケープ、タブレット)

実際には、モバイルアプリは両方のアプローチを組み合わせて使用します。ベースグリッドはレスポンシブに構築され(Auto Layoutとconstraint依存関係)、breakpoint(例:幅 > 600 pt)に達すると、レイアウトは異なる要素配置のアダプティブバージョンに切り替わります。iOSはAuto Layout(responsive)とSize Classes(adaptive)を組み合わせます。AndroidはConstraintLayout(responsive)とqualifierリソース(adaptive)を組み合わせます。

iOS Size Classes: CompactとRegular

Size Classesは、利用可能な画面スペースを水平と垂直の2軸で分類するiOSのメカニズムです。各軸はCompact(C)またはRegular(R)になります。組み合わせにより4つのレイアウト適応オプションが得られます:CR(標準的なiPhoneポートレート)、RR(iPadポートレート/ランドスケープ)、RC(Plus/Pro MaxのiPhoneランドスケープ)、CC(iPad Split View)。

swift
// SwiftでのSize Classesの定義
import UIKit

class AdaptiveViewController: UIViewController {

    override func traitCollectionDidChange(
        _ previousTraitCollection: UITraitCollection?
    ) {
        super.traitCollectionDidChange(previousTraitCollection)
        adjustLayout(for: traitCollection)
    }

    private func adjustLayout(for traits: UITraitCollection) {
        switch (traits.horizontalSizeClass, traits.verticalSizeClass) {
        case (.regular, .regular):
            showSplitView() // iPad — master-detailを表示
        case (.compact, .regular):
            showStackedView() // iPhoneポートレート — スタックレイアウト
        case (.compact, .compact):
            showCompactView() // iPhone SEランドスケープ — 最小化
        default:
            showDefaultView()
        }
    }

    private func showSplitView() {
        // UISplitViewControllerまたはHStackの使用
    }

    private func showStackedView() {
        // iPhone用の縦スタック
    }

    private func showCompactView() {
        // 副次的な要素を非表示、主要なものを表示
    }
}

Interface Builderでは、Size Classesは「wAny hAny」パネルを通じて設定されます — 開発者は特定の組み合わせ(wRegular hRegular、wCompact hRegular)を選択し、constraintバリエーションを追加します。SwiftUIはリアクティブ適応のために@Environment(\.horizontalSizeClass)@Environment(\.verticalSizeClass)を使用します — 向きやウィンドウサイズが変わると、SwiftUIは自動的にビューを再描画します。

swift
// SwiftUIでのSize Classes
import SwiftUI

struct ResponsiveView: View {
    @Environment(\.horizontalSizeClass) private var hSizeClass

    var body: some View {
        if hSizeClass == .regular {
            // iPad — サイドバー付き横レイアウト
            HStack {
                SidebarView()
                    .frame(width: 300)
                ContentView()
            }
        } else {
            // iPhone — 全画面縦スタック
            VStack {
                ContentView()
            }
        }
    }
}

Android Configuration Qualifiers

Configuration Qualifiersは、デバイスの特性に基づいて異なるリソース(layout、values、drawables)をロードするAndroidのメカニズムです。修飾子には画面サイズ(small、normal、large、xlarge)、向き(port、land)、最小幅(sw<N>dp)、利用可能な幅(w<N>dp)、高さ(h<N>dp)が含まれます。

kotlin
// Kotlinでのデバイス設定の検出
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = resources.configuration
        val screenWidthDp = config.screenWidthDp
        val screenHeightDp = config.screenHeightDp
        val orientation = config.orientation

        when {
            screenWidthDp >= 900 -> setContentView(R.layout.activity_main_tablet)
            screenWidthDp >= 600 -> setContentView(R.layout.activity_main_sw600)
            else -> setContentView(R.layout.activity_main_phone)
        }
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, LandscapeFragment())
                .commit()
        }
    }
}

さまざまな画面のリソース構造:res/layout/activity_main.xml(電話)、res/layout-sw600dp/activity_main.xml(7インチタブレット)、res/layout-sw720dp/activity_main.xml(10インチタブレット)。AndroidはsmallestWidthに基づいて自動的に正しいレイアウトを選択します — 向きに関係なくdp単位の最小画面幅。sw<N>dp修飾子が最も安定した適応方法です。

kotlin
// Jetpack Compose — 適応のためのWindowSizeClass
@Composable
fun ResponsiveScreen() {
    val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass

    when {
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.EXPANDED -> {
            TabletLayout() // >= 840 dp
        }
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.MEDIUM -> {
            MediumLayout() // 600–840 dp
        }
        else -> {
            CompactLayout() // < 600 dp
        }
    }
}

Jetpack WindowManager(androidx.windowライブラリ)は、3つの幅カテゴリを持つWindowSizeClassを提供します:COMPACT(0–600 dp)、MEDIUM(600–840 dp)、EXPANDED(>840 dp)。これは古いqualifierフォルダーの最新の代替手段です。折りたたみ可能デバイスやタブレットへの適応のためにGoogleが推奨しています。

アダプティブグリッドとbreakpoints

アダプティブグリッドはresponsive designの基礎です。固定サイズの代わりに、要素はパーセンテージ比率、柔軟なconstraints、固有コンテンツサイズを使用します。Breakpointsは、レイアウトが状態間で切り替わる画面幅のポイントです。

BreakpointiOS Size ClassAndroid Qualifierデバイスタイプ
0–374 pt / dpCompact widthiPhone SE、古いAndroid
375–599 pt / dpCompact widthsw320dpiPhone 14、Galaxy S24
600–839 pt / dpRegular widthsw600dpiPad mini、7インチタブレット
840+ pt / dpRegular widthsw720dpiPad Pro、10インチタブレット

Google Material DesignとApple HIGが推奨するbreakpoints:0–599 dp(電話、1列)、600–839 dp(タブレット、2列、navigation rail)、840+ dp(タブレット、3列、navigation drawer)。Breakpointsの数は4を超えるべきではありません — 過剰な移行ポイントはメンテナンスとテストを複雑にします。

アダプティブデザインのベストプラクティス

成功するresponsive designには、過去10年間にiOSおよびAndroid開発者コミュニティによって開発された一連のルールに従う必要があります。以下は、Apple HIG、Google Material Design、およびプロダクションプロジェクトの経験に基づく主要な推奨事項です。

  • 最小の画面から始める — iPhone SE(375 pt)またはAndroid compact(360 dp)用にレイアウトを設計し、その後大きな画面用の拡張を追加します。これにより、重要なコンテンツがどこにでも収まるようになります
  • 固有コンテンツサイズを使用する — UILabel、UIButton、ImageViewには自然なサイズがあります。Auto LayoutとConstraintLayoutはそれらを利用して、余分なconstraintsなしで自動配置を行います
  • 小さな画面でコンテンツを隠さない — 隠す代わりに、再構成(reflow)します。ユーザーは同じ機能にアクセスできる必要があり、単に別の順序であるだけです
  • すべてのSize Classesでテストする — iOSシミュレータは再起動せずにSize Classesを切り替えられます。Android Emulatorはさまざまなデバイスプロファイルを提供します。タブレットや折りたたみ可能デバイスでも必ずテストしてください
  • Material 3 Adaptive Layout — Googleはリスト/詳細、ツールバー、ナビゲーション用の既製のcanonical layoutsを提供しています。独自のパターンを考案する代わりにそれらを使用してください

アダプティブデザインの主要な原則:コンテンツがレイアウトを定義するのであって、その逆ではありません。iPadがiPhoneと同じカードスタックを単に引き伸ばして表示する場合 — それはresponsive designではありません。Responsive designはレイアウトを再考します:iPhoneでは縦スクロール、iPadではサイドバー付きmaster-detail。

よくある質問

Responsive DesignとAdaptive Layoutの違いは何ですか?

Responsive Designは画面幅にスムーズに調整される柔軟なグリッドを使用します。Adaptive Layoutはbreakpointポイントで固定レイアウト間を切り替えます。実際には、両方のアプローチが組み合わされます:レスポンシブなベースグリッド+大きな変更(電話 vs タブレット)用のアダプティブ切り替え。

iOSにはどのようなSize Classesがありますか?

iOSは2つの軸を使用します:水平(Compact/Regular)と垂直(Compact/Regular)。ポートレートのiPhone — Compact width、Regular height(CR)。iPad — Regular width、Regular height(RR)。ランドスケープのiPhone Plus/Pro Max — Regular width、Compact height(RC)。開発者は各組み合わせに対してconstraintバリエーションを設定します。

Androidのsw600dpとは何ですか?

sw600dp(smallestWidth 600 dp)はAndroidリソース修飾子で、デバイスの最小画面幅が少なくとも600 dpであることを意味します。タブレット(7インチ以上)用の代替レイアウトをロードするために使用されます。向きは影響しません — swは画面の小さい方を考慮します。

アプリの適応性をテストするには?

iOSでは、さまざまなSize ClassesのシミュレータとさまざまなサイズのデバイスでのSwiftUI Previewを使用します。Androidでは — エミュレータのデバイスプロファイル(Pixel 5、Pixel C、Galaxy Tab)とAndroid StudioのLayout Validationを使用します。両プラットフォームで、実際のiPad/Androidタブレットと折りたたみ可能デバイスでテストしてください。

Material Designのcanonical layoutsとは?

Canonical layoutsはGoogle Material Design 3の既製のアダプティブレイアウトパターンです:list-detail、feed(カードフィード)、supporting pane(メインコンテンツ+アクションパネル)。各パターンには3つのバリアント(compact/medium/expanded)があり、WindowSizeClassに自動的に適応します。

まとめ

  • Responsive Design — 柔軟なグリッドとbreakpointsを通じた画面サイズと向きへのレイアウト適応
  • Size Classes(iOS、Compact/Regular)はiPhone、iPad、Split Viewのレイアウトを定義
  • Configuration Qualifiers(Android、sw<N>dp、w<N>dp、layout-land)はデバイスに応じてリソースをロード
  • Jetpack WindowManagerは3つのカテゴリのWindowSizeClassを提供:COMPACT、MEDIUM、EXPANDED
  • Breakpoints:0–599 dp(電話)、600–839 dp(タブレット)、840+ dp(ワイドタブレット)
  • Responsive ≠ 単なる引き伸ばし — コンテンツを隠すのではなく要素の再構成が必要
  • テストはタブレットや折りたたみ可能デバイスを含むすべてのデバイスタイプで必須の開発段階

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください