CSS ์บ์ค์ผ์ด๋ ๋ ์ด์ด(@layer)์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ์ง๋ณด์ ๋ฐ ํ์ฅ์ด ์ฉ์ดํ ์น ํ๋ก์ ํธ๋ฅผ ์ํ CSS๋ฅผ ๊ตฌ์กฐํ, ์ ๋ฆฌ, ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
CSS @layer ๋ง์คํฐํ๊ธฐ: ์บ์ค์ผ์ด๋ ๋ ์ด์ด ์ข ํฉ ๊ฐ์ด๋
@layer
at-rule์ ์ฌ์ฉํ์ฌ ์ ์๋๋ CSS ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ CSS ๊ท์น์ด ์ ์ฉ๋๋ ์์๋ฅผ ์ ์ดํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด ์คํ์ผ์ ๋
ผ๋ฆฌ์ ๋ ์ด์ด๋ฅผ ์์ฑํ์ฌ ์บ์ค์ผ์ด๋์ ์ํฅ์ ์ฃผ๊ณ CSS ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ์คํ์ผ์ํธ์ ํ์
ํ์ด ์๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ํนํ ์ ์ฉํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ @layer
๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ๊ทธ ์ ์ฌ๋ ฅ์ ํ์ฉํ๋ ๋ฐ ๋์์ด ๋๋ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
CSS ์บ์ค์ผ์ด๋ ์ดํดํ๊ธฐ
์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์ CSS ์บ์ค์ผ์ด๋๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์บ์ค์ผ์ด๋๋ ์ฌ๋ฌ ๊ท์น์ด ๋์ผํ ์์๋ฅผ ๋์์ผ๋ก ํ ๋ ์ต์ข ์ ์ผ๋ก ์ด๋ค CSS ๊ท์น์ด ์์์ ์ ์ฉ๋ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์บ์ค์ผ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์์๋ฅผ ๊ณ ๋ คํฉ๋๋ค:
- ์ถ์ฒ์ ์ค์๋(Origin and Importance): ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ์คํ์ผ์ํธ ์คํ์ผ์ด ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ทธ ๋ค์์ด ์ฌ์ฉ์ ์คํ์ผ, ๊ทธ๋ฆฌ๊ณ ์น์ฌ์ดํธ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์คํ์ผ์ธ ์ ์์ ์คํ์ผ ์์
๋๋ค.
!important
๋ ์ถ์ฒ๋ฅผ ์ฌ์ ์ํ์ง๋ง, ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. - ๋ช
์๋(Specificity): CSS ์ ํ์๊ฐ ์ผ๋ง๋ ๊ตฌ์ฒด์ ์ธ์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋์
๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์๊ฐ ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์๋ณด๋ค ์ฐ์ ํฉ๋๋ค. ์:
id
์ ํ์๋class
์ ํ์๋ณด๋ค ๋ ๊ตฌ์ฒด์ ์ด๋ฉฐ,class
์ ํ์๋ ์์ ์ ํ์๋ณด๋ค ๋ ๊ตฌ์ฒด์ ์ ๋๋ค. - ์์ค ์์(Source Order): ์ถ์ฒ์ ๋ช
์๋๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์คํ์ผ์ํธ(๋๋
<style>
ํ๊ทธ๋ ์ธ๋ผ์ธ)์์ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ํ๋๋ ๊ท์น์ด ์ฐ์ ํฉ๋๋ค.
์บ์ค์ผ์ด๋ ๋ ์ด์ด ์์ด๋ ๋ณต์กํ ํ๋ก์ ํธ์์ ๋ช
์๋์ ์์ค ์์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ด๋ ค์์ ธ CSS ์ถฉ๋๊ณผ ์๊ธฐ์น ์์ ์คํ์ผ๋ง์ ์ ๋ฐํ ์ ์์ต๋๋ค. @layer
๋ ์บ์ค์ผ์ด๋์ ๋ํ ๋ ๋ค๋ฅธ ์ ์ด ์์ค์ ์ถ๊ฐํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
CSS @layer ์๊ฐ
@layer
at-rule์ ์ฌ์ฉํ๋ฉด ์ด๋ฆ์ด ์ง์ ๋ ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ์ด ๋ ์ด์ด๋ค์ ๋ณธ์ง์ ์ผ๋ก CSS ๊ท์น์ ์ํ ๋ณ๋์ ๋ฒํท์ ์์ฑํ๋ฉฐ, ์ด ๋ ์ด์ด๋ค์ด ์ ์ฉ๋๋ ์์๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
@layer layer-name;
ํ ๋ฒ์ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ์ ์ํ ์๋ ์์ต๋๋ค:
@layer base, components, utilities;
๋ ์ด์ด ์ ์ธ ๋ฐ ์ฑ์ฐ๊ธฐ
๋ ์ด์ด๋ฅผ ์ ์ธํ๊ณ ์ฑ์ฐ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
- ๋ช ์์ ์ ์ธ ๋ฐ ์ฑ์ฐ๊ธฐ: ๋จผ์ ๋ ์ด์ด๋ฅผ ์ ์ธํ ๋ค์, ๋์ค์ ์คํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
- ์์์ ์ ์ธ ๋ฐ ์ฑ์ฐ๊ธฐ: ๋ ์ด์ด๋ฅผ ์ ์ธํ๊ณ ์คํ์ผ์ ๋์์ ์ถ๊ฐํฉ๋๋ค.
๋ช ์์ ์ ์ธ ๋ฐ ์ฑ์ฐ๊ธฐ
๋จผ์ ๋ ์ด์ด๋ฅผ ์ ์ธํฉ๋๋ค:
@layer base;
๊ทธ๋ฐ ๋ค์, CSS ๊ท์น ๋ด์์ layer()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ผ์ ์ถ๊ฐํฉ๋๋ค:
@layer base {
body {
font-family: sans-serif;
line-height: 1.5;
margin: 0;
}
}
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ด์ฌ์ฌ์ ๋ช ํํ ๋ถ๋ฆฌ๋ฅผ ํ์ฉํ๊ณ CSS์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๊ฒ ํด์ค๋๋ค.
์์์ ์ ์ธ ๋ฐ ์ฑ์ฐ๊ธฐ
ํ ๋จ๊ณ๋ก ๋ ์ด์ด๋ฅผ ์ ์ธํ๊ณ ์ฑ์ธ ์๋ ์์ต๋๋ค:
@import "base.css" layer(base);
์ด๋ base.css
ํ์ผ์ ๊ฐ์ ธ์ ๊ทธ ์์ ๋ชจ๋ ์คํ์ผ์ base
๋ ์ด์ด์ ํ ๋นํฉ๋๋ค. ์ด๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ CSS ํ๋ ์์ํฌ์ ์์
ํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์คํ์ผ ๋ธ๋ก ๋ด์ ์ง์ ๋ ์ด์ด ์ด๋ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค:
@layer theme {
:root {
--primary-color: #007bff;
}
}
๋ ์ด์ด ์์์ ์บ์ค์ผ์ด๋
๋ ์ด์ด๋ฅผ ์ ์ธํ๋ ์์๊ฐ ์บ์ค์ผ์ด๋์์์ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ ์ผ์ฐ ์ ์ธ๋ ๋ ์ด์ด๋ ๋์ค์ ์ ์ธ๋ ๋ ์ด์ด๋ณด๋ค ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค. ์ฆ, ๋์ค์ ์ ์ธ๋ ๋ ์ด์ด์ ์คํ์ผ์ด ๋์ผํ ๋ช ์๋๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ์ด์ ์ ์ ์ธ๋ ๋ ์ด์ด์ ์คํ์ผ์ ์ฌ์ ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
@layer base, components, utilities;
@layer base {
body {
background-color: #f0f0f0;
}
}
@layer components {
.button {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
}
}
@layer utilities {
.mt-2 {
margin-top: 20px;
}
}
์ด ์์ ์์ utilities
๋ ์ด์ด๊ฐ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ทธ ๋ค์์ด components
, ๊ทธ๋ฆฌ๊ณ base
์์
๋๋ค. ๋ฐ๋ผ์ ๋ฒํผ ์์๊ฐ components
๋ ์ด์ด์ .button
ํด๋์ค์ utilities
๋ ์ด์ด์ .mt-2
ํด๋์ค๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ค๋ฉด, .button
ํด๋์ค๋ ์ฌ๋ฐฑ์ ์ ์ํ๋๋ผ๋ .mt-2
์ margin-top ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋์ค ๋ ์ด์ด์ ์คํ์ผ์ด ์ด์ ๋ ์ด์ด์ ์คํ์ผ์ ์ฌ์ ์ํฉ๋๋ค.
๋ ์ด์ด ์๋ ์คํ์ผ
@layer
๋ธ๋ก ๋ด์ ์์นํ์ง ์์ ์คํ์ผ์ ๋ชจ๋ ๊ฒ ์ค์์ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ ๋ ๊ธฐ์ตํด์ผ ํ ์ค์ํ ์ ์
๋๋ค. ์ด ์คํ์ผ๋ค์ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ ๋ ์ด์ด ์คํ์ผ ์์ ์์นํ๊ฒ ๋ฉ๋๋ค.
@layer base, components;
@layer base {
body {
font-family: sans-serif;
}
}
.my-style {
color: red; /* This will override any color set in the layers */
}
.my-style
ํด๋์ค๋ ์ด๋ค ๋ ์ด์ด์๋ ์ํด ์์ง ์๊ธฐ ๋๋ฌธ์ base
๋๋ components
๋ ์ด์ด์ ์ ์๋ ๋ชจ๋ color
์์ฑ์ ์ฌ์ ์ํฉ๋๋ค. ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ํผํ๊ธฐ ์ํด ์ด ๋์์ ์ ์ํ์ธ์.
๋ ์ด์ด ์์ ๋ณ๊ฒฝํ๊ธฐ
@layer
at-rule์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ์ฌ ๋ ์ด์ด์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ต์ข
์์๋ ๋ง์ง๋ง ์ ์ธ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
@layer base, components, utilities;
/* Later in the stylesheet */
@layer utilities, components, base;
์ด์ utilities
๋ ์ด์ด๊ฐ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ base
๊ฐ ๊ฐ์ฅ ๋์ต๋๋ค. ์ด ์์ ๋ณ๊ฒฝ์ ํน์ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ด๋ ๋ณํํ๋ ๋์์ธ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์บ์ค์ผ์ด๋๋ฅผ ์กฐ์ ํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ์ ์ฉํ ์ ์์ต๋๋ค.
`layer()` ํจ์๋ฅผ ์ฌ์ฉํ ๋ช ์๋ ์ ์ด
์ ํ์์์ layer()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ ์ด์ด๋ฅผ ํ๊ฒํ
ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ด์ด ๋ด ๊ท์น์ ๋ช
์๋๋ฅผ ๋์ฌ ์บ์ค์ผ์ด๋์์ ๋ ํฐ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค.
@layer theme {
:root {
--primary-color: #007bff;
}
}
@layer components {
.button {
background-color: var(--primary-color); /* Uses the theme's primary color */
color: white;
}
}
/* Increase specificity of the theme layer */
:root layer(theme) {
--primary-color: #dc3545; /* Override the primary color */
}
์ด ์์ ์์ .button
ํด๋์ค๊ฐ components
๋ ์ด์ด์ ์๋๋ผ๋, :root layer(theme)
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ --primary-color
๊ฐ ์ฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ด๋ theme
๋ ์ด์ด๋ฅผ ๋ช
์์ ์ผ๋ก ํ๊ฒํ
ํ๊ณ ํด๋น ๋ ์ด์ด ๋ด์์ ๊ท์น์ ๋ช
์๋๋ฅผ ๋์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฅผ ํตํด ํน์ ๋ ์ด์ด ๋ด์ ์คํ์ผ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
CSS @layer์ ์ค์ ์ฌ์ฉ ์ฌ๋ก
@layer
๋ CSS์ ์ ๋ฆฌ ๋ฐ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค:
- ๊ธฐ๋ณธ ์คํ์ผ: ๊ธ๊ผด ์ค์ , body ๋ฐฐ๊ฒฝ, ๊ธฐ๋ณธ ์์ ๋ฆฌ์ (์: Normalize.css์ ๊ฐ์ CSS ๋ฆฌ์ ์ฌ์ฉ)๊ณผ ๊ฐ์ ์ ์ญ ์คํ์ผ์ ์ํ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ ์ฒด ํ๋ก์ ํธ์ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.
- ํ ๋ง ์คํ์ผ: ํ ๋ง ๋ณ์ ๋ฐ ์คํ์ผ์ ์ํ ๋ ์ด์ด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ํต์ฌ ์ปดํฌ๋ํธ ์คํ์ผ์ ์์ ํ์ง ์๊ณ ๋ ๋ค๋ฅธ ํ ๋ง ๊ฐ์ ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค. ๋คํฌ ๋ชจ๋, ๋ธ๋๋ ๋ณํ ๋๋ ์ ๊ทผ์ฑ ์ ํธ๋์ ๋ํ ํ ๋ง๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ปดํฌ๋ํธ ์คํ์ผ: ์ปดํฌ๋ํธ๋ณ ์คํ์ผ(์: ๋ฒํผ, ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด, ํผ)์ ๋ ์ด์ด๋ฅผ ํ ๋นํฉ๋๋ค. ์ด๋ ๋ชจ๋์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํฉ๋๋ค.
- ๋ ์ด์์ ์คํ์ผ: ๊ทธ๋ฆฌ๋ ์์คํ ์ด๋ flexbox ๊ธฐ๋ฐ ๋ ์ด์์๊ณผ ๊ฐ์ ๋ ์ด์์ ๊ด๋ จ ์คํ์ผ์ ์ํ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ ์ด์์ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ปดํฌ๋ํธ๋ณ ์คํ์ผ๋ง๊ณผ ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Bootstrap, Materialize)์ ์คํ์ผ์ ๋ ์ด์ด๋ก ๊ฐ์๋๋ค. ์ด๋ ํด๋น ์คํ์ผ์ด ์๋์น ์๊ฒ ์์ฒด ์คํ์ผ์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ธ๋ถ ์ฝ๋๋ฅผ ์ํ ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ํธ๋ฆฌํฐ ํด๋์ค: ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์คํ์ผ๋ง ์ค๋ํซ์ ์ ๊ณตํ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค(์: margin, padding, display)๋ฅผ ์ํ ๋ ์ด์ด๋ฅผ ๊ตฌํํฉ๋๋ค. Tailwind CSS์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ๋ง์ด ํ์ฉํฉ๋๋ค.
- ์ฌ์ ์/ํต(Overrides/Hacks): ํน์ ๋ธ๋ผ์ฐ์ ๋ถ์ผ์น๋ฅผ ์์ ํ๊ฑฐ๋ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์ฌ์ ์๋ ํต์ ์ํ ๋ ์ด์ด๋ฅผ ๋ฐ๋ก ๋ก๋๋ค. ์ด๋ ์ด๋ฌํ ์ฌ์ ์๊ฐ ์ด๋์ ์์นํ๋์ง ๋ช ํํ๊ฒ ํ๊ณ ์ฝ๋๋ฒ ์ด์ค์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์ : CSS @layer๋ก ํ๋ก์ ํธ ๊ตฌ์กฐํํ๊ธฐ
๋ค์์ @layer
๋ฅผ ์ฌ์ฉํ์ฌ CSS ํ๋ก์ ํธ๋ฅผ ๊ตฌ์กฐํํ ์ ์๋ ๋ณด๋ค ์์ ํ ์์ ์
๋๋ค:
/* Order of layers (lowest to highest precedence) */
@layer reset, base, theme, components, utilities, overrides;
/* 1. Reset Layer */
@import "reset.css" layer(reset); /* Contains CSS reset styles */
/* 2. Base Layer */
@layer base {
body {
font-family: 'Arial', sans-serif;
line-height: 1.6;
color: #333;
}
a {
text-decoration: none;
color: #007bff;
}
}
/* 3. Theme Layer */
@layer theme {
:root {
--primary-color: #007bff;
--secondary-color: #6c757d;
--background-color: #fff;
--text-color: #333;
}
}
/* 4. Components Layer */
@layer components {
.button {
background-color: var(--primary-color);
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.card {
border: 1px solid #ccc;
padding: 20px;
margin-bottom: 20px;
}
}
/* 5. Utilities Layer */
@layer utilities {
.mt-2 {
margin-top: 20px;
}
.text-center {
text-align: center;
}
}
/* 6. Overrides Layer */
@layer overrides {
/* Specific overrides for certain browsers or components */
.button.special {
background-color: #dc3545 !important; /* Use sparingly! */
}
}
์ด ๊ตฌ์กฐ์์:
reset
: ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ์ผ์ ์ ๊ทํํ๊ธฐ ์ํ CSS ๋ฆฌ์ ์ ํฌํจํฉ๋๋ค.base
: body, ํค๋ฉ, ๋งํฌ์ ๊ฐ์ ์์์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ ์ํฉ๋๋ค.theme
: ํ ๋ง ๊ด๋ จ ๋ณ์(์์, ๊ธ๊ผด ๋ฑ)๋ฅผ ์ค์ ํฉ๋๋ค.components
: ํน์ UI ์ปดํฌ๋ํธ(๋ฒํผ, ์นด๋, ๋ด๋น๊ฒ์ด์ ๋ฑ)๋ฅผ ์คํ์ผ๋งํฉ๋๋ค.utilities
: ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.overrides
: ํน์ ์ฌ์ ์๋ ํต, ์ผ๋ฐ์ ์ผ๋ก!important
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํฅ์๋ ์ ๋ฆฌ: CSS๊ฐ ๋ ผ๋ฆฌ์ ๋ ์ด์ด๋ก ๋๋์ด ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ํ ๋ ์ด์ด์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ค๋ฅธ ๋ ์ด์ด์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ค์ด ์๋์น ์์ ๋ถ์์ฉ์ ์ํ์ด ๊ฐ์ํฉ๋๋ค.
- ๊ฐ์ํ๋ ํ
๋ง ์ ์ฉ:
theme
๋ ์ด์ด์ ๋ณ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ํ ๋ง๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - ๋ช ์๋ ์ถฉ๋ ๊ฐ์: ๋ ์ด์ด๋ ์บ์ค์ผ์ด๋๋ฅผ ์ ์ดํ๊ณ ๋ช ์๋ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ช ํํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
CSS @layer ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
CSS @layer
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋ ์ด์ด ๊ตฌ์กฐ ๊ณํํ๊ธฐ: ์ฝ๋ฉ์ ์์ํ๊ธฐ ์ ์ ํ์ํ ๋ ์ด์ด์ ๊ทธ ์์๋ฅผ ์ ์คํ๊ฒ ๊ณํํ์ธ์. ์ ์ ์๋ ๋ ์ด์ด ๊ตฌ์กฐ๋ ์ฅ๊ธฐ์ ์ธ ์ ์ง๋ณด์์ฑ์ ํ์์ ์ ๋๋ค.
- ์๋ฏธ ์๋ ๋ ์ด์ด ์ด๋ฆ ์ฌ์ฉํ๊ธฐ: ๊ฐ ๋ ์ด์ด์ ๋ชฉ์ ์ ๋ช
ํํ๊ฒ ๋ํ๋ด๋ ์ค๋ช
์ ์ธ ๋ ์ด์ด ์ด๋ฆ(์:
base
,components
,theme
)์ ์ ํํ์ธ์. - ๋ ์ด์ด์ ์ด์ ์ ์งํ๊ธฐ: ๊ฐ ๋ ์ด์ด๋ ํน์ ๋ชฉ์ ์ ๊ฐ์ ธ์ผ ํ๋ฉฐ ํด๋น ๋ชฉ์ ๊ณผ ๊ด๋ จ๋ ์คํ์ผ๋ง ํฌํจํด์ผ ํฉ๋๋ค.
- ์ค๋ณต ์คํ์ผ ํผํ๊ธฐ: ๋ ์ด์ด ๊ฐ์ ์ค๋ณต ์คํ์ผ ์์ ์ต์ํํ์ธ์. ๋ชฉํ๋ ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค๊ณ ์๋์น ์์ ๋ถ์์ฉ์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋๋ค.
!important
๋๋ฌผ๊ฒ ์ฌ์ฉํ๊ธฐ:!important
๋overrides
๋ ์ด์ด์์ ์ ์ฉํ ์ ์์ง๋ง, CSS ์ ์ง๋ณด์๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ค์ง ์๋๋ก ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.- ๋ ์ด์ด ๊ตฌ์กฐ ๋ฌธ์ํํ๊ธฐ: ํ๋ก์ ํธ์ README๋ CSS ๋ฌธ์์ ๋ ์ด์ด ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด CSS๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง ์ดํดํ๊ณ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- ์ฒ ์ ํ ํ ์คํธํ๊ธฐ: ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ฅผ ๊ตฌํํ ํ์๋ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์คํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋์ง ํ์ธํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์บ์ค์ผ์ด๋๋ฅผ ๊ฒ์ฌํ๊ณ ์๊ธฐ์น ์์ ๋์์ ์๋ณํ์ธ์.
๋ธ๋ผ์ฐ์ ์ง์
2023๋
ํ๋ฐ ๊ธฐ์ค์ผ๋ก CSS ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ Chrome, Firefox, Safari, Edge๋ฅผ ํฌํจํ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ํ์ง๋ง ํ๋ก๋์
ํ๊ฒฝ์์ @layer
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์๋ ํญ์ Can I use...์ ๊ฐ์ ์น์ฌ์ดํธ์์ ์ต์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ํ ์ผ๋ถ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์ด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์์ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ์ธ์.
๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋์ํ๊ธฐ
@layer
๋ฅผ ์ง์ํ์ง ์๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค:
@layer
๋ฌด์ํ๊ธฐ: ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์@layer
at-rule์ ๋ฌด์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์ผ์ด ๋ ์ด์ด๋ง ์์ด ์คํ์ผ์ํธ์ ๋ํ๋๋ ์์๋๋ก ์ ์ฉ๋ฉ๋๋ค. ์ด๋ก ์ธํด ์คํ์ผ๋ง์ ์ผ๋ถ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ง๋ง, ๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์ํ ํ์ฉ ๊ฐ๋ฅํ ์ ์ถฉ์์ด ๋ ์ ์์ต๋๋ค.- ํด๋ฆฌํ(Polyfill) ์ฌ์ฉํ๊ธฐ: ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์บ์ค์ผ์ด๋ ๋ ์ด์ด์ ๋์์ ๋ชจ๋ฐฉํ๋ ค๋ ์ผ๋ถ ํด๋ฆฌํ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํด๋ฆฌํ์ ์ข
์ข
๋ณต์กํ๋ฉฐ ๋ค์ดํฐ๋ธ
@layer
์ ๋์์ ์๋ฒฝํ๊ฒ ์ฌํํ์ง ๋ชปํ ์ ์์ต๋๋ค.
์ต์์ ์ ๊ทผ ๋ฐฉ์์ ํน์ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ๊ณผ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ์ ๊ณตํด์ผ ํ๋ ์ง์ ์์ค์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด @supports
๋ฅผ ์ฌ์ฉํ์ฌ @layer
์ง์์ ๊ฐ์งํ๊ณ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ๋์ฒด ์คํ์ผ์ ์ ๊ณตํ๋ ๋ฐฉ์์ผ๋ก CSS๋ฅผ ์ ์ง์ ์ผ๋ก ํฅ์์ํค๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
CSS ์ํคํ ์ฒ์ ๋ฏธ๋
CSS @layer
๋ ๋ณต์กํ ์น ํ๋ก์ ํธ์ ์คํ์ผ๋ง์ ๋ํด ๋ณด๋ค ๊ตฌ์กฐํ๋๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ CSS ์ํคํ
์ฒ์ ์ค์ํ ๋ฐ์ ์ ๋ํ๋
๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ๊ณ์ํด์ ๊ฐ์ ๋จ์ ๋ฐ๋ผ @layer
๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. @layer
๋ฅผ ๋ฐ์๋ค์ด๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ํ
๋ง ์ ์ฉ์ด ์ฉ์ดํ CSS ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฒฐ๋ก
CSS ์บ์ค์ผ์ด๋ ๋ ์ด์ด๋ CSS๋ฅผ ์ ๋ฆฌํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ ์ด์ด ์ ์ธ, ์์ ์ง์ ๋ฐ ๋ช
์๋์ ๊ฐ๋
์ ์ดํดํจ์ผ๋ก์จ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์คํ์ผ์ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์์ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋๊ท๋ชจ ๊ธฐ์
์ ํ๋ฆฌ์ผ์ด์
์ ์์
ํ๋ , @layer
๋ ๋ ๋์ CSS๋ฅผ ์์ฑํ๊ณ ์ ๋ฐ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค. ์๊ฐ์ ๋ด์ด @layer
๋ฅผ ์คํํ๊ณ , ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ํ๋ฉฐ, ์ํฌํ๋ก์ฐ์ ํตํฉํด ๋ณด์ธ์. ๊ทธ ๋
ธ๋ ฅ์ ์ฅ๊ธฐ์ ์ผ๋ก ๋ถ๋ช
ํ ๋ณด์์ ๋ฐ์ ๊ฒ์
๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ๋ถํฐ ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋์๊น์ง, ์ด ๊ฐ์ด๋๋ @layer
์ ๋ชจ๋ ์ธก๋ฉด์ ๋ค๋ฃน๋๋ค. ๋ค์ ํ๋ก์ ํธ์์ ์ด๋ฌํ ๊ธฐ์ ์ ๊ตฌํํ์ฌ ์ ๋ฆฌ๋๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ์ธ์. ๋ชจ๋ ๋์ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ํ
์คํธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!