【Next.js】フッターの作り方を解説|4カラムとブランド帯のコード付き
公開日: 2026年9月12日 · 読了目安 11 分
Next.js のフッターを、リンクを並べただけの倉庫にしない作り方を解説。リンクの分け方、Tailwind CSS で組む4カラムのコード、layout.tsx とルートグループでの共通化、大きなワードマークのブランド帯、短いページで下に固定する方法、公開前のチェックまでまとめます。
Next.js のフッターはリンクを絞って共通化する
Next.js でサイトを作り、最後にフッターを付けた。思いつくリンクを全部並べたら、細かい文字が詰まった古い印象になった。
ページごとにフッターをコピーしていて、リンクを1つ直すのにも手間がかかる。
フッター作りでよくある悩みです。
整ったフッターの作り方は、次の2つに集約されます。
1つ目は、リンクを「プロダクト」「リソース」「法務」のような3つ前後のグループに絞ること。2つ目は、フッターを1つの部品にまとめ、layout.tsx(全ページ共通の枠になるファイル)から表示することです。
動きは、ワードマークがゆっくり現れる程度で十分です。
この記事で分かることは次のとおりです。
リンクを絞ると使いやすくなる理由と、古く見える原因
Tailwind CSS で組む4カラムのフッターのコード
全ページ共通の枠とルートグループで、フッターを共通化する方法
大きなワードマークを使ったブランド帯の作り方
中身が短いページでフッターを画面の下に固定する方法
リンクを絞るとフッターが使いやすくなる理由
フッターまでスクロールした人は、たいてい何かを探しています。たとえば次のような目的です。
料金をもう一度見たい
問い合わせ先を知りたい
プライバシーポリシーを確認したい
こうした目的の場所へすぐに移動できることが、フッターの役割です。
サイトのすべてのページを並べると、探しているリンクが埋もれます。グループの見出しで大まかな場所を示し、各グループのリンクは4〜6個程度に抑えると、目的のリンクを見つけやすくなります。
また、フッターは最後の CTA セクション(登録や申し込みを促す区画)の直後に来ます。
フッターの装飾がそのボタンと同じくらい目立つと、押してほしいボタンから視線がそれます。フッターはページの中で一段落とした存在にするのが基本です。
フッターが古く見える3つの原因
見た目を新しくしたいときも、まず次の3つを直すと印象が大きく変わります。
サイトマップの複製になっている
ヘッダーのナビと同じリンクを、すべてフッターにも置く必要はありません。
フッターには、ヘッダーに入りきらない情報を中心に置きます。会社情報や法務、SNS などです。
文字が小さく、コントラストが低い
薄いグレーの小さな文字は、上品に見えても読めません。
本文と同じかひと回り小さい程度の文字サイズにし、背景との明るさの差を十分に取ります。法務のリンクも、読めなければ置いた意味がありません。
最後の CTA と同じ強さで飾られている
押してほしいボタンの直後に派手なグラデーションや大きな動きがあると、ページの終わりがどこか分からなくなります。フッターは色数を減らし、動きも控えめにします。
4カラムフッターの基本コード
左にロゴと短い説明、右に3つのリンクのグループを置く4カラムが、もっとも扱いやすい形です。
スマホでは縦に積み、md 以上で横に並べます。リンクは配列にまとめておくと、追加や並べ替えが楽になります。
リンクのまとまりは nav で囲み、aria-label を付けます。
ヘッダーのナビと区別でき、スクリーンリーダーの利用者が目的の場所へ移動しやすくなります。
動きがないので、サーバーコンポーネント(サーバーで組み立てる部品)のまま使えます。
import Link from "next/link";
const groups = [
{
title: "プロダクト",
links: [
{ label: "機能", href: "/#features" },
{ label: "料金", href: "/pricing" },
{ label: "記事", href: "/articles" },
],
},
{
title: "リソース",
links: [
{ label: "ドキュメント", href: "/docs" },
{ label: "ブログ", href: "/blog" },
{ label: "お問い合わせ", href: "/contact" },
],
},
{
title: "法務",
links: [
{ label: "利用規約", href: "/terms" },
{ label: "プライバシーポリシー", href: "/privacy" },
{ label: "特定商取引法に基づく表記", href: "/legal" },
],
},
];
export function SiteFooter() {
const year = new Date().getFullYear();
return (
<footer className="border-t border-zinc-200 bg-white">
<div className="mx-auto grid max-w-6xl gap-10 px-6 py-16 md:grid-cols-4">
<div>
<Link href="/" className="text-lg font-semibold">Acme</Link>
<p className="mt-3 text-sm leading-relaxed text-zinc-600">
LP を素早く公開するためのツールです。
</p>
</div>
<nav aria-label="フッター" className="grid gap-10 sm:grid-cols-3 md:col-span-3">
{groups.map((group) => (
<div key={group.title}>
<h2 className="text-sm font-semibold text-zinc-900">{group.title}</h2>
<ul className="mt-4 space-y-1">
{group.links.map((link) => (
<li key={link.href}>
<Link
href={link.href}
className="inline-flex min-h-11 items-center text-sm text-zinc-600 transition-colors hover:text-zinc-900"
>
{link.label}
</Link>
</li>
))}
</ul>
</div>
))}
</nav>
</div>
<div className="border-t border-zinc-200">
<p className="mx-auto max-w-6xl px-6 py-6 text-xs text-zinc-500">
© {year} Acme Inc.
</p>
</div>
</footer>
);
}コピーライトの年について
new Date().getFullYear() はサーバーで実行されます。静的に生成されるページでは、ビルドした時点の年が表示されます。
年が変わったら再デプロイするか、年を固定の文字で書いて毎年更新してください。
タップしやすい高さを取る
リンクに min-h-11(44px)を付けると、スマホで隣のリンクを押し間違えにくくなります。行間を詰めて文字を並べるより、1つずつのタップ領域を確保する方が使いやすくなります。
layout.tsx でフッターを全ページに共通化する
App Router では、app/layout.tsx に置いたコンポーネントがすべてのページに表示されます。フッターをここに置けば、ページごとにコピーする必要がなくなり、リンクの修正も1か所で済みます。
中身が短いページでは、フッターが画面の途中に浮いて見えることがあります。
フッターを画面の下にそろえるには、body に min-h-dvh を付けて縦に並べます。画面の高さ以上を確保する指定です。
そのうえで main(ページの中身)に flex-1 を付けると、余った高さを中身が埋めます。フッターは常に画面の下端より下に来ます。
import { SiteFooter } from "@/components/SiteFooter";
import "./globals.css";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ja">
<body className="flex min-h-dvh flex-col">
<main className="flex-1">{children}</main>
<SiteFooter />
</body>
</html>
);
}LP とアプリ画面でフッターを分ける
LP にはフッターを出し、ログイン後の画面には出したくない。そんな場合はルートグループを使います。
app/(marketing) と app/(app) のように括弧付きのフォルダを作ると、URL を変えずに、別々の共通の枠を持てます。フッターは (marketing) 側の layout.tsx だけに置きます。
そのうえで、サイト全体の枠(app/layout.tsx)からは main とフッターの部品を外します。
body の中には、children(中に入れる要素)だけを残します。
import { SiteFooter } from "@/components/SiteFooter";
export default function MarketingLayout({ children }: { children: React.ReactNode }) {
return (
<>
<main className="flex-1">{children}</main>
<SiteFooter />
</>
);
}大きなワードマークでフッターにブランド帯を作る
フッターに印象を残したいときは、リンクの下に大きなワードマーク(ロゴの文字)を置く方法がよく使われます。画面幅に合わせて文字を大きくし、下半分を少しはみ出させると、ページの終わりがはっきりします。
文字の色は、上から下へ透明になるグラデーションにすると、背景になじみます。装飾なので aria-hidden を付け、スクリーンリーダーには読ませません。
export function FooterWordmark() {
return (
<div aria-hidden="true" className="overflow-hidden">
<p className="translate-y-[20%] select-none bg-gradient-to-b from-zinc-900 to-transparent bg-clip-text text-center text-[18vw] font-bold leading-none tracking-tighter text-transparent">
Acme
</p>
</div>
);
}フッターに動きを付けるならゆっくり一度だけ
ワードマークを動かすなら、画面に入ったときに透明から少しずつ現れる程度にします。
Motion(旧 Framer Motion)の whileInView に viewport={{ once: true }} を組み合わせれば、一度だけ動かせます。
導入方法は https://design-layer.com/ja/articles/nextjs-framer-motion-guide で解説しています。リンクのホバーは、色の変化だけで十分です。
フッターとヘッダーの組み合わせ
ヘッダーが透明で浮いているデザインなら、フッターは不透明な背景にすると、ページの始まりと終わりが分かりやすくなります。ヘッダーの作り方は https://design-layer.com/ja/articles/nextjs-modern-header-guide で解説しています。
完成したフッターをコピーして使う方法

