【Next.js】比較表の作り方を解説|自社の列の強調とスマホ対応
公開日: 2026年9月12日 · 読了目安 9 分
Next.js の LP に、自社と他の手段を比べる比較表を置く方法です。table の正しいマークアップ、自社列の強調、記号だけに頼らない表示、スマホでのカード切り替えまで、Tailwind CSS のコード付きで解説します。
LP の比較表はどう作れば伝わるのか
Next.js で LP を作っていて、「外注や他のツールと比べて何がよいのか」を一目で見せたくなったら、比較表の出番です。
作り方の答えは、次の3つです。
自社の列を1つだけ背景色で目立たせる
行は6〜8行に絞る
スマホではカードに切り替える
比較表は、料金プラン表とは役割が違います。料金表は自社のプラン同士を比べるもので、比較表は自社と外注・内製・他のツールを比べるものです。
料金表の作り方は https://design-layer.com/ja/articles/nextjs-pricing-table-guide で解説しています。
比較表が信用されない原因
読み上げにも伝わる、正しい表の書き方
自社列の強調と、記号だけに頼らない「できる/できない」の表示
スマホで横スクロールに頼らず、カードに切り替える方法
比較表が信用されない3つの原因
比較表は、自社に有利な情報を並べる場所だと読者も分かっています。だからこそ、少しでも不公平に見えると、表全体が信用されなくなります。
比較表で他の手段を不当に低く書いている
相手の弱点ばかりを並べると、読者は「本当だろうか」と疑います。他のツールについては、公開されている事実だけを書きます。
自社が負けている行も1つ残しておくと、表全体の信頼が上がります。
行が多すぎて、違いが埋もれる
20行の比較表は、どこが大事かを読者に探させます。購入の判断に効く項目を6〜8行に絞り、細かい仕様は別のページに分けます。
スマホで横スクロールしないと比較表が読めない
4列の表をスマホでそのまま出すと、横にスクロールしないと自社列が見えません。
多くの読者はスクロールせずに読み飛ばします。狭い画面では、手段ごとのカードに切り替えます。
table タグで比較表を組むコード
比較表は、見た目が表であるだけでなく、中身も table で書きます。
表の題名(caption)で、何の表かを伝える
列の見出しのセルに、列の見出しだという印を付ける
行の見出しのセルに、行の見出しだという印を付ける
この印が scope です。列には scope="col"、行には scope="row" と書きます。
こうすると、スクリーンリーダーが「どの列のどの行か」を読み上げられます。
データは配列にまとめておくと、PC の表とスマホのカードで同じデータを使い回せます。下の値は説明のための例なので、公開前に自社の事実に差し替えてください。
// components/comparison-data.ts
export const columns = ["自社サービス", "外注", "内製"] as const;
export const rows: { label: string; values: (boolean | string)[] }[] = [
{ label: "公開までの期間", values: ["最短1日", "2〜4週間", "1〜2か月"] },
{ label: "公開後の修正", values: [true, false, true] },
{ label: "デザインの品質", values: [true, true, false] },
{ label: "社内に知識が残る", values: [true, false, true] },
{ label: "初期費用", values: ["無料", "見積もり", "人件費"] },
{ label: "自由に作り込める", values: [false, true, true] },
];PC 用の比較表で自社列を強調する
自社列だけ背景色を変え、ほかの列は白のままにします。true と false は記号だけで出さず、読み上げ用に「対応」「非対応」の文字を添えます。
色やアイコンだけで意味を伝えると、色の見分けにくい人や読み上げでは区別できません。
// components/ComparisonTable.tsx
import { columns, rows } from "./comparison-data";
function Cell({ value }: { value: boolean | string }) {
if (typeof value === "string") return <span>{value}</span>;
return value ? (
<span>
<span aria-hidden="true">✓</span>
<span className="sr-only">対応</span>
</span>
) : (
<span className="text-zinc-400">
<span aria-hidden="true">—</span>
<span className="sr-only">非対応</span>
</span>
);
}
export function ComparisonTable() {
return (
<table className="hidden w-full text-left text-sm md:table">
<caption className="sr-only">自社サービス・外注・内製の比較</caption>
<thead>
<tr>
<th scope="col" className="w-1/4 py-4" />
{columns.map((col, i) => (
<th
key={col}
scope="col"
className={i === 0 ? "rounded-t-2xl bg-zinc-900 px-4 py-4 text-white" : "px-4 py-4"}
>
{col}
</th>
))}
</tr>
</thead>
<tbody>
{rows.map((row) => (
<tr key={row.label} className="border-t border-zinc-200">
<th scope="row" className="py-4 font-medium">{row.label}</th>
{row.values.map((v, i) => (
<td
key={columns[i]}
className={i === 0 ? "bg-zinc-900 px-4 py-4 text-white" : "px-4 py-4"}
>
<Cell value={v} />
</td>
))}
</tr>
))}
</tbody>
</table>
);
}比較表の下に、比べた時点と前提を書く
比較表の値は、時間がたつと変わります。表のすぐ下に「2026年10月時点の公開情報をもとに作成」「外注は一般的な制作会社に依頼した場合」のような注釈を小さく添えてください。
前提が書いてあるだけで、読者は表を公平なものとして読みやすくなります。
注釈は caption に入れず、表の外に p で置きます。caption は「何を比べた表か」を短く伝える役割に絞ります。
スマホでは比較表をカードに切り替える
md 未満の幅では、表を隠して手段ごとのカードを出します。各カードの中は、行の見出しと値を dl(定義リスト)で並べます。
PC 用の表には、スマホでは隠す指定(hidden md:table)を付けています。
カードには逆の指定(md:hidden)を付けて、表と入れ替えます。
display: none になった側はスクリーンリーダーにも読まれないため、同じ内容が2回読み上げられる心配はありません。
// components/ComparisonCards.tsx
import { columns, rows } from "./comparison-data";
export function ComparisonCards() {
return (
<div className="space-y-4 md:hidden">
{columns.map((col, i) => (
<div
key={col}
className={i === 0 ? "rounded-2xl bg-zinc-900 p-5 text-white" : "rounded-2xl border border-zinc-200 p-5"}
>
<h3 className="font-semibold">{col}</h3>
<dl className="mt-4 space-y-2 text-sm">
{rows.map((row) => {
const v = row.values[i];
return (
<div key={row.label} className="flex justify-between gap-4">
<dt className="opacity-70">{row.label}</dt>
<dd>{typeof v === "string" ? v : v ? "対応" : "非対応"}</dd>
</div>
);
})}
</dl>
</div>
))}
</div>
);
}比較表のカードが長くなりすぎるときの対処
行が8行を超える場合は、スマホでは重要な3〜4行だけをカードに出し、「すべての項目を見る」で残りを開く形にします。全部を出すと、3枚目のカードまでたどり着く前に読者が離れます。
比較表にアニメーションは必要か
比較表は、読者がじっくり読む場所です。列が順番にスライドして入ってくるような演出は、読み始めを遅らせるだけになりがちです。
付けるなら、セクション全体が画面に入ったときに一度だけ薄く表示する程度にします。自社列を目立たせたい場合も、動きではなく背景色と位置(いちばん左の列)で十分に伝わります。
完成した比較表・料金セクションをコピーして使う方法

