【Next.js】お客様の声セクションの作り方を導入事例カードの実装例で紹介
公開日: 2026年9月12日 · 読了目安 9 分
Next.js の LP に置くお客様の声(導入事例)セクションを、コード付きで作る方法を解説。信頼される引用の書き方、3列グリッドのカード、6枚以上の横スクロール、控えめな入場アニメーション、公開前の許諾まで。
お客様の声が作り物に見えるときの直し方
Next.js で LP を作っていて、お客様の声のセクションを置いた。星5つと「とても使いやすいです」を3枚並べたが、どこか作り物に見える。
お客様の声のセクションでは、こうした悩みがよく起きます。
信頼されるお客様の声は、人数や星の数ではなく具体さで決まります。誰がどんな課題に対して、何がどれだけ変わったか。
この3つを1枚のカードに収め、3〜6枚を読みやすく並べます。
動きは控えめな入場にとどめ、自動で切り替わるカルーセルは避けます。
この記事で分かることは次のとおりです。
具体的な声ほど信頼される理由と、信頼が増えない原因
Next.js と Tailwind CSS で作る、お客様の声カードのグリッド
6枚以上あるときの横スクロール
引用を読みやすく保つ入場アニメーション
原稿の集め方と、公開前に確認すべき許諾
具体的なお客様の声ほど信頼される理由
LP を見ている人は、お客様の声を「自分と同じ立場の人が、実際に成果を出したか」を確かめるために読みます。
そのため、「最高のサービスです」のような抽象的な称賛は、判断の材料になりません。
誰が書いたのか分からない文は、ダミーにも見えます。
反対に、「問い合わせの返信にかかる時間が半分になった」のような具体的な一文は、読み手が自分の状況に置き換えて考えられます。役職や会社名、利用シーンが添えてあると、その声が実在する人のものだと伝わります。
BtoB なら役職と社名、導入前の課題、数字で表せる変化を1つずつ書きます。BtoC なら利用シーンと結果を1つずつです。
これを目安にすると、カードの文が短くても十分に伝わります。
お客様の声で信頼が増えない3つの原因
お客様の声を置いても効果が出ないときは、見せ方に原因があることが多くあります。次の3つに当てはまらないか確認してください。
顔写真が大きく、引用が短い
写真が主役になると、何を言っているかが目に入りません。カードは引用を先に、名前と写真をその下に小さく置きます。
読む順番がそのまま信頼の順番になります。
すべて同じ長さのテンプレ文
どのカードも同じ長さ、同じ語尾だと、一人が書いたように見えます。1枚だけでも数字を含む声を入れると、ほかのカードの印象も具体的になります。
お客様の声が自動で切り替わるカルーセル
読んでいる途中で次のカードへ進むと、最後まで読めません。読めない声は証明になりません。
自動再生は付けないか、付けるなら一時停止のボタンを必ず置きます。
お客様の声カードの基本コード
3〜6枚なら、グリッドで並べるのが一番読みやすい形です。md 以上は3列、スマホは1列にします。
データは配列にまとめ、カードは map で描画します。
引用・名前・カード全体は、それぞれ意味を持つタグで囲みます。
blockquote:引用文を囲む
figcaption:名前と役職を囲む
figure:カード全体を囲む
見た目は変わりませんが、スクリーンリーダーや検索エンジンに「これは引用で、話しているのはこの人」と伝えられます。
動きがないので、サーバーコンポーネント(サーバーで組み立てる部品)のまま使えます。
import Image from "next/image";
const testimonials = [
{
quote: "問い合わせへの返信にかかる時間が、導入から2か月で半分になりました。",
name: "山田 花子",
role: "カスタマーサクセス責任者",
company: "Acme 株式会社",
avatar: "/avatars/yamada.jpg",
},
{
quote: "LP の更新をエンジニアに頼まずに済むようになり、施策の回数が増えました。",
name: "佐藤 健",
role: "マーケティング部",
company: "Globex 株式会社",
avatar: "/avatars/sato.jpg",
},
{
quote: "初日から迷わず使えました。社内の説明会を開く必要もありませんでした。",
name: "鈴木 一郎",
role: "代表取締役",
company: "Initech 合同会社",
avatar: "/avatars/suzuki.jpg",
},
];
export function Testimonials() {
return (
<section className="mx-auto max-w-6xl px-6 py-24">
<h2 className="text-center text-3xl font-semibold">お客様の声</h2>
<ul className="mt-12 grid gap-6 md:grid-cols-3">
{testimonials.map((t) => (
<li key={t.name}>
<figure className="flex h-full flex-col rounded-2xl border border-zinc-200 bg-white p-6">
<blockquote className="flex-1 leading-relaxed text-zinc-800">
<p>「{t.quote}」</p>
</blockquote>
<figcaption className="mt-6 flex items-center gap-3">
<Image src={t.avatar} alt="" width={40} height={40} className="size-10 rounded-full object-cover" />
<div className="text-sm">
<div className="font-medium">{t.name}</div>
<div className="text-zinc-500">{t.role}・{t.company}</div>
</div>
</figcaption>
</figure>
</li>
))}
</ul>
</section>
);
}お客様の声カードの高さをそろえる
引用の長さが違うと、カードの下端がばらつきます。
名前の位置を下でそろえるには、各カード(figure)に h-full と flex-col を付けます。高さをいっぱいにして、中身を縦に並べる指定です。
そのうえで引用部分(blockquote)に flex-1 を付けると、余った高さを引用が埋めて、名前が下にそろいます。
引用符の装飾を大きくするより、行間を広めに取る方が読みやすくなります。
お客様の声が6枚以上なら横スクロールにする
声が6枚を超えるとグリッドが縦に長くなります。その場合は、横スクロールで並べるのが扱いやすい形です。
CSS の scroll-snap を使うと、スワイプしたときにカードの端でぴたりと止まります。
カードの幅は画面より少し狭くして、次のカードが右端に少しはみ出すようにします。ドットのナビゲーションより、はみ出しが見える方が「続きがある」と直感的に伝わります。
<ul className="mt-12 flex snap-x snap-mandatory gap-6 overflow-x-auto px-6 pb-4">
{testimonials.map((t) => (
<li key={t.name} className="w-[85%] shrink-0 snap-start sm:w-[45%] lg:w-[30%]">
{/* figure の中身はグリッド版と同じ */}
</li>
))}
</ul>カルーセルライブラリとの使い分け
矢印ボタンで1枚ずつ送りたい場合や、ループさせたい場合はカルーセルの実装が必要です。
作り方は https://design-layer.com/ja/articles/nextjs-image-carousel-guide で解説しています。お客様の声だけなら、まずは CSS の横スクロールで十分です。
お客様の声の入場アニメーションは控えめに
お客様の声は読ませるセクションです。動きを付けるなら、画面に入ったときにカードが少し遅れて順番に現れる程度にとどめます。
Motion(旧 Framer Motion)なら whileInView(画面に入ったら動かす指定)で作れます。カードごとに delay で少しずつ遅らせます。
動きを足す場合は、カードの部分だけをブラウザで動く部品にします。見出しとデータはサーバー側に残せます。
"use client";
import { motion } from "motion/react";
export function TestimonialCard({ index, children }: { index: number; children: React.ReactNode }) {
return (
<motion.li
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.5, delay: index * 0.1, ease: "easeOut" }}
>
{children}
</motion.li>
);
}お客様の声の原稿の集め方と掲載許可の確認
見た目より先に整えるべきなのが、声の中身です。既存のお客様に依頼するときは、次の3つを聞くと具体的な声が集まりやすくなります。
導入前に困っていたこと
使ってみて変わったこと
その変化を数字で言うと
文を短く整えるのは構いませんが、意味を変える編集はしません。公開する前に、次の点を本人に確認してください。
名前・役職・会社名を載せてよいか(イニシャルや業種だけにする希望はないか)
顔写真や会社のロゴを使ってよいか
編集後の文面が本人の意図と合っているか
掲載する期間や、取り下げたいときの連絡先
お客様の声も自社の広告として、景品表示法の対象になります。効果を示す声は、多くの利用者に当てはまる内容かを確かめてから載せてください。
完成したお客様の声セクションをコピーして使う方法