大きな文字組みやゆっくり動く背景に加え、リンクのホバーまでそろったフッターを自分で組むと、半日かかることもあります。見た目を先に決めたいときは、完成したセクションから始める方法もあります。
DesignLayer は、人が組んだ React + Tailwind のモーション付きセクションを、ブラウザでライブプレビューできるカタログです。フッターも動きを確かめてから使えます。
閲覧は無料です。https://design-layer.com/ja/components
コピーしたあとは、リンク先とプライバシーポリシーなどの法務ページをすぐに差し替えてください。仮のリンクのまま公開しないことが大切です。
フッターを公開する前の確認リスト
利用規約やプライバシーポリシーなど、法務のリンクがそろっているか(ネットで商品や有料サービスを売るなら、特定商取引法に基づく表記も必要)
仮のリンク(# や example.com)が残っていないか
キーボードで移動したとき、フォーカスの順番が自然か
スマホでリンクのタップ領域が 44 ピクセル程度あるか
直前のボタンのセクションと、色や装飾がぶつかっていないか
同じサイト内のリンクに、新しいタブで開く指定(target="_blank")を付けていないか
Next.js のフッターについてよくある質問
Next.js のフッター作りで、よく出る質問をまとめました。
サイト全体で同じフッターを使うなら layout.tsx です。LP だけ特別なフッターにしたい場合は、ルートグループで LP 用の共通の枠を分けるか、そのページの最後に置きます。
まとめ:Next.js でフッターを作る手順
リンクは3つ前後のグループに分け、各グループ4〜6個に絞る
文字サイズとコントラストを確保し、最後の CTA より一段落とす
フッターは1つの部品にまとめ、全ページ共通の枠(layout.tsx)から出す
LP とアプリ画面で分けたいときはルートグループを使う
ブランド帯は大きなワードマークで作り、動きはゆっくり一度だけにする
まずは今のフッターのリンクを3つのグループに分けるところから始めてください。フッターの直前に置く CTA セクションの作り方は https://design-layer.com/ja/articles/nextjs-cta-section-guide で解説しています。


