๋๋์ด ๋ฏธ๋ค์๋ ๋์ Tami.zip ๋ธ๋ก๊ทธ ๋คํฌ๋ชจ๋ ๋ฒํผ์ ๋ง๋ค์๋ค.
๋ฏธ๋ค์๋ ์ด์ ๋ ํฌ๊ฒ 2๊ฐ์ง
1. ์ฌ์ฉ์ ํ ๋ง์ ๋ฐ๋ฅธ ๋คํฌ๋ชจ๋ ์ง์ ์๋ฃ๋ง ๋ง์ -> ๋ด๊ฐ ์ํ๋๊ฑด ๋ฒํผ์ ํตํ ๋คํฌ๋ชจ๋!
2. ํฐ์คํ ๋ฆฌ๋ ๋ฐฐ๊ฒฝ์ ๋ฐ๊พผ ํ์ ํ์ํ CSS๋ฅผ ์ผ์ผ์ด ์ก์์ ๋ฐ๊ฟ์ค์ผ ํจ
ํ์ง๋ง, ์๋ํ ๋ฐค์ ํจ ๋์ ๋ธ๋ก๊ทธ๋ ํญ์ ์์ด์ดํ์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ๊พธ๊ธฐ๋ก ๊ฒฐ์ฌํ๊ณ
์ฌ๋ฌ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๋ ๋งํผ ์์ธํ๊ฒ ์ด๋์ ์ด๋ค ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋๋์ง ๊น์ง ์ค๋ช ํ๋ ค ํ๋ค.
๋คํฌ๋ชจ๋ ๋ฒํผ์ ์์ฑํ๋ ๊ณผ์ ์๋ ๐๋คํฌ ๋ชจ๋ ๋ผ์ดํธ ๋ชจ๋ ํ ๊ธ ์ค์์น ๊ธฐ๋ฅ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
๋คํฌ๋ชจ๋๋ฅผ ์ค์ ํ๋ ๊ฑธ ์ค๋ช ํ๋ ๋ค์ํ ๋ธ๋ก๊ทธ๋ค์ด ์์์ง๋ง, ํด๋น ๋ธ๋ก๊ทธ๋งํผ ์ ํํ๊ฒ ๋ด๊ฐ ์ํ๋ ๊ฒ์ด ์์๋๋ฐ, ๋ค์ ํ๋ฒ ํด๋น ํ์์๊ฒ ๊ฐ์ฌ์ ๋ง์ ๋๋ฆฝ๋๋ค.
ํน์ง
- ๋ฒํผ์ ํตํ ๋คํฌ๋ชจ๋ ์ค์์น
- ๊ธฐ๋ณธ์ค์ ์์ฒด๋ ๋คํฌ๋ชจ๋
- ์ฌ์ฉ์์ ๊ธฐ๋ณธ ํ ๋ง ์ค์ ์ ์๊ด ์์
์์ ์์
1. ๋คํฌ๋ชจ๋ ๋ฒํผ ์์ฑ
2. CSS ๋ณ๊ฒฝ
์ ๊น! โ๐ป
๋ธ๋ก๊ทธ ๊ด๋ฆฌ > ๊พธ๋ฏธ๊ธฐ/์คํจ๋ณ๊ฒฝ > ๋ณด๊ด
ํน์ ๋ชจ๋ฅด๋ ์คํจ ํธ์ง ์ ํ์ฌ ์ํฉ์ ๋ณด๊ดํด๋๊ณ ๊ฐ๊ธธ ๋ฐ๋๋ค!
(๋๋ ๋ชฐ๋์ง๋ง, ๋ ธ์์ด ์๋ ค์ฃผ์๋ค. ๊ฐ์ฌํฉ๋๋ค ใ ใ )
1. ๋คํฌ๋ชจ๋ ๋ฒํผ ์์ฑ
๋ธ๋ก๊ทธ ๊ด๋ฆฌ > ๊พธ๋ฏธ๊ธฐ /์คํจํธ์ง > html ํธ์ง ( ๋๋ ์๋ BookClub ์คํจ์ด์์ )
<๋ธ๋ก๊ทธ ๊ธฐ๋ณธ html >
<html lang="ko">
<head>
<script async ></script>
<script></script>
<!--์ฌ๊ธฐ์ <script> </script> ์ฝ๋๋ฅผ ๋ฃ์ด์ค ์์ -->
</head>
<body>
//์ค๋ต
</body>
//
๋ธ๋ก๊ทธ ๊ธฐ๋ณธ html์ ์ด๋ฉด ๋ณต์กํ๊ฒ ์๊ฒผ๋๋ฐ ๋๋ต ์์๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋์ํ javaScript ์ฝ๋๋ฅผ ๋ฃ์ด์ค ๊ฑด๋ฐ, html ํ์ผ์ <script>๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ถ๊ฐํด์ค์ผ ํ ์ฝ๋๋ ๊ธฐ๋ฅ script ์ ๋ฒํผ
< ๊ธฐ๋ฅ script >
<script>
// ํ ๊ธ ๋ฐ className ์ค์
$(document).ready(function () {
$('a').click(function () {
$('a').removeClass('active');
$(this).addClass('active');
});
$('.switch').click(function () {
$('body').toggleClass('light');
});
});
</script>
<script>
// ๋ก์ปฌ์คํ ๋ฆฌ์ง์ theme ์ค์
function setTheme(themeName) {
localStorage.setItem('theme', themeName);
document.documentElement.className = themeName;
}
// theme ํ์ธ ํ theme ํ ๊ธ
function toggleTheme() {
if (localStorage.getItem('theme') === 'theme-light') {
setTheme('theme-dark');
} else {
setTheme('theme-light');
}
}
// ์ด๊ธฐ ๋ก๋ ์ ํ
๋ง ์ค์ ์ฆ์์คํํจ์
(function () {
if (localStorage.getItem('theme') === 'theme-light') {
setTheme('theme-light');
} else {
setTheme('theme-dark');
}
})();
</script>
๋๋ ๊ธฐ๋ณธ์ด dark๋ชจ๋์ด๊ธธ ์ํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด ์๋ ๋ฒํผ์ ๊ธฐ๋ฅ์ ์ค์ ํจ
- ๋ฒํผ์ ๋๋ฅด๋ฉด 'light' class ์ถ๊ฐ
- ํด๋ฆญ์ ํ ๋ง๊ฐ ์ํ์ ๋ฐ๋ผ ๋ฐ๋๋ก toggle
- ์ด๊ธฐ ๋ก๋ ์ ์ฆ์์คํ๋ toggle ํจ์
<๋ฒํผ ์ถ๊ฐ>
๋ฒํผ์ ์ ๋งคํ๊ฒ ์ํ๋ ๊ณต๊ฐ์ ์ถ๊ฐํด์ค์ผ ํ๋๋ฐ ๋๋ ๋ก๊ณ ์์ ๋ฐ๋ก ์์์ผ๋ฉด ํด์ ํด๋น๋ถ๋ถ์ ์ฐพ์ ๋ฃ์ด์ฃผ์๋ค
<div id="wrap">
<header id="header">
<div class="inner">
<h1>
<a href="https://rrecoder.tistory.com/">
<s_if_var_logo>
<img src="" alt="ํ๋ฏธ.zip">
</s_if_var_logo>
<s_not_var_logo>
ํ๋ฏธ.zip
</s_not_var_logo>
</a>
<!--์ฌ๊ธฐ์ ๋ฒํผ์ ๋ฃ์๋ค-->
</h1>
๋ฒํผ ( ํด์ ๋ฌ icon์ผ๋ก ๋์ด์๊ณ stroke์๋ ์ํ๋ ์์ hexa code๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.)
<button class="switch" onclick="toggleTheme()">
<svg class="sun" fill="none" stroke="#F8D5EA" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="feather feather-sun" viewBox="0 0 24 24"><defs/><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg class="moon" fill="none" stroke="#4A6CB3" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="feather feather-moon" viewBox="0 0 24 24"><defs/><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>
</button>
2. CSS ๋ณ๊ฒฝ
HTML ์์ CSS๋ฅผ ๋๋ฅด๋ฉด ํด๋น HTML ์ ์๋ ๋ชจ๋ ์คํ์ผ ์ค์ ์ ํ ์ ์๋๋ฐ
๊ฑฐ์ ๋ชจ๋ ํ๊ทธ๋ฅผ class๋ก ์ก์ ์คํ์ผ ์ง์ ์ ํ๋์ฉ ํด์ค๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ง์ ํ ์คํ์ผ
- ๋ด๊ฐ ๋ง๋ ๋ฒํผ์ ์คํ์ผ ์ง์
- ๋คํฌ๋ชจ๋์ผ ๋ ๋ธ๋ก๊ทธ ๋ด ์ปจํ ์ธ ๋ค์ ์คํ์ผ(์์) ์ง์
ํฌ๊ฒ ์์น๋ ์๊ด ์์ง๋ง ๋๋ <body> ๋ฐ์ ๋ฐ๋ก ๋ฃ์๋ค.
theme ์์์ ๋ฉ์ธ ์ปฌ๋ฌ๊ฐ ๋ ๊ฒ๋ค์ ์์์ ์์ฑํ๋ค.
gray์ธ ์ด์ ๋ ์ฒ์์ ๊ทธ๋ ์ด ๊ณ์ด๋ก ๋ง์ท๋ค๊ฐ ๋ฉ์ธ ์ปฌ๋ฌ์ ๋ง์ถฐ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ด๋ค.
/* dark theme color palette. */
.theme-dark {
--color-gray1: #fff;
--color-gray2: #e9e4e7;
--color-gray3: #d4c9cf;
--color-gray4: #584852;
--color-gray5: #67545f;
--color-gray6: #70666c;
--color-point: #c47d7d;
--color-header: #947989;
}
/* light theme color palette */
.theme-light {
--color-gray1: #1d181b;
--color-gray2: #67545f;
--color-gray3: #584852;
--color-gray4: #d4c9cf;
--color-gray5: #e9e4e7;
--color-gray6: #fff;
--color-point: #c47d7d;
--color-header: #fff;
}
/* ๋คํฌ๋ชจ๋ ํ ๊ธ ๋ฒํผ ์คํ์ผ */
.switch {
display: flex;
position: relative;
margin-left: 14px;
top: 0;
right: 0;
padding: 2px;
background-color: transparent;
border: none;
border-radius: 50%;
color: #ddd;
box-shadow: 1px 1px 3px 1px var(--color-gray5);;
outline: none;
cursor: pointer;
}
/* ๋คํฌ๋ชจ๋ ๋ฒํผ ๋ด svg ์คํ์ผ */
svg {
width: 0;
height: 24px;
transition: all 0.3s ease-in;
transform-origin: center;
}
/* theme์ ๋ฐ๋ฅธ toggle๋ฒํผ ์คํ์ผ ์ง์ */
.moon {
opacity: 0;
width: 0;
}
.sun {
width: 24px;
bottom: 20px !important;
left: 20px;
}
.light .moon {
opacity: 1;
width: 24px;
bottom: 20px !important;
left: 20px;
}
.light .sun {
opacity: 0;
width: 0;
}
๋ง์ฝ ๊ธฐ๋ณธ ํ์ ์์ color theme๋ฅผ ์ํ๋ค๋ฉด ์๋ theme๋ฅผ ์ฌ์ฉํ์๊ธฐ๋ฅผ
.theme-dark {
--color-gray1: #fff;
--color-gray2: #eee;
--color-gray3: #999;
--color-gray4: #777;
--color-gray5: #555;
--color-gray6: #70666c;
--color-point: #e5b959;
}
/* ์ด๋์ธ ๋ ํ์๋๋ ์์์ ์ง์ ํฉ๋๋ค. */
.theme-light {
--color-gray1: #70666c;
--color-gray2: #555;
--color-gray3: #777;
--color-gray4: #eee;
--color-gray5: #eee;
--color-gray6: #fff;
--color-point: #e5b959;
}
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ถํฐ๊ฐ ๊ณค์์ธ๋ฐ.. ์ด์ฉ์๊ฐ ์๋ค. ์ด๋ ๊ฒ ํด๋ ์ํ์์ ์ ์ฉ ๋๋ฌ๋ณด๊ณ ๋คํฌ๋ชจ๋ ์ํ์์ ๋ฐ๋์ด ๋ฒ๋ฆฐ ์น๊ตฌ๋ค์ ํ๋ํ๋ ์ค์ ํด์ค์ผ ํ๋ค.
์ ๋ง ์ฌ๊ธฐ์๋ ๊ทธ ํด ์์์ ํ๊ธฐ๋ ๋ฒ๊ฑฐ์์ ํ์ฌ CSS ์ฝ๋๋ฅผ vscode์ ์ฎ๊ธด๋ค์ ์์ ํ๋ค.
var(--color-gray1)
a) ๋ธ๋ก๊ทธ์์ ๊ฐ๋ฐ์๋๊ตฌ (opt+cmd+i) ๋ก ํด๋น ์์ญ์ className์ ํ์ธ
b) vscode์์ ํด๋น ์์ญ ์ปฌ๋ฌํ ๋ง์์ ์ํ๋ ์์ ์ง์
์์
.cover-thumbnail-4 ul li .title {
color: var(--color-gray4);
}
c) ๋ฐ๋ณต *100...๐ค
์ด๋ ๊ฒ ๋ช์ญ๋ฒ์ ๋ฐ๋ณตํ๋ฉด ์์ฑ!
๋ ธ๋ ฅ๊ณผ ๋๊ธฐ๊ฐ ์ฌ๋ฌ๋ถ์ ๋ธ๋ก๊ทธ๋ฅผ ์๋ฆ๋ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค..
๋ํ ์ผํ๊ฒ ํ๋ค๊ณ ์์ ๋ฐ๊พธ๋๋ฐ ์ค๋๊ฑธ๋ ธ์ง๋ง ๋๋ถ์ ์ด๋ฐ ์์๊ณ ๋ง์กฑ์ค๋ฌ์ด...๋คํฌ๋ชจ๋๋ฅผ ๋ง๋ค๊ฒ ๋์๋ค.
๋๋ฌด ํ๋ณตํ๋ค .
๋ฐ๊พธ๋ฉด์ ์ถ๊ฐ๋ก ๋ฉ์ธ์ด๋ฏธ์ง์ ๋ก๊ณ ๋ ๋ณ๊ฒฝํ๋๋ฐ ์ง์ ๊ทธ๋ฆฐ ํ์ํผํํ๋ฏธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ง์กฑ์ค๋ฝ๋ค~
์ฌ๋ฌ๋ถ๋ ์ฆ๊ฑฐ์ด ๋คํฌ๋ชจ๋ ๋ฒํผ ๋ง๋ค๊ธฐ๋ฅผ ์ํํด๋ณด์ธ์
'๐ ํ๋ฏธ๋ ธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
input ๊ด๋ จ ์ด๋ฒคํธ ํํค์น๊ธฐ - input onChange onKeyUp onKeydown (2) | 2022.06.01 |
---|---|
ํ๋ก ํธ์๋ ์ ์ฌ 6๊ฐ์ ํ๊ณ ! (2) | 2022.04.12 |
ํ๋ก ํธ ์คํํฐ 2021ํ๊ณ - ์ด์จ๋ frontEND! (2) | 2022.01.10 |
ํ์ ํ๋ฉฐ ๋ง์ถฐ๋ณธ ์๊ทธ๋งํ ์ปจ๋ฒค์ ๋ชจ์ zip (4) | 2021.12.19 |
TIL #1 ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ React ๋ก InfiniteScroll (๋ฌดํ ์คํฌ๋กค) ๊ตฌํํ๊ธฐ (4) | 2021.07.28 |
๋๊ธ