현재 개인 블로그를 만들면서 다크모드를 next-themes 라는 라이브러리를 사용해서 적용해보았다.
개인 블로그 css를 tailwind로 적용했기 때문에 tailwind 방식으로 진행했다.
tailwind.config.js 수정
config중 darkMode를 ”class” 로 바꾼다.
“class”로 수정해야 수동으로 어두운 모드 전환할 수 있다.
기본형은 “media” 로 운영 체제 기본 설정에 의존한다.
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
darkMode: "class",
theme: {
extend: {
.....
},
},
plugins: [],
};
export default config;
next-themes 설치 & 사용법
next-themes 라이브러리
npm i next-themes
설치 후 next-themes에 있는 ThemeProvider 로 Component 를 감싸야된다.
그리고 클래스를 사용하여 테마에 따라 페이지 스타일을 지정할 거기 때문에 attribute="class" 추가한다.
//_app.tsx
import type { AppProps } from "next/app";
import { ThemeProvider } from 'next-themes'
function App({ Component, pageProps }: AppProps) {
return (
<ThemeProvider attribute="class">
<Component {...pageProps} />
</ThemeProvider>
)
}
export default MyApp
DarkModeToggleBtn 라는 컴포넌트에 라이트, 다크모드 버튼을 만들고 Header영역에 배치 시켰다.
// components/darkModeToggleBtn.tsx
import { useTheme } from "next-themes";
import { useEffect, useState } from "react";
import { HiOutlineSun, HiOutlineStar } from "react-icons/hi";
export default function DarkModeToggleBtn() {
const { theme, setTheme } = useTheme();
const [loaded, setLoaded] = useState(false);
useEffect(() => {
setLoaded(true);
}, [setLoaded]);
return (
<button
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
className="flex p-1"
>
{loaded ? (
<>
{theme === "dark" ? (
<HiOutlineStar className="text-2xl text-yellow-500" />
) : (
<HiOutlineSun className="text-2xl" />
)}
</>
) : null}
</button>
);
}
Header에 배치
// components/header.tsx
import Link from "next/link";
import DarkModeToggleBtn from "./darkModeToggleBtn";
import { useRouter } from "next/router";
import { cls } from "libs/utils";
export default function Header() {
const router = useRouter();
return (
<header className="fixed top-0 z-50 bg-primary w-full">
<div className="max-w-3xl flex items-center justify-between py-2 px-4 lg:px-0 mx-auto">
<nav className="flex gap-2 items-start header-style">
...
</nav>
<DarkModeToggleBtn />
</div>
</header>
);
}
이제 다크모드에서는 별 버튼이 라이트모드에서는 해 모양의 버튼이 보인다.
tailwind로 dark: 로 다크모드에 대한 스타일을 주면 theme이 "dark" 일 때 해당 스타일을 적용한다.
// styles/globals.css
.bg-primary {
@apply bg-white dark:bg-slate-900;
}
'Css' 카테고리의 다른 글
em 단위와 rem 단위의 차이 (0) | 2024.08.24 |
---|---|
TailwindCSS 설치 & 사용법 (0) | 2024.08.24 |
svg 색상 변경 (0) | 2024.08.23 |
다크모드 적용 (emotion) (0) | 2024.08.23 |
텍스트 라인 수 제한 (0) | 2024.08.23 |