Next.jsでダークモードを実装する方法を、具体的なコードを交えながら説明します。ダークモードの実装は、ユーザーエクスペリエンスの向上に役立ちます。ここでは、ユーザーがボタンをクリックしてダークモードとライトモードを切り替えられるシンプルな方法を紹介します。
1. 初期設定
まず、Next.jsのプロジェクトを作成します。以下のコマンドで新しいNext.jsプロジェクトを作成しましょう。
npx create-next-app@latest my-dark-mode-app
cd my-dark-mode-app
npm run dev
2. グローバルCSSの設定
次に、styles/globals.css
ファイルに基本的なスタイルを追加します。このファイルには、ダークモードとライトモードの切り替え用のCSSクラスを定義します。
/* styles/globals.css */
:root {
--background-color: #ffffff;
--text-color: #000000;
}
body {
background-color: var(--background-color);
color: var(--text-color);
transition: background-color 0.3s, color 0.3s;
}
.dark-mode {
--background-color: #000000;
--text-color: #ffffff;
}
解説:
:root
でCSS変数を定義し、背景色とテキスト色を変数として管理します。body
要素でbackground-color
とcolor
をvar(--background-color)
およびvar(--text-color)
に設定し、ダークモードとライトモードの切り替えがスムーズに行われるようにtransition
を追加しています。.dark-mode
クラスを使って、ダークモード時の色設定を上書きしています。
3. ダークモードの切り替えロジック
ダークモードとライトモードを切り替えるためのボタンとその動作を実装します。
// components/ThemeToggleButton.js
import { useState, useEffect } from 'react';
export default function ThemeToggleButton() {
const [theme, setTheme] = useState('light');
useEffect(() => {
if (localStorage.getItem('theme') === 'dark') {
setTheme('dark');
document.body.classList.add('dark-mode');
}
}, []);
const toggleTheme = () => {
if (theme === 'light') {
setTheme('dark');
document.body.classList.add('dark-mode');
localStorage.setItem('theme', 'dark');
} else {
setTheme('light');
document.body.classList.remove('dark-mode');
localStorage.setItem('theme', 'light');
}
};
return (
<button onClick={toggleTheme}>
{theme === 'light' ? 'Dark Mode' : 'Light Mode'}
</button>
);
}
解説:
useState
フックを使って、現在のテーマを管理します。初期値は ‘light’ です。useEffect
フックで、ページがロードされたときにlocalStorage
から保存されたテーマをチェックし、それに応じてテーマを設定します。toggleTheme
関数で、テーマを切り替えるロジックを実装しています。テーマが ‘light’ の場合は ‘dark’ に変更し、その逆も行います。また、localStorage
にテーマを保存することで、ページをリロードしてもテーマの設定が保持されるようにしています。
4. アプリに組み込む
pages/_app.js
ファイルで、このボタンをアプリ全体に適用します。
// pages/_app.js
import '../styles/globals.css';
import ThemeToggleButton from '../components/ThemeToggleButton';
function MyApp({ Component, pageProps }) {
return (
<>
<ThemeToggleButton />
<Component {...pageProps} />
</>
);
}
export default MyApp;
解説:
ThemeToggleButton
コンポーネントをMyApp
に追加し、どのページからもテーマの切り替えができるようにしています。
5. 動作確認
すべてが設定できたら、アプリを再起動して動作を確認します。テーマ切り替えボタンをクリックすることで、ダークモードとライトモードが切り替わることを確認できます。
まとめ
Next.jsでのダークモード実装は、CSSの変数を使って色を管理し、JavaScriptでクラスを切り替えるシンプルなアプローチです。さらに、localStorage
を利用してユーザーのテーマ選択を保持することで、よりユーザーフレンドリーな体験を提供できます。
この実装を基に、自分のプロジェクトに合わせたカスタマイズを行い、スタイリッシュで使いやすいダークモードを実現してください。