0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Tailwind CSS入門 Day13】レスポンシブ表示に切り替える

0
Last updated at Posted at 2026-05-23

目次

はじめに

この記事は、Tailwind CSSで管理画面UIを1ステップずつ作る学習記録です。
過去記事は末尾の「シリーズ記事」にまとめています。

今日作るもの

Day13では、Day12で作った作品一覧テーブルをレスポンシブ対応します。

PCではテーブルを表示し、スマホではカード形式の一覧に切り替えます。

Tailwind CSSの md:hiddenblock を使って、画面幅によって表示を変える方法を学びます。

STEP 1:Day13用HTMLファイルを作る

Day12の完成形を元にして進めたいので、Day12ファイルをコピーします。

cp day12-table-style.html day13-responsive-layout.html

エクスプローラーでコピーしても大丈夫です。

現在の構成に、Day13用ファイルが追加される形です。

tailwind-learning/
├── day01-heading.html
├── day02-card-base.html
├── day03-image-card.html
├── day04-card-text.html
├── day05-card-buttons.html
├── day06-card-complete.html
├── day07-button-colors.html
├── day08-admin-header.html
├── day09-pc-sidebar.html
├── day10-pc-admin-layout.html
├── day11-item-table.html
├── day12-table-style.html
├── day13-responsive-layout.html
└── images/
    └── sample-poster.png

STEP 2:タイトルをDay13用に直す

day13-responsive-layout.html<title> を、Day13用に変更します。

修正前

<title>Day 12 テーブルの見た目を整える</title>

修正後

<title>Day 13 レスポンシブ表示に切り替える</title>

このSTEPでは、ブラウザタブに表示されるタイトルだけ を変更します。

画面に表示されているヘッダー、サイドバー、メインエリア、テーブル部分はまだ触りません。

STEP 3:スマホ表示でレイアウトが崩れる状態を確認する

Day13では、いきなり修正せず、まず現在の状態を確認します。

Day12まではPC表示を前提にしていたため、スマホ幅で見ると以下のような問題が出ました。

  • サイドバーとメインエリアが横並びのままになる
  • テーブルが横幅に収まりにくい
  • 文字が縦に折り返されて読みにくい
  • 操作ボタンが見づらい

確認方法

ブラウザの開発者ツールを開き、スマホ幅で表示を確認します。

右クリック
→ 検証
→ デバイスツールバーを切り替え
→ スマホ幅で表示確認

day13-mobile-layout-before.png

今回のポイント

PC用レイアウトのままだと、スマホ幅では表示がかなり見づらくなることが分かりました。

次のSTEPから、Tailwind CSSのレスポンシブ指定を使って、画面幅に応じた表示へ切り替えていきます。

STEP 4:mainをスマホでは縦並び、PCでは横並びにする

スマホ表示では、サイドバーとメインエリアが横並びのままだと表示が狭くなります。

そこで、main の並び方を変更します。

  • スマホ幅では縦並び
  • PC幅では横並び

になるようにします。

修正前

<main class="flex items-start">

修正後

<main class="flex flex-col md:flex-row items-start">

今回追加するclass

class 役割
flex-col スマホ幅では要素を縦並びにする
md:flex-row 画面幅768px以上では横並びにする

今回のポイント

flex-col を付けると、サイドバーとメインエリアが縦に並びます。

ただし、PC画面ではこれまで通り横並びにしたいので、md:flex-row を追加します。

スマホ幅:flex-col で縦並び
768px以上:md:flex-row で横並び

Tailwind CSSのデフォルト設定では、md: は画面幅が 48rem 以上のときに適用されます。

通常のブラウザ設定では 48rem = 768px なので、md:flex-row は画面幅が約768px以上のときに有効になります。

STEP 5:サイドバーの幅と高さをレスポンシブ対応する

STEP4で、main をスマホ幅では縦並び、768px以上では横並びにしました。

次は、サイドバーの幅と高さを画面幅に合わせて調整します。

今のサイドバーは、常に w-48min-h-screen が付いています。

