Next.JS의 Tailwind 클래스 기반 다크 모드
TailwindCss
내가 사용해 본 최고의 유틸리티 기반 CSS 프레임워크 중 하나입니다. 필요한 모든 CSS 속성에 값을 제공하며 우리 스스로 디자인해야 합니다. 구성 요소 구조를 사용하도록 강요하지 않기 때문에 Bootstrap 또는 ChakraUI보다 훨씬 더 훌륭합니다.
Because Tailwind is so low-level, it never encourages you to design the same site twice. Even with the same color palette and sizing scale, it's easy to build the same component with a completely different look in the next project.
Next.Js에 대해 클래스 기반 다크 모드를 활성화하는 방법은 무엇입니까?
다크 모드용 tailwindcss 문서에서는 특정 페이지에 대한 페이지 로드 시 작성할 내용에 대한 기본 스니펫만 제공하지만 프레임워크에 대한 예제나 문서는 제공하지 않습니다.
darkMode
파일에서 false
에서 'class'
까지 tailwind.config.js
키 값을 재정의해야 합니다.module.exports = {
darkMode: 'class',
// ...
}
_app.js
파일을 편집해야 합니다. 이를 위해 구성 요소를 반환하기 직전에 반응에서 useEffect
를 사용합니다. _app.js
에서:import '../styles/globals.css';
import { useEffect } from 'react';
function MyApp({ Component, pageProps }) {
useEffect(() => {
if (
localStorage.theme === 'dark' ||
(!('theme' in localStorage) &&
window.matchMedia('(prefers-color-scheme: dark)').matches)
) {
//check if there is any key for theme in local storage and if the system color theme is dark
document.documentElement.classList.remove('light'); //OPTIONAL - remove light from the html document if any
document.documentElement.classList.add('dark'); // add dark to the <html></html> itself as <html class='dark'></html>
} else {
document.documentElement.classList.remove('dark'); // remove dark from the html document if any
document.documentElement.classList.add('light'); //OPTIONAL - add light to the <html></html> itself as <html class='light'></html>
}
},[]);
return <Component {...pageProps} />;
}
export default MyApp;
이렇게 하면 구성 요소를 마운트하기 전에 html에 클래스가 추가됩니다.
ThemeSwitch.jsx
에서:import { useEffect, useState } from 'react';
const isDark = () => //Function that will return boolean if any of the condition is satisfied
(localStorage && localStorage.theme === 'dark') || //Condition 1 - has local storage and theme = dark in local storage is found
(!('theme' in localStorage) &&
window.matchMedia('(prefers-color-scheme: dark)').matches); //Condition 2 - No theme key in local storage but media color scheme is dark
const getTheme = (isDark) => (isDark ? 'dark' : 'light'); //Function to return 'dark' or 'light' string
const ThemeSwitch = () => {
const [darkMode, setDarkMode] = useState(false); //State for holding theme status
const toggleMode = () => { //onClick handler for changing theme on button press
localStorage.theme = getTheme(!darkMode); //setting up local storage theme value
if (localStorage.theme === 'dark') { // If theme is 'dark'
document.documentElement.classList.remove('light'); // remove 'light' from html class
document.documentElement.classList.add('dark'); // add 'dark' to html class
} else { // if not 'dark'
document.documentElement.classList.remove('dark'); // remove 'dark' from html class
document.documentElement.classList.add('light'); //add 'light' to html class
}
setDarkMode(!darkMode); //set dark mode state to opposite of initial value
};
useEffect(() => {
setDarkMode(isDark()); //before page mount set the value of dark mode by observing theme in local storage
}, []);
const darkModeActive =
process.browser && document.documentElement.classList.contains('dark'); // returns true if its a client and 'dark' is present in html
// process.browser is deprecated can be written as typeof window === 'undefined'
return (
<>
<button className='w-10 h-10 focus:outline-none' onClick={toggleMode}>
<span className='sr-only'>Color mode switch button</span>
{darkModeActive ? ( //switch mode icon according to html class 'dark' or 'light'
// Light Icon Svg
) : (
// Dark Icon Svg
)}
</button>
</>
);
};
export default ThemeSwitch;
이제 레이아웃의 탐색 모음에 테마 스위치를 추가하고 모든 페이지에서 테마를 변경할 수 있습니다.
참고: CSS를 수동으로 제어하려면 클래스 이름에
dark:some-value
를 추가하는 것을 잊지 마십시오.
Reference
이 문제에 관하여(Next.JS의 Tailwind 클래스 기반 다크 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dawnind/tailwind-s-class-based-dark-mode-in-next-js-47gh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)