カードの入場や引用の文字組みに加え、ロゴや写真の配置までそろった仕上がりは、shadcn/ui の Card を並べるだけではなかなか出ません。見た目を先に決めたいときは、完成したセクションから始める方法もあります。
DesignLayer は、人が組んだ React + Tailwind のモーション付きセクションを、ブラウザでライブプレビューできるカタログです。
動きを確かめてから、引用文と名前、会社名だけを差し替えて使えます。
閲覧は無料です。https://design-layer.com/ja/components
無料アカウントでは、無料サンプル10個を回数制限なくコピーでき、動画プロンプトは月1回です。カタログ全体は30日ビルドパス、Lifetime、Plus です。無料サンプルなら回数の上限なくコピーできます。それ以外は30日ビルドパス($19)、Lifetime($79)、Plus(月額 $9)です。
お客様の声セクションについてよくある質問
お客様の声セクションの実装と原稿で、よく出る質問をまとめました。
公開してはいけません。開発中の仮の文は、公開前に実在する人の声へ差し替えます。
声がまだ集まっていないときは、セクションごと外し、導入社数やロゴなど事実で示せるものを置いてください。
まとめ:Next.js でお客様の声セクションを作る手順
お客様の声は「誰が・何を・どれだけ」を1枚のカードに収める
引用を先に、名前と写真をその下に置き、引用だと伝わるタグで組む
3〜6枚はグリッド、それ以上はカードの端で止まる横スクロールにする
動きは画面に入ったときに順番に出す程度にし、自動再生は避ける
公開前に、名前・写真・文面の掲載許可を本人に確認する
お客様の声のあとに置く料金表は https://design-layer.com/ja/articles/nextjs-pricing-table-guide で解説しています。


