๐จ 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; /* ์ด ์นด๋ ์์์๋ง ํ๋์์ด ์ฃผํฉ์์ผ๋ก! */
}
/* 3. ์ฌ์ฉ */
.btn {
background-color: var(--primary-color);
}๐ฆ ์ํธ์ ํต์ฌ ๋ ์จ:
"๋ณ์๋ ์์๋ฉ๋๋ค! ๋ถ๋ชจ ์์์์ ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ์์ ์์๋ค์ด ์ผ์ ํ ๊ทธ ๋ฐ๋ ๊ฐ์ ์ฐ๊ฒ ๋์ฃ . ์ด๊ฒ ๋ฐ๋ก ํ ๋ง ์ ํ์ ํต์ฌ ์๋ฆฌ์ ๋๋ค."
๐ 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 ๋ณ์๊ฐ ์๋์ ์ผ๋ก ์ ๋ฆฌํ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฑฐ์์!"
Q2. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ๋ฒํผ ํ๋์๋ง ๋ค๋ฅธ ์์์ ์ ์ฉํ๋ ค๊ณ .btn--orange { --color: orange; }๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฒํผ ์์ ํ
์คํธ ์์์ด ๋ฐ๋์ง ์๋ค์. ํ์ธํด๋ณด๋ ํ
์คํธ ์์์ var(--text-color)๋ฅผ ์ฐ๊ณ ์์์ต๋๋ค. ์์ฒ ์ด๊ฐ ์ด ๋ฒํผ ์์ ํ
์คํธ๋ง ์ฃผํฉ์์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๊ฐ์ฅ ์ฐ์ํ๊ฒ ํ ์ ์๋ ํ๋์?
โ
์ ๋ต: .btn--orange ์์์ --text-color ๋ณ์๊ฐ์ orange๋ก ์ฌ์ ์ํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ๋ณ์๋ ํ์ ์์๋ก ์์๋ฉ๋๋ค. ์ปดํฌ๋ํธ ๋ ๋ฒจ์์ ๋ณ์๊ฐ์ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด, ํด๋น ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ชจ๋ ์์๋ค์ด ๊ทธ ์๋ก์ด ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ ์๋๋ผ ๊ธฐ์กด ์ ์๋ '์์คํ ๋ณ์'๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ ๋์์ธ ์์คํ ์ ์ ์์ ๋๋ค."
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋ณ์๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์์คํ ์ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ ๋ณ์๋ฅผ ๋ฐฐ์ฐ๊ณ ๋๋, ๊ทธ๋์ ๋ด๊ฐ ์ง ์ฝ๋๊ฐ ์ผ๋ง๋ ๊ฒฝ์ง๋์ด ์์๋์ง ์๊ฒ ๋๋ค.
์์ ์ฝ๋ ํ๋ ๋ฐ๊พธ๋ ค๊ณ Ctrl+F๋ฅผ ๋๋ฅด๋ ๋ด ๋ชจ์ต์ด ๋ง์น ์์์ธ ๊ฐ์๋ค.
์ด์ ๋ธ๋๋ ์ปฌ๋ฌ๊ฐ ๋ฐ๋์ด๋ ์ปคํผ ํ ์ ๋ง์๋ฉด์ 1์ด ๋ง์ ์์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๐ก "ํ๋์ฝ๋ฉ์ ๋ถ์ฑ์ด๊ณ , ๋ณ์๋ ํฌ์๋ค. ๋์ค์ ๊ณ ํต๋ฐ์ง ์์ผ๋ ค๋ฉด ์ฒ์๋ถํฐ ์ด๋ฆ์ ๋ถ์ฌ๋ผ."
ํด๊ทผ๊ธธ์ ์ค๋ ๋ง๋ ๋คํฌ ๋ชจ๋ ์ค์์น๋ฅผ ๊ณ์ ๋๋ฌ๋ดค๋ค.
์ฝ๋ ๋ช ์ค๋ก ํ๋ฉด ์ ์ฒด์ ๋ถ์๊ธฐ๊ฐ ์ฅ ๋ฐ๋๋ ๊ฒ ๋๋ฌด ์ง๋ฆฟํ๋ค.
์์ ๋์ด "๋ฒ์จ ๋ค ๋ฐ๊ฟจ์ด?"๋ผ๊ณ ๋๋ผ์ค ๋ "์ด๊ฒ ์๋์ด์ ์๋์ฃ "๋ผ๊ณ ํ์ธ๋ฅผ ์ข ๋ถ๋ ค๋ดค๋ค.
๋ด์ผ์ 'CSS ์ํคํ
์ฒ'๋ฅผ ๋ฐฐ์ด๋ค๋๋ฐ, ์ด์ ์ ๋ง ๊ฑฐ๋ํ ์์คํ
์ ๋ค๋ฃจ๋ ๋ฒ์ ๋ฐฐ์ด๋ค๋ ๋๋์ด ๋ ๋ค. ๐จ