スマホ幅では、サイドバーが横幅いっぱいになった方が自然です。
また、スマホ幅で min-h-screen のままだと、サイドバーだけで画面の高さを大きく使ってしまいます。

そのため、以下のように変更します。

  • スマホ幅では横幅いっぱい
  • 768px以上ではこれまで通り幅固定
  • スマホ幅では高さを中身に合わせる

修正前

<aside class="w-48 bg-gray-600 text-white p-4 min-h-screen">

修正後

<aside class="w-full md:w-48 bg-gray-600 text-white p-4 md:min-h-screen">

今回追加・変更するclass

class 役割
w-full スマホ幅ではサイドバーを横幅いっぱいにする
md:w-48 画面幅768px以上ではサイドバーの幅を固定する
md:min-h-screen 画面幅768px以上ではサイドバーの最小高さを画面の高さにする

今回削除するclass

class 理由
w-48 スマホ幅でも幅固定になってしまうため
min-h-screen スマホ幅でも画面の高さまで伸びてしまうため

今回のポイント

w-full を付けることで、スマホ幅ではサイドバーが横幅いっぱいに表示されます。

一方で、PC幅ではこれまで通り左側の固定幅サイドバーにしたいので、md:w-48 を使います。

スマホ幅:w-full
768px以上:md:w-48

また、min-h-screen をそのまま付けると、スマホ幅でもサイドバーが画面の高さまで伸びてしまいます。

そのため、md:min-h-screen に変更して、画面幅768px以上のときだけ高さを画面いっぱいにします。

スマホ幅:中身の高さ
768px以上:md:min-h-screen

STEP 6:PC用テーブルをmd以上だけ表示する

STEP5までで、スマホ幅ではサイドバーとメインエリアが縦並びになる土台を作りました。

次は、Day12で作った PC用テーブル を、画面幅768px以上のときだけ表示するようにします。

スマホ幅では、このテーブルをそのまま表示すると横幅が足りなくなるため、後のSTEPでスマホ用カード一覧に切り替えます。

修正前

<div class="bg-white border rounded-lg shadow-sm mt-6">
    <table class="w-full text-sm">
        ...
    </table>
</div>

修正後

<div class="hidden md:block bg-white border rounded-lg shadow-sm mt-6">
    <table class="w-full text-sm">
        ...
    </table>
</div>

今回追加するclass

class 役割
hidden スマホ幅ではPC用テーブルを非表示にする
md:block 画面幅768px以上ではPC用テーブルを表示する

今回のポイント

hidden を付けると、その要素は非表示になります。

ただし、PC画面ではテーブルを表示したいので、md:block を追加します。

スマホ幅:hidden で非表示
768px以上:md:block で表示

Tailwind CSSでは、通常のclassを先に書き、md: 付きのclassで768px以上の表示を上書きできます。

このSTEPでは、PC用テーブルをスマホ幅で隠すところまで行います。

スマホ幅で表示するカード一覧は、次のSTEPで追加します。

STEP 7:スマホ用カード一覧を追加する

STEP6では、PC用テーブルをスマホ幅で非表示にしました。

次は、スマホ幅で表示するための カード形式の作品一覧 を追加します。

この時点では、まだ表示・非表示の切り替えは完全には整えません。
まず、テーブルの下にスマホ用カード一覧を作ります。

追加する場所

PC用テーブルの外側 div の下に追加します。

修正前

<div class="hidden md:block bg-white border rounded-lg shadow-sm mt-6">
    <table class="w-full text-sm">
        <!-- PC用テーブル -->
    </table>
</div>

修正後

<div class="hidden md:block bg-white border rounded-lg shadow-sm mt-6">
    <table class="w-full text-sm">
        <!-- PC用テーブル -->
    </table>
</div>

<div class="mt-6 space-y-4">
    <div class="bg-white border rounded-lg shadow-sm p-4">
        <!-- スマホ用カード -->
        <div class="flex gap-3">
            <img
                src="images/sample-poster.png"
                alt="サンプル画像"
                class="w-16 h-16 object-cover rounded border border-gray-300"
            >

            <div class="flex-1">
                <p class="font-bold">
                    サンプル映画タイトル
                </p>

                <p class="text-sm text-gray-600 mt-1">
                    平均評価:4.2 / レビュー数:12件
                </p>
            </div>
        </div>

        <div class="flex gap-2 mt-3">
            <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                詳細
            </button>

            <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                編集
            </button>

            <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                削除
            </button>
        </div>
    </div>
</div>

今回追加するclass

class 役割
space-y-4 カード同士の上下間隔を空ける
p-4 カード内側に余白を付ける
flex 画像と作品情報を横並びにする
gap-3 画像と作品情報の間隔を空ける
flex-1 作品情報エリアを残り幅いっぱいに広げる
mt-3 操作ボタンの上に余白を付ける

今回のポイント

スマホ幅では、テーブルをそのまま表示すると横幅が足りなくなります。

そこで、スマホ用には1作品ずつカード形式で表示します。

PC表示:テーブル
スマホ表示:カード一覧

今回はまず、スマホ用カード一覧の土台を作ります。

完成コードでは、一覧として分かりやすいように3件分のカードを表示します。

次のSTEPで、md:hidden を使って、スマホ幅だけカード一覧を表示するようにします。

STEP 8:スマホ用カードをmd未満だけ表示する

STEP7では、スマホ用カード一覧を追加しました。

次は、このカード一覧を スマホ幅だけ表示 するようにします。

PC表示ではテーブルを表示したいので、カード一覧は非表示にします。

修正前

<div class="mt-6 space-y-4">
    <div class="bg-white border rounded-lg shadow-sm p-4">
        <!-- スマホ用カード -->
    </div>
</div>

修正後

<div class="md:hidden mt-6 space-y-4">
    <div class="bg-white border rounded-lg shadow-sm p-4">
        <!-- スマホ用カード -->
    </div>
</div>

今回追加するclass

class 役割
md:hidden 画面幅768px以上ではスマホ用カードを非表示にする

今回のポイント

STEP6では、PC用テーブルに hidden md:block を付けました。

<div class="hidden md:block">
    <!-- PC用テーブル -->
</div>

これにより、PC用テーブルは以下の表示になります。

スマホ幅:非表示
768px以上:表示

今回、スマホ用カードには md:hidden を付けます。

<div class="md:hidden">
    <!-- スマホ用カード -->
</div>

これにより、スマホ用カードは以下の表示になります。

スマホ幅:表示
768px以上:非表示

つまり、画面幅によって表示が切り替わります。

スマホ幅:カード一覧
768px以上:テーブル

Day13では、このように hiddenmd:blockmd:hidden を使って、PC表示とスマホ表示を切り替えます。