ここまでのコードで、正しく読める比較表は作れます。ただ、次の点まで整えるには細かな調整が続きます。
強調列の角丸
チェックの並び
注釈の位置
DesignLayer では、人が組んだ料金や比較のセクションをブラウザでライブプレビューし、気に入ったものをコピーできます。https://design-layer.com/ja/components
コピーしたら、行の文言と列の名前だけ差し替えてください。
ライブプレビューは無制限です。無料サンプル10個を無料アカウントで回数制限なくコピーでき、動画プロンプトは月1回です。Free では MCP に接続できません。カタログ全体は30日ビルドパス($19の1回払い、自動更新なし)、Lifetime Access(先着100名の$79の1回払い)、Plus(月額 $9、いつでも解約可)です。
比較表のすぐ後によくある質問を置くと、表で解消しきれなかった疑問を拾えます。FAQ の作り方は https://design-layer.com/ja/articles/nextjs-faq-accordion-guide で解説しています。
Next.js の比較表についてよくある質問
公開されている事実だけを、確認した日付とともに書くのが前提です。
消費者庁は比較広告について、次の3つを求めています。
比べる内容が客観的に実証されている
実証された数値や事実を正確に引用する
比べ方が公正である
迷う場合は「外注」「内製」「一般的なツール」のように、手段の種類で比べると角が立ちません。
「No.1」のような表示は、調査の対象と方法まで示せる場合だけにします。
まとめ:Next.js で比較表を作る手順
比較表は自社と外注・内製・他ツールを比べるもの。料金プラン表とは分けて考える
自社列を1つだけ背景色で強調し、行は6〜8行に絞る
表には題名と見出しの印を付け、記号には読み上げ用の文字を添える
スマホでは同じデータからカードを出し、横スクロールに頼らない
他の手段は公開されている事実だけで書く
機能紹介のセクションは https://design-layer.com/ja/articles/nextjs-features-section-guide で解説しています。
料金表は https://design-layer.com/ja/articles/nextjs-pricing-table-guide にまとめています。
仕上がったセクションから始めたい場合は、カタログで見比べてください。https://design-layer.com/ja/components


