ヘッダーとフッターをlayout.svelteで作ることにしました。書き方を教えてください。
OK!それなら src/routes/+layout.svelte にヘッダーを直接書けばOKです。
layout.svelteSvelteKitの layout.svelte は、すべてのページに共通のレイアウトを提供するためのファイルです。<slot /> を使って、ページごとのコンテンツを挿入できます。
layout.svelte<script>
// 必要なら状態やロジックを追加できる
</script>
<header class="bg-blue-600 text-white p-4">
<div class="container mx-auto flex items-center justify-between">
<h1 class="text-xl font-bold">My Website</h1>
<nav>
<ul class="flex space-x-4">
<li><a href="/" class="hover:underline">Home</a></li>
<li><a href="/about" class="hover:underline">About</a></li>
<li><a href="/contact" class="hover:underline">Contact</a></li>
</ul>
</nav>
</div>
</header>
<main class="container mx-auto p-4">
<slot />
</main>
<footer class="bg-gray-800 text-white text-center p-4 mt-8">
© 2025 My Website. All rights reserved.
</footer>
ヘッダー
bg-blue-600 text-white p-4 → 背景色(青)、文字色(白)、パディングを適用。container mx-auto flex items-center justify-between → コンテンツを中央揃え、Flexbox でロゴとナビゲーションを左右に配置。<ul>)は space-x-4 を使って項目間にスペースを追加。<slot />
layout.svelte の main の中に <slot /> を配置することで、各ページの内容がここに差し込まれる。フッター
bg-gray-800 text-white text-center p-4 mt-8 → 背景を暗めのグレーにし、中央揃え&パディング追加。例えば、src/routes/+page.svelte を作成し、以下のコードを書けば、この layout.svelte のヘッダー・フッターが適用されたページが表示されます。
<h2 class="text-2xl font-semibold">Welcome to My Website</h2>
<p class="mt-4">This is the homepage.</p>
これで、ヘッダーとフッターを共通にしつつ、各ページごとにコンテンツを変更できるようになります! 🚀
はい、その通りです!layout.svelte の中で <header> と <footer> を明示的に記述することで、すべてのページに共通の ヘッダー と フッター を指定しています。
SvelteKitでは、+layout.svelte に書かれたコードは、そのディレクトリ以下のすべてのページ (+page.svelte) に適用されます。
<header>...</header> <!-- すべてのページに共通のヘッダー -->
<slot /> <!-- ページごとのコンテンツをここに挿入 -->
<footer>...</footer> <!-- すべてのページに共通のフッター -->
このように、layout.svelte に <header> と <footer> を書くことで、すべてのページに共通の ヘッダーとフッター が適用されます。
src/
routes/
+layout.svelte <-- ここでヘッダー&フッターを指定
+page.svelte <-- トップページのコンテンツ
about/
+page.svelte <-- 「About」ページのコンテンツ
contact/
+page.svelte <-- 「Contact」ページのコンテンツ
+layout.svelte<header class="bg-blue-600 text-white p-4">
<div class="container mx-auto flex items-center justify-between">
<h1 class="text-xl font-bold">My Website</h1>
<nav>
<ul class="flex space-x-4">
<li><a href="/" class="hover:underline">Home</a></li>
<li><a href="/about" class="hover:underline">About</a></li>
<li><a href="/contact" class="hover:underline">Contact</a></li>
</ul>
</nav>
</div>
</header>
<main class="container mx-auto p-4">
<slot />
</main>
<footer class="bg-gray-800 text-white text-center p-4 mt-8">
© 2025 My Website. All rights reserved.
</footer>
about/+page.svelte<h2 class="text-2xl font-semibold">About Us</h2>
<p class="mt-4">We are a team of developers building amazing apps.</p>
この場合、about ページを開くと、ヘッダーとフッターが適用された状態でページが表示されます。
[ ヘッダー ] My Website | Home | About | Contact
------------------------------------------
[ メインコンテンツ ]
About Us
We are a team of developers building amazing apps.
------------------------------------------
[ フッター ] © 2025 My Website. All rights reserved.
同じように、contact/+page.svelte を作成すれば、どのページでも共通のヘッダー&フッターを持つことができます。
✅ layout.svelte に <header> と <footer> を書くと、全ページ共通のデザインになる
✅ <slot /> の部分に、それぞれのページのコンテンツ (+page.svelte など) が挿入される
✅ こうすることで、すべてのページで共通のヘッダーとフッターを維持しつつ、ページごとに異なるコンテンツを表示できる
SvelteKitのレイアウトを活用すれば、効率的にアプリを作れるので便利です!💡
slotの中身はページが変わったら、中身も合わせてくれるんですね。 どうやって検知しているのですか。
はい!SvelteKit の <slot /> は、ページが変わると自動的に そのページの内容に更新 されます。これは SvelteKit のルーティング機構 によって実現されています。
layout.svelte は SvelteKit の「ラッパー」SvelteKit では、layout.svelte は各ページの上に 共通のレイアウト として存在します。
そのため、<slot /> の部分は 常に「現在のページのコンテンツ」に置き換えられる仕組み になっています。
slot の中身が変わる例えば、src/routes/+page.svelte (トップページ) と src/routes/about/+page.svelte (Aboutページ) があるとします。
layout.svelte<header class="bg-blue-600 text-white p-4">
<h1 class="text-xl font-bold">My Website</h1>
</header>
<main class="container mx-auto p-4">
<slot /> <!-- ページが変わると、ここが新しいページの内容に入れ替わる -->
</main>
<footer class="bg-gray-800 text-white text-center p-4 mt-8">
© 2025 My Website. All rights reserved.
</footer>
+page.svelte (トップページ)<h2 class="text-2xl font-semibold">Welcome to My Website</h2>
<p class="mt-4">This is the homepage.</p>
about/+page.svelte (Aboutページ)<h2 class="text-2xl font-semibold">About Us</h2>
<p class="mt-4">We are a team of developers building amazing apps.</p>
この場合、
http://localhost:5173/ にアクセスすると layout.svelte の <slot /> に トップページ (+page.svelte) の内容が入る。http://localhost:5173/about にアクセスすると <slot /> に Aboutページ (about/+page.svelte) の内容が入る。SvelteKit は クライアントサイドルーティング を使用しており、ページ遷移時に <slot /> の中身だけを変更します。
これは SSR (サーバーサイドレンダリング) や CSR (クライアントサイドレンダリング) の仕組み を活用しています。
+page.svelte が更新されると slot の中身が変わるSvelteKit では、ルート (/) や /about などの URL に基づいて +page.svelte を動的に読み込み、slot に差し込む 仕組みになっています。
📌 ページが変わると、SvelteKit は layout.svelte の <slot /> の中身を再レンダリングする!
もし、ページ遷移のたびに処理を実行したい場合は、onDestroy を使うと便利です。
<script>
import { onDestroy } from "svelte";
onDestroy(() => {
console.log("ページが変わりました!");
});
</script>
<h2 class="text-2xl font-semibold">Welcome to My Website</h2>
<p class="mt-4">This is the homepage.</p>
👆 onDestroy() は、このページ (+page.svelte) から別のページに移動したときに実行 されます。
これを使えば、例えば「ページ遷移時にスクロールをリセットする」こともできます。
✅ SvelteKit の layout.svelte は、すべてのページの「ラッパー」
✅ <slot /> の中身は、現在のページ (+page.svelte) に自動で置き換わる
✅ SvelteKit はクライアントサイドルーティングを使い、ページ遷移をスムーズにする
✅ ページが変わることを onDestroy() で検知できる
この仕組みのおかげで、SvelteKit は ページ遷移を高速かつスムーズに処理 できます! 🚀