完成コード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Day 13 レスポンシブ表示に切り替える</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100">
    <header class="bg-gray-900 text-white px-6 py-4 flex justify-between items-center">
        <h1 class="text-xl">
            Admin Dashboard
        </h1>

        <p class="text-sm">
            管理者:遅咲きエンジニア
        </p>
    </header>

    <main class="flex flex-col md:flex-row items-start">
        <aside class="w-full md:w-48 bg-gray-600 text-white p-4 md:min-h-screen">
            <!-- サイドバー -->
            <p class="font-bold">
                サイドバー
            </p>

            <ul class="mt-4 space-y-2 text-sm">
                <li class="px-2 py-1 rounded hover:bg-gray-500">ダッシュボード</li>
                <li class="px-2 py-1 rounded hover:bg-gray-500">作品一覧</li>
                <li class="px-2 py-1 rounded hover:bg-gray-500">レビュー管理</li>
            </ul>
        </aside>

        <div class="w-full flex-1 p-6 bg-gray-100 min-h-screen">
            <h2 class="text-lg font-bold">
                作品管理
            </h2>

            <p class="text-sm text-gray-600 mt-1">
                登録済み作品の確認・編集・削除を行います。
            </p>

            <div class="hidden md:block bg-white border rounded-lg shadow-sm mt-6">
                <table class="w-full text-sm">
                    <!-- PC用テーブル -->
                    <thead class="bg-gray-700 text-white">
                        <tr>
                            <th class="px-4 py-2 text-center">ID</th>
                            <th class="px-4 py-2 text-center">サムネイル</th>
                            <th class="px-4 py-2 text-center">タイトル</th>
                            <th class="px-4 py-2 text-center">平均評価</th>
                            <th class="px-4 py-2 text-center">レビュー数</th>
                            <th class="px-4 py-2 text-center">操作</th>
                        </tr>
                    </thead>

                    <tbody>
                        <!-- 作品データ -->
                        <tr class="border-b">
                            <td class="px-4 py-2">1</td>
                            <td class="px-4 py-2">
                                <img
                                    src="images/sample-poster.png"
                                    alt="サンプル画像"
                                    class="w-12 h-12 object-cover rounded border border-gray-300"
                                >
                            </td>
                            <td class="px-4 py-2">サンプル映画タイトル</td>
                            <td class="px-4 py-2">4.2</td>
                            <td class="px-4 py-2">12件</td>
                            <td class="px-4 py-2">
                                <div class="flex gap-2 justify-center">
                                    <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                                        詳細
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                                        編集
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                                        削除
                                    </button>
                                </div>
                            </td>
                        </tr>

                        <tr class="border-b">
                            <td class="px-4 py-2">2</td>
                            <td class="px-4 py-2">
                                <img
                                    src="images/sample-poster.png"
                                    alt="サンプル画像"
                                    class="w-12 h-12 object-cover rounded border border-gray-300"
                                >
                            </td>
                            <td class="px-4 py-2">サンプル映画タイトル2</td>
                            <td class="px-4 py-2">3.8</td>
                            <td class="px-4 py-2">8件</td>
                            <td class="px-4 py-2">
                                <div class="flex gap-2 justify-center">
                                    <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                                        詳細
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                                        編集
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                                        削除
                                    </button>
                                </div>
                            </td>
                        </tr>

                        <tr class="border-b">
                            <td class="px-4 py-2">3</td>
                            <td class="px-4 py-2">
                                <img
                                    src="images/sample-poster.png"
                                    alt="サンプル画像"
                                    class="w-12 h-12 object-cover rounded border border-gray-300"
                                >
                            </td>
                            <td class="px-4 py-2">サンプル映画タイトル3</td>
                            <td class="px-4 py-2">4.7</td>
                            <td class="px-4 py-2">20件</td>
                            <td class="px-4 py-2">
                                <div class="flex gap-2 justify-center">
                                    <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                                        詳細
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                                        編集
                                    </button>

                                    <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                                        削除
                                    </button>
                                </div>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>

            <div class="md:hidden mt-6 space-y-4">
                <div class="bg-white border rounded-lg shadow-sm p-4">
                    <!-- スマホ用カード -->
                    <div class="flex gap-3">
                        <img
                            src="images/sample-poster.png"
                            alt="サンプル画像"
                            class="w-16 h-16 object-cover rounded border border-gray-300"
                        >

                        <div class="flex-1">
                            <p class="font-bold">
                                サンプル映画タイトル
                            </p>

                            <p class="text-sm text-gray-600 mt-1">
                                平均評価:4.2 / レビュー数:12件
                            </p>
                        </div>
                    </div>

                    <div class="flex gap-2 mt-3">
                        <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                            詳細
                        </button>

                        <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                            編集
                        </button>

                        <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                            削除
                        </button>
                    </div>
                </div>

                <div class="bg-white border rounded-lg shadow-sm p-4">
                    <!-- スマホ用カード -->
                    <div class="flex gap-3">
                        <img
                            src="images/sample-poster.png"
                            alt="サンプル画像"
                            class="w-16 h-16 object-cover rounded border border-gray-300"
                        >

                        <div class="flex-1">
                            <p class="font-bold">
                                サンプル映画タイトル2
                            </p>

                            <p class="text-sm text-gray-600 mt-1">
                                平均評価:3.8 / レビュー数:8件
                            </p>
                        </div>
                    </div>

                    <div class="flex gap-2 mt-3">
                        <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                            詳細
                        </button>

                        <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                            編集
                        </button>

                        <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                            削除
                        </button>
                    </div>
                </div>

                <div class="bg-white border rounded-lg shadow-sm p-4">
                    <!-- スマホ用カード -->
                    <div class="flex gap-3">
                        <img
                            src="images/sample-poster.png"
                            alt="サンプル画像"
                            class="w-16 h-16 object-cover rounded border border-gray-300"
                        >

                        <div class="flex-1">
                            <p class="font-bold">
                                サンプル映画タイトル3
                            </p>

                            <p class="text-sm text-gray-600 mt-1">
                                平均評価:4.7 / レビュー数:20件
                            </p>
                        </div>
                    </div>

                    <div class="flex gap-2 mt-3">
                        <button class="px-2 py-1 text-xs border border-gray-300 text-gray-700 rounded hover:bg-gray-200">
                            詳細
                        </button>

                        <button class="px-2 py-1 text-xs border border-blue-500 text-blue-600 rounded hover:bg-blue-100">
                            編集
                        </button>

                        <button class="px-2 py-1 text-xs border border-red-500 text-red-600 rounded hover:bg-red-100">
                            削除
                        </button>
                    </div>
                </div>
            </div>

        </div>
    </main>
