ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฆฌ์กํธ๋ก ๋คํฌ๋ชจ๋ ๊ตฌํํ๊ธฐ
๋คํฌ๋ชจ๋๋ ๋ค์ํ ๋ธ๋๋๋ค๊ณผ ์น ์ฌ์ดํธ์์ ์ด์ ๋ ๊ฑฐ์ ํ์๋ผ๊ณ ๋ด๋ ๋ ์ ๋๋ก ํํ๊ฒ ์ ์ฉ๋๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค.
๋ ์ญ์ ํด๋ํฐ, ๋
ธํธ๋ถ, ์ฑํ
์ดํ ๋ฑ์์ ๋คํฌ๋ชจ๋๋ฅผ ๋งค์ฐ ์ ์ฉํ๊ณ ์๊ณ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์ด์ ๋ ํ์ ๊ธฐ๋ฅ์ด ๋ ๋คํฌ๋ชจ๋๋ฅผ ๊ตฌํํ ์ค ์์์ผํ๋ค๊ณ ์๊ฐํด์ ์ด๋ฒ ๊ฐ์ธ ํ๋ก์ ํธ ๊ธฐํ์ ์ถ๊ฐํ๊ฒ ๋์๋ค.
๐ค ์งํ ์์
- ๋ผ์ดํธ๋ชจ๋, ๋คํฌ๋ชจ๋ ๋์์ธ
- ๋ผ์ดํธ/๋คํฌ theme.js ์ธํ
- ๋คํฌ๋ชจ๋ ๊ตฌํ
- ํ ๊ธ๋ฒํผ
- ์ํ ๊ด๋ฆฌ
- ๋ชจ๋ ์ ์ง ๊ธฐ๋ฅ
๐จ ๋์์ธ (feat. Figma)
์ ์ฒด์ ์ธ ๋ผ์ดํธ/๋คํฌ ๋ชจ๋์ ๋์์ธ์ ์์ ๊ฐ์ด ๋ง๋ค์ด๋ณด์๋ค.
๊ฐ ์ปดํฌ๋ํธ๋ค์ ํฌ๋ช
๋๋ฅผ ์ฃผ๊ณ ์ ์ฒด์ ์ธ ์๊ฐ์ ํ๋๋น์ด ๋๋ค. ๋คํฌ๋ชจ๋์ผ ๋์๋ ์์ ํ ๊ฒ์์์ด ์๋๋ผ ์์ฃผ ์ด๋์ด ๋จ์๊ณ์ด๋ก ๊ณจ๋๋ค.
๋คํฌ๋ชจ๋์ ๊ฒฝ์ฐ, ํฐํธ ์ปฌ๋ฌ๋ฅผ #FFFFFF๋ก ํ๋๊น ๋์ด ์ํ์ ์ฝ๊ฐ ํ์๋น์ด ๋ค์ด๊ฐ๊ฒ #FAFAFA๋ก ๋์ค์ ์์ ํ๋ค.
๊ท์ฌ์ด ๋คํฌ๋ชจ๋ ํ ๊ธ๋ฒํผ๋ ๊ฐ๋จํ ๋์์ธํ๋ค!
๋์์ธ์ด๋ผ๊ณ ํ๊ธฐ๋ ๋ฏผ๋งํ์ง๋ง..๐
๊ฐ ์ปดํฌ๋ํธ์ ์ค ํฌ๋ช
๋๋ฅผ ํ ๊ธ๋ฒํผ์๋ ๋๊ฐ์ด ์ค์ ํต์ผ๊ฐ์ ์ฃผ์๋ค. ๊ตฌ๊ธ๋งํด๋ณด๋ ๋ค๋ฅธ ๋ถ๋ค์ ๋๊ฒ ๋ฉ์๊ฒ ์ ๋ง๋์
จ๋๋ฐ ๋ ์ผ๋จ ์ด์ด๊ฐ๋จ์ผ๋กใ
ใ
..
โ๏ธ theme.js ์ธํ
export const lightTheme = {
fontSizes,
colors: {
colorMain: "#ffffff4d",
colorBg: "#F7F7FA",
colorMainFont: "#000000",
colorSkyBlue: "#E6F4FE",
colorBlue: "#0057BC",
colorDisabled: "#C4C4C4",
colorGray: "#D9D9D9",
colorDarkGray: "#a5a4a4",
colorWhite: "#FFFFFF",
colorRed: "#FC585A",
colorDiRed: "#FE9090",
colorShadow: "0 3px 6px rgba(0, 0, 0, .16)",
colorDarkShadow: "0 3px 6px rgba(0, 0, 0, .5)",
},
};
export const darkTheme = {
fontSizes,
colors: {
colorMain: "#585D6E4d",
colorBg: "#1B1D25",
colorMainFont: "#FAFAFA",
colorSkyBlue: "#E6F4FE",
colorBlue: "#3190ff",
colorDisabled: "#C4C4C4",
colorGray: "#D9D9D9",
colorDarkGray: "#a5a4a4",
colorWhite: "#FFFFFF",
colorRed: "#FC585A",
colorDiRed: "#FE9090",
colorShadow: "0 4px 7px rgb(68 68 68 / .8)",
colorDarkShadow: "0 3px 6px rgba(255, 255, 255, .5)",
},
};
๋ผ์ดํธ๋ชจ๋์ ๋คํฌ๋ชจ๋์ ๊ฐ๊ฐ ์ฌ์ฉํ theme์ ์ค์ ํด์ฃผ์๋ค.
theme ์ ์ฉ
App.js
const [themeMode, setThemeMode] = useState(lightTheme);
const theme = themeMode === "lightTheme" ? lightTheme : darkTheme;
return (
<>
<ThemeProvider theme={theme}>
<Globalstyle />
<Routes>
<Route
path="/home"
element={<Home themeMode={themeMode} />}
/>
<Route path="/signup" element={<Signup />} />
<Route path="/" element={<Login />} />
</Routes>
</ThemeProvider>
</>
);
ThemeProvider๋ฅผ ์ต์์ ํ์ผ์ธ App.js์ ์ ์ฉ์ํจ๋ค.
์ด๋, props๋ก theme๋ฅผ ์ ๋ฌ๋ฐ๋๋ฐ theme๋ themeMode๊ฐ ๋ผ์ดํธ๋ฉด ๋ผ์ดํธ๋ชจ๋ ์ปฌ๋ฌ์นฉ์ ํ ๋น๋ฐ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋คํฌ๋ชจ๋ ์ปฌ๋ฌ์นฉ์ ํ ๋น ๋ฐ๋๋ค. (์ปฌ๋ฌ์นฉ : ์์์ ์ธํ
ํด์ค theme.js)
์ต์์ ํ์ผ์ธ App.js์ ThemeProvider๋ฅผ ์ ์ฉ์ํค๋ฉด ์ด์ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
ํ ๊ธ ๋ฒํผ ๊ตฌํ
import React from "react";
import { ThemeModeWrapper } from "./styled";
export const ThemeModeButton = ({ toggleTheme, themeMode }) => {
return (
<ThemeModeWrapper onClick={toggleTheme}>
{themeMode === "lightTheme" ? "๐" : "๐"}
</ThemeModeWrapper>
);
};
// styled.jsx
import { css, styled } from "styled-components";
export const ThemeModeWrapper = styled.button`
position: absolute;
top: 0;
right: 0;
width: 80px;
margin: 10px;
border: none;
border-radius: 10px;
${({ theme }) => {
return css`
background-color: ${(props) => props.theme.colors.colorMain};
box-shadow: ${(props) => props.theme.colors.colorShadow};
`;
}}
`;
๋ฒํผ์ ํด๋ฆญํ๋ฉด onClick ์ด๋ฒคํธ๋ฅผ ํตํด toggleTheme ํจ์๊ฐ ์คํ๋๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ themeMode๋ props๋ก ์ ๋ฌ๋ฐ์ ๋ผ์ดํธ๋ชจ๋์ด๋ฉด ๐์ ํ์ํ๊ณ , ๋คํฌ๋ชจ๋์ด๋ฉด ๐๋ฅผ ํ์ํ๋๋ก ํ๊ณ ๋ฒํผ์ ๋ฐฐ๊ฒฝ๊ณผ ๊ทธ๋ฆผ์ ์คํ์ผ๋ ์์ ์ ์ํ๋ theme์ ๋ง๊ฒ ๋ณ๊ฒฝ๋๋๋ก ์์ฑํ๋ค.
ํ ๊ธ ๋ฒํผ ํจ์ ๊ตฌํ - ์ํ๊ด๋ฆฌ
const theme = themeMode === "lightTheme" ? lightTheme : darkTheme;
const toggleTheme = () => {
if (themeMode === "lightTheme") {
setThemeMode("darkTheme");
window.localStorage.setItem("theme", "darkTheme");
} else {
setThemeMode("lightTheme");
window.localStorage.setItem("theme", "lightTheme");
}
};
ํ ๊ธ๋ฒํผ ํด๋ฆญ ์ ๋์ํ toggleTheme ํจ์๋ฅผ ๊ตฌํํ๋ค.
ํ์ฌ themeMode๊ฐ "lightTheme"์ธ์ง "darkTheme"์ธ์ง ํ๋ณํ๊ณ , ๊ทธ์ ๋ฐ๋ผ ์ํ๊ฐ์ ์
๋ฐ์ดํธํ๊ณ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์๋ ์ ์ฅํ๋ค.
๋คํฌ๋ชจ๋ ์ ์ง - localStorage
const localThemeMode = window.localStorage.getItem("theme" || "lightTheme");
const [themeMode, setThemeMode] = useState(localThemeMode);
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์๋ themeMode์ ์ด๊น๊ฐ์ด "lightTheme"์๋๋ฐ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ ธ์์ themeMode์ ์ด๊น๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ์๋ค. ์ด๋ ๊ฒํ๋ฉด ๋คํฌ๋ชจ๋๋ฅผ ํ๊ณ ์๋ก๊ณ ์นจ์ ํ์ ๋์๋ ๋ก์ปฌ์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ ธ์์ ํ์ฌ themeMode์ ์ํ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ทธ ๊ธฐ๋ฅ์ ์ ์งํ ์ ์๋ค.
โจ ๊ฒฐ๊ณผ
๐ง ๋ฆฌํฉํ ๋ง์ ํ๋ค๋ฉด?
โ๏ธ context, redux, recoil ๋ฑ์ ์ด์ฉํด ์ํ๊ด๋ฆฌํด๋ณด๊ธฐ
โ๏ธ ์ปค์คํ
ํ
๋ง๋ค์ด๋ณด๊ธฐ
'Front-end ๐ฅ๐ค > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ์ค๊ธฐ
- ๋ธ๋ก์ฒด์ธ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ์ค๊ธฐ ์ ๋ฆฌ
- HTML
- ๋ฆฌ์กํธ
- indexOf()
- ํ์ฅ์ค์ต
- css grid
- ์ค๋งํธ์ปจํธ๋ํธ
- php
- ์กธ์ ์ํ์ค๋น
- JavaScript
- ๊ฐค๋ฌ๋ฆฌ๋์ฐ๊ธฐ
- ํ์ฅ์ค์ต ๊ธฐ๋ก
- ์ ์ฒ๊ธฐ ์ค๊ธฐ ์ ๋ฆฌ
- ํํ์ด์ง ๋ง๋ค๊ธฐ
- ๋ ธ๋ง๋์ฝ๋
- ์ด๋๋ฆฌ์
- ์กธ์ ์ํ
- CSS
- ์ ์ฒ๊ธฐ ์ค๊ธฐ
- php๊ฒ์ํ๋ง๋ค๊ธฐ
- C์ธ์ด
- php ๋ฌ๋ ฅ๋ง๋ค๊ธฐ ์์ฉ
- ํ๋ก๊ทธ๋๋จธ์ค
- MySQL
- DAPP
- set ๊ฐ์ฒด
- ๋ฐฑ์ค
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |