๐จ 11. CSS ๋ณ์: '์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋์์ธ ์์คํ ์ ์ฌ์ฅ'
๐ ๊ฐ์
๋จ์ํ ๊ฐ์ ์ ์ฅํ๋ ์์ค์ ๋์ด, ๋ฐํ์์ ์คํ์ผ์ ์ ์ดํ๊ณ ํ ๋ง๋ฅผ ์ ํํ๋ ์ ๋ต์ ์ธ CSS Custom Properties ํ์ฉ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ์์๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 9๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[CSS ๋ณ์์ ๋ฌธ๋ฒ] โ [Scoped ๋ณ์์ ํ
๋ง ์ ํ] โ [JS์ CSS์ ๋ค๋ฆฌ ๋๊ธฐ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
:root๋ฅผ ๋์ด ํน์ ์ปดํฌ๋ํธ ๋จ์๋ก ๋ณ์๋ฅผ ์ ์ํ๊ณ ํ์ฉํฉ๋๋ค. - ๋คํฌ ๋ชจ๋์ ๋ธ๋๋ ์ปฌ๋ฌ ์ ํ์ ๋จ ๋ช ์ค์ CSS๋ก ๊ตฌํํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ CSS ๋ณ์๋ฅผ ์ค์๊ฐ์ผ๋ก ์กฐ์ํด ๋์ ์ธ ํจ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ (ํ๋ฐ๋ถ ์ค๋ฌด์): "์ํธ ๋! ์์ ๋์์ด๋ ๋์ด ๋ธ๋๋ ๋ธ๋ฃจ ์ปฌ๋ฌ๋ฅผ ์ด์ง ์ฐํ๊ฒ ๋ฐ๊ฟ๋ฌ๋ผ๊ณ ํ์ จ์ด์. ๊ทธ๋ฐ๋ฐ ํ๋ก์ ํธ ์ ์ฒด์ ๊ฐ์ ์์๊ฐ์ด ์ฌ๋ฌ ๊ณณ์ ์ง์ ๋ค์ด๊ฐ ์์ด์ ๋ณ๊ฒฝ ๋ฒ์๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ต์ต๋๋ค."
- ๐ฆ ์ํธ (๋ฆฌ๋): "์ด์ ํ ํฐ์ผ๋ก ๊ด๋ฆฌํ ์์ ์ด์์. ์์์ ์ด๋ฆํ(๋ณ์)๋ก ๊ด๋ฆฌํ๋ค๋ฉด, ๊ทธ ์ด๋ฆํ์ ๊ฐ ํ๋๋ง ๋ฐ๊ฟ๋ ๊ด๋ จ ์ปดํฌ๋ํธ๊ฐ ํจ๊ป ๋ฐ๋๋๋ค. ๋์์ธ ์์คํ ์ ์ฒซ๊ฑธ์์ธ CSS ๋ณ์๋ฅผ ๋ฐฐ์๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
CSS ๋ณ์(Custom Properties)๋ ๋จ์ํ ํธ์ ๊ธฐ๋ฅ์ด ์๋๋ผ '์์คํ ' ์ ๊ตฌ์ถํ๋ ๋๊ตฌ์ ๋๋ค. ์์ ์๋ SASS ๊ฐ์ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์จ์ผ๋ง ๋ณ์๋ฅผ ์ธ ์ ์์์ง๋ง, ์ด์ CSS ํ์ค ๋ณ์๋ ๊ทธ๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์ฅ ํฐ ์ฐจ๋ณ์ ์ ๋ฐํ์์ฑ ์ ๋๋ค. SASS ๋ณ์๋ ๋น๋ํ๊ณ ๋๋ฉด ์ฌ๋ผ์ง์ง๋ง, CSS ๋ณ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ค์๊ฐ์ผ๋ก ๊ฐ์ ๋ฐ๊ฟ ์ ์์ฃ . 5๋ ์ฐจ ์ด์์ ์๋์ด๋ ์ด๋ฅผ ํ์ฉํด ๋คํฌ ๋ชจ๋ ์ฒ๋ผ ๋ณต์กํ ์คํ์ผ ์ ํ์ ์กฐ๊ฑด๋ถ ํด๋์ค ์์ด ์ฐ์ํ๊ฒ ํด๊ฒฐํฉ๋๋ค.
๐๏ธ 1. CSS ๋ณ์์ ๊ธฐ๋ณธ๊ณผ ์ค์ฝํ(Scope)
๋ค์ ์ฝ๋๋ ์ ์ญ ํ ํฐ๊ณผ ์ปดํฌ๋ํธ ํ ํฐ์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ฐ์ ๋ฒํผ ์ฝ๋๋ผ๋ ๋ถ๋ชจ๊ฐ ์ด๋ค ๋ณ์ ๊ฐ์ ์ ๊ณตํ๋๋์ ๋ฐ๋ผ ์์์ด ๋ฌ๋ผ์ง๋๋ค.
/* 1. ์ต์๋จ(Global) ์ ์ธ */
:root {
--primary-color: #3b82f6;
}
/* 2. ์ปดํฌ๋ํธ(Local) ์ ์ธ - ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ */
.card--featured {
--primary-color: #f59e0b; /* ์ด ์นด๋ ๋ด๋ถ์์๋ง primary ์๋ฏธ๋ฅผ ์ฌ์ ์ํฉ๋๋ค. */
}
/* 3. ์ฌ์ฉ */
.btn {
background-color: var(--primary-color, #3b82f6);
}var(--primary-color, #3b82f6)์ ๋ ๋ฒ์งธ ๊ฐ์ fallback์
๋๋ค. ๋ณ์๊ฐ ์์ง ์ ์๋์ง ์์ ๋ฒ์์์๋ ๋ฒํผ์ด ์ฝ์ ์ ์๋ ์์ ์ ์งํ๊ฒ ํด์ค๋๋ค.
๐ฆ ์ํธ์ ํต์ฌ ๋ ์จ:
"๋ณ์๋ ์์๋ฉ๋๋ค! ๋ถ๋ชจ ์์์์ ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ์์ ์์๋ค์ด ์ผ์ ํ ๊ทธ ๋ฐ๋ ๊ฐ์ ์ฐ๊ฒ ๋์ฃ . ์ด๊ฒ ๋ฐ๋ก ํ ๋ง ์ ํ์ ํต์ฌ ์๋ฆฌ์ ๋๋ค."
๐ 2. ๋คํฌ ๋ชจ๋: if๋ฌธ ์๋ ํ ๋ง ์ ํ
๊ณผ๊ฑฐ์ฒ๋ผ ๋ชจ๋ ์ปดํฌ๋ํธ์ .dark .btn ์ฒ๋ผ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
:root {
--bg: #ffffff;
--text: #000000;
}
[data-theme="dark"] {
--bg: #000000;
--text: #ffffff;
}
body {
background: var(--bg);
color: var(--text);
}๐ฃ ์์ฒ : "์ด์ body์ ๋ณ์ ๊ฐ๋ง ๋ฐ๊พธ๋ฉด ํ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ํ ํฐ ์ด๋ฆ์ ์ ์งํ ์ฑ ํ
๋ง๋ฅผ ๋ฐ๋ผ๊ฐ๋ค์. ๋คํฌ ๋ชจ๋๊ฐ ์กฐ๊ฑด๋ฌธ๋ณด๋ค ์ค๊ณ ๋ฌธ์ ์ ๊ฐ๊น๋ค๋ ๊ฒ ๋ณด์
๋๋ค."
๐ 3. JS์์ ๊ฐ๋ ฅํ ์ฝ๋ผ๋ณด๋ ์ด์
CSS ๋ณ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ ์ค์๊ฐ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
/* ๋ง์ฐ์ค ์์น์ ๋ฐ๋ผ ๋ณ์ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ */
document.documentElement.style.setProperty('--mouse-x', `${e.clientX}px`);๐ฆ ์ํธ์ ๋ํ ์ผ:
"์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ค์ ๊ฐ์ CSS์ ๋ฐ๋ก ๋ฐ์ํ๊ณ ์ถ์ ๋ ์ ์ฉํ์ฃ . CSS์ ์ ์ธ์ ์ธ ํน์ฑ๊ณผ JS์ ๋์ ์ธ ํน์ฑ์ ์ฐ๊ฒฐํ๋ ํผํผํ ๋ค๋ฆฌ์ ๋๋ค."
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. CSS ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ด๋ฆ ์์ ๋ฐ๋์ ๋ถ์ฌ์ผ ํ๋ ๊ธฐํธ๋ ๋ฌด์์ธ๊ฐ์?
โ
์ ๋ต: -- (์ด์ค ํ์ดํ)
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ: CSS ํ์ค ๋ช
์ธ์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ ์ ์์ฑ(Custom Properties)์ ๋ฐ๋์
--๋ก ์์ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ์กด์ ํ์ค CSS ์์ฑ๊ณผ ๋ช ํํ ๊ตฌ๋ถ๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋ฌ๋ฌ($) ๊ธฐํธ๋ SASS ์ ์ฉ์ด์์! ๋ธ๋ผ์ฐ์ ๊ฐ ์์๋ฃ๊ฒ ํ๋ ค๋ฉด ํ์ดํ ๋ ๊ฐ๋ฅผ ๊ผญ ๊ธฐ์ตํ์ธ์."
Q2. CSS ๋ณ์๊ฐ SASS ๋ณ์๋ณด๋ค ๋ฐ์ด๋ ๊ฒฐ์ ์ ์ธ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์?
- ์ปดํ์ผ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ๋ฐํ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ 100% ์ง์๋๋ค.
- ๋ ๋ณต์กํ ์ํ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
โ
์ ๋ต: 2. ๋ธ๋ผ์ฐ์ ์์ ๋ฐํ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ: SASS ๋ณ์๋ ๋น๋ ์์ ์ ์ ์ ์ธ ๊ฐ์ผ๋ก ์นํ๋์ง๋ง, CSS ๋ณ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ฑ์ ํตํด ์ค์๊ฐ์ผ๋ก ๊ฐ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋์ ์ผ๋ก ๋ณํ๋ ๋คํฌ ๋ชจ๋๋ ํ ๋ง ์์คํ ์ ๋ง๋ค ๋ CSS ๋ณ์๊ฐ ์๋์ ์ผ๋ก ์ ๋ฆฌํ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฑฐ์์!"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ๋ฒํผ ํ๋์๋ง ๋ค๋ฅธ ์์์ ์ ์ฉํ๋ ค๊ณ .btn--orange { --color: orange; }๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฒํผ ์์ ํ
์คํธ ์์์ด ๋ฐ๋์ง ์๋ค์. ํ์ธํด๋ณด๋ ํ
์คํธ ์์์ var(--text-color)๋ฅผ ์ฐ๊ณ ์์์ต๋๋ค. ์์ฒ ์ด๊ฐ ์ด ๋ฒํผ ์์ ํ
์คํธ๋ง ์ฃผํฉ์์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๊ฐ์ฅ ์ฐ์ํ๊ฒ ํ ์ ์๋ ํ๋์?
โ
์ ๋ต: .btn--orange ์์์ --text-color ๋ณ์๊ฐ์ orange๋ก ์ฌ์ ์ํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ๋ณ์๋ ํ์ ์์๋ก ์์๋ฉ๋๋ค. ์ปดํฌ๋ํธ ๋ ๋ฒจ์์ ๋ณ์๊ฐ์ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด, ํด๋น ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ชจ๋ ์์๋ค์ด ๊ทธ ์๋ก์ด ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ ์๋๋ผ ๊ธฐ์กด ์ ์๋ '์์คํ ๋ณ์'๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ ๋์์ธ ์์คํ ์ ์ ์์ ๋๋ค."
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋ณ์๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์์คํ ์ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ ๋ณ์๋ฅผ ๋ฐฐ์ฐ๊ณ ๋๋, ๊ทธ๋์ ๋ด๊ฐ ์ง ์ฝ๋๊ฐ ์ผ๋ง๋ ๊ฒฝ์ง๋์ด ์์๋์ง ์๊ฒ ๋๋ค.
์์ ์ฝ๋ ํ๋ ๋ฐ๊พธ๋ ค๊ณ Ctrl+F๋ก ํ๋ก์ ํธ ์ ์ฒด๋ฅผ ๋ค์ง๋ ๋ฐฉ์์ด ์ ์ํํ์ง ์ด์ ๋ ์ค๋ช
ํ ์ ์๋ค.
๋ธ๋๋ ์ปฌ๋ฌ๊ฐ ๋ฐ๋์ด๋ ํ ํฐ ๊ฐ ํ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๊ด๋ จ ์ปดํฌ๋ํธ๊ฐ ํจ๊ป ๋ฐ๋ผ์ค๊ฒ ๋ง๋๋ ๊ฒ์ด ์ง์ง ๋์์ธ ์์คํ
์ ์์์ด์๋ค.
๐ก "ํ๋์ฝ๋ฉ์ ๋ถ์ฑ์ด๊ณ , ๋ณ์๋ ํฌ์๋ค. ๋์ค์ ๊ณ ํต๋ฐ์ง ์์ผ๋ ค๋ฉด ์ฒ์๋ถํฐ ์ด๋ฆ์ ๋ถ์ฌ๋ผ."
ํด๊ทผ๊ธธ์ ์ค๋ ๋ง๋ ๋คํฌ ๋ชจ๋ ์ค์์น๋ฅผ ๊ณ์ ๋๋ฌ๋ดค๋ค.
์ฝ๋ ๋ช ์ค๋ก ํ๋ฉด ์ ์ฒด์ ๋ถ์๊ธฐ๊ฐ ์ผ๊ด๋๊ฒ ๋ฐ๋๋ ๊ฒ ์ธ์์ ์ด์๋ค.
๋ค์ PR๋ถํฐ๋ #3b82f6 ๊ฐ์ ๊ฐ์ด ์ปดํฌ๋ํธ ์์ ์ง์ ๋ค์ด์ค๋ฉด "์ด ์์ ์ด๋ค ํ ํฐ์ด์ด์ผ ํ์ง?"๋ผ๊ณ ๋จผ์ ๋ฌผ์ด๋ณผ ์๊ฐ์ด๋ค.
๋ด์ผ CSS ์ํคํ
์ฒ๋ฅผ ๋ณผ ๋๋ ํด๋์ค ์ด๋ฆ๋ณด๋ค ๋จผ์ ํ์ด ๊ณต์ ํ ์ ์๋ ๊ท์น๊ณผ ๋ณ๊ฒฝ ๋น์ฉ์ ์๊ฐํด๋ด์ผ๊ฒ ๋ค.