</body>
</html>

使ったTailwind CSSのclass

class 内容
flex-col スマホ幅では要素を縦並びにする
md:flex-row 画面幅768px以上では横並びにする
w-full スマホ幅でサイドバーやメインエリアを横幅いっぱいにする
md:w-48 画面幅768px以上ではサイドバーの幅を固定する
md:min-h-screen 画面幅768px以上ではサイドバーの最小高さを画面の高さにする
hidden スマホ幅ではPC用テーブルを非表示にする
md:block 画面幅768px以上ではPC用テーブルを表示する
space-y-4 カード同士の上下間隔を空ける
p-4 カード内側に余白を付ける
flex 画像と作品情報を横並びにする
gap-3 画像と作品情報の間隔を空ける
flex-1 作品情報エリアを残り幅いっぱいに広げる
mt-3 操作ボタンの上に余白を付ける
md:hidden 画面幅768px以上ではスマホ用カードを非表示にする

削除したTailwind CSSのclass

class 理由
w-48 スマホ幅でもサイドバーが固定幅になってしまうため
min-h-screen スマホ幅でもサイドバーが画面の高さまで伸びてしまうため

表示確認

以下の点をブラウザで確認しました。

  • PC幅では、サイドバーとメインエリアが横並びで表示されている
  • PC幅では、作品一覧がテーブル形式で表示されている
  • スマホ幅では、サイドバーとメインエリアが縦並びで表示されている
  • スマホ幅では、作品一覧がカード形式で表示されている
  • スマホ幅では、PC用テーブルが非表示になっている
  • 画面幅768px以上では、スマホ用カードが非表示になっている

PC表示

day13-responsive-pc-complete.png

スマホ表示

day13-responsive-mobile-complete.png

今日分かったこと

Day13では、画面幅に合わせて表示を切り替えるレスポンシブ対応を行いました。

flex-colmd:flex-row を使うことで、スマホ幅では縦並び、768px以上では横並びにできました。

サイドバーは w-fullmd:w-48 を使い、スマホ幅では横幅いっぱい、PC幅では固定幅にしました。

また、hidden md:block を使うことでPC用テーブルを768px以上だけ表示し、md:hidden を使うことでスマホ用カードをスマホ幅だけ表示できました。

スマホではテーブルをそのまま表示すると読みにくくなるため、カード形式に切り替えることで見やすくなりました。

レスポンシブ対応では、単に幅を縮めるのではなく、画面幅に合わせて表示方法そのものを変えることが大事だと分かりました。

次回やること

【Tailwind CSS入門 Day14】Alpine.jsの基礎を学ぶ

シリーズ記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?