- styled-components를 사용하면서, createGlobalStyle를 사용하게 되었는데, 문득 이를 사용하면 손쉽게 다크 모드를 설정할 수 있지 않을까 하는 생각이 들어서 직접 다크 모드를 구현해 보았다.
🍉 전역으로 상태를 관리하기 위해서 Redux를 사용하였다.
import { createGlobalStyle } from "styled-components";
import "./font.css";
const GlobalStyle = createGlobalStyle`
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
color: black;
background-color: white;
}
`;
export default GlobalStyle;
import './App.css';
import GlobalStyle from "./GlobalStyle";
const queryClient = new QueryClient();
function App() {
return (
<div className="App">
<p>안녕하세요!</p>
<GlobalStyle/>
</div>
);
}
export default App;
GlobalStyle에 props를 주어서 조건부로 글자와 배경의 색상을 결정한다.
이를 위해서 redux를 사용하였다 (여기서 redux의 사용법은 생략한다)
import './App.css';
import GlobalStyle from "./GlobalStyle";
import { useSelector } from "react-redux";
const queryClient = new QueryClient();
function App() {
const isDark = useSelector(state => state.darkmode).isDark;
return (
<div className="App">
<p>안녕하세요!</p>
<GlobalStyle isDark={isDark}/>
</div>
);
}
export default App;
import { createGlobalStyle } from "styled-components";
const GlobalStyle = createGlobalStyle`
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
color: ${({isDark}) => isDark ? "white" : "black"};
background-color: ${({isDark}) => isDark ? "black" : "white"};
}
input, textarea {
color: ${({isDark}) => isDark ? "white" : "black"};
background-color: ${({isDark}) => isDark ? "black" : "white"};
}
`;
export default GlobalStyle;
배경이나 글자의 색상 외에도 여러가지 색상이 쓰일 수 있고, 이 색상들이 현재 다크 모드인지 아닌지에 따라서 어울리지 않을 수도 있다.
이런 경우에 사용하기 위해서, CSS의 전역 색상을 만들고 현재 테마에 따라서 다른 색상이 될 수 있도록 한다.
import { createGlobalStyle } from "styled-components";
const GlobalStyle = createGlobalStyle`
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
color: ${({isDark}) => isDark ? "white" : "black"};
background-color: ${({isDark}) => isDark ? "black" : "white"};
}
:root {
--my-yellow: ${({isDark}) => isDark ? "yellowgreen" : "yellow"};
}
`;
export default GlobalStyle;
위와 같이 GlobalStyle의 :root에 색상을 지정해 놓고, var(변수이름) 으로 해당 색상을 사용할 수 있다.
🍉 ex) color: var(--my-yellow);
전역 스타일에 다른 값을 덮어씌우고 싶다면, !important를 사용한다.
🍉 ex) color: purple!important;