CSS @when ๊ท์น์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋์ ์ด๊ณ ๋ฐ์ํ์ธ ์น ๋์์ธ์ ๋ง๋ค์ด ๋ณด์ธ์. ์ปจํ ์ด๋ ์ฟผ๋ฆฌ, ์ฌ์ฉ์ ์ ์ ์ํ ๋ฐ ๊ธฐํ ๊ธฐ์ค์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
CSS @when ๊ท์น ๋ง์คํฐํ๊ธฐ: ๋์ ์น ๋์์ธ์ ์ํ ์กฐ๊ฑด๋ถ ์คํ์ผ ์ ์ฉ
CSS ์กฐ๊ฑด๋ถ ๊ท์น ๋ชจ๋ ๋ ๋ฒจ 5(CSS Conditional Rules Module Level 5) ๋ช
์ธ์ ์ผ๋ถ์ธ CSS @when ๊ท์น์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ธฐ์กด์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ด๋์ด ์ปจํ
์ด๋ ํฌ๊ธฐ, ์ฌ์ฉ์ ์ ์ ์์ฑ, ์ฌ์ง์ด ์์์ ์ํ์ ๊ธฐ๋ฐํ์ฌ ์คํ์ผ๋ง์ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์น ๋์์ธ์ ๋ฐ์์ฑ๊ณผ ์ ์์ฑ์ ํฌ๊ฒ ํฅ์์์ผ ๋ค์ํ ๊ธฐ๊ธฐ์ ์ปจํ
์คํธ์์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
@when ๊ท์น์ ๊ธฐ๋ณธ ์๋ฆฌ ์ดํดํ๊ธฐ
ํต์ฌ์ ์ผ๋ก @when ๊ท์น์ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๋ง CSS ์คํ์ผ ๋ธ๋ก์ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ if ๋ฌธ๊ณผ ์ ์ฌํฉ๋๋ค. ๊ตฌ๋ฌธ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
@when condition {
/* ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ ์ ์ฉํ CSS ๊ท์น */
}
condition์ ๋ค์์ ํฌํจํ ๋ค์ํ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์์ต๋๋ค:
- ์ปจํ ์ด๋ ์ฟผ๋ฆฌ: ๋ทฐํฌํธ๊ฐ ์๋ ํฌํจํ๋ ์์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์์๋ฅผ ์คํ์ผ๋งํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์ํ: ์ฌ์ฉ์ ์ํธ์์ฉ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ๋ฐ์ํฉ๋๋ค.
- CSS ๋ณ์: CSS ์ฌ์ฉ์ ์ ์ ์์ฑ์ ๊ฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
- ๋ฒ์ ์ฟผ๋ฆฌ: ๊ฐ์ด ํน์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํฉ๋๋ค.
@when์ ๊ฐ๋ ฅํจ์ ์ง์ ํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์คํ์ผ๋ง์ ์์ฑํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ๋ด์ ์คํ์ผ๋ง ๋ก์ง์ ์บก์ํํ๊ณ , ์ฃผ๋ณ ํ์ด์ง ๋ ์ด์์๊ณผ ์๊ด์์ด ํด๋น ์ปดํฌ๋ํธ๊ฐ ํน์ ๊ธฐ์ค์ ์ถฉ์กฑํ ๋๋ง ์คํ์ผ์ด ์ ์ฉ๋๋๋ก ํ ์ ์์ต๋๋ค.
@when๊ณผ ํจ๊ป ์ปจํ
์ด๋ ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
์ปจํ
์ด๋ ์ฟผ๋ฆฌ๋ ๋ฐ์ํ ๋์์ธ์ ํ๋๋ฅผ ๋ฐ๊พธ๋ ๊ธฐ์ ์
๋๋ค. ์ด๋ฅผ ํตํด ์์๋ ๋ทฐํฌํธ ๋๋น๋ฟ๋ง ์๋๋ผ ๋ถ๋ชจ ์ปจํ
์ด๋์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ข์ ์ฌ์ด๋๋ฐ์ ๋ฐฐ์น๋ ๋์ ๋์ ๋ฉ์ธ ์ฝํ
์ธ ์์ญ์ ๋ฐฐ์น๋ ๋ ๋ค๋ฅด๊ฒ ํ์๋๋ ์นด๋ ์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ณด์ธ์. @when ๊ท์น์ ์ด๋ฅผ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๋ง๋ญ๋๋ค.
๊ธฐ๋ณธ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์์
๋จผ์ , ์ปจํ
์ด๋๋ฅผ ์ ์ธํด์ผ ํฉ๋๋ค. ์ด๋ container-type ์์ฑ์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค:
.container {
container-type: inline-size;
}
inline-size๋ ์ปจํ
์ด๋๊ฐ ์ธ๋ผ์ธ ํฌ๊ธฐ(๊ฐ๋ก ์ฐ๊ธฐ ๋ชจ๋์์๋ ๋๋น, ์ธ๋ก ์ฐ๊ธฐ ๋ชจ๋์์๋ ๋์ด)์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ ์ ์๋๋ก ํฉ๋๋ค. ๋ ์ฐจ์ ๋ชจ๋๋ฅผ ์ฟผ๋ฆฌํ๋ ค๋ฉด size๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ฟผ๋ฆฌ ์ปจํ
์ด๋๋ฅผ ์์ฑํ์ง ์์ผ๋ ค๋ฉด normal์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ด์ @container(์ข
์ข
@when๊ณผ ํจ๊ป ์ฌ์ฉ๋จ)๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค:
@container (min-width: 300px) {
.card {
flex-direction: row;
align-items: center;
}
.card__image {
width: 100px;
height: 100px;
}
}
@container (max-width: 299px) {
.card {
flex-direction: column;
align-items: flex-start;
}
.card__image {
width: 100%;
height: auto;
}
}
์ด ์์ ์์ .card์ ๋ ์ด์์์ ์ปจํ
์ด๋์ ๋๋น์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ปจํ
์ด๋์ ๋๋น๊ฐ 300px ์ด์์ผ ๋ ์นด๋๋ ์ด๋ฏธ์ง์ ํ
์คํธ๋ฅผ ๋๋ํ ํ์ํฉ๋๋ค. ๋ ์ข์ ๋๋ ์์ง์ผ๋ก ์์
๋๋ค.
@when์ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ์ฝ๋ฉ ์ ํธ๋์ ๋ฐ๋ผ @container์ ๊ฒฐํฉ๋ ์ ์์ต๋๋ค(@when์ ์ปจํ
์ด๋ ํฌ๊ธฐ ์ด์ธ์ ์๋๋ฆฌ์ค์์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค):
@container card-container (min-width: 300px) {
@when container(card-container) {
.card {
flex-direction: row;
align-items: center;
}
.card__image {
width: 100px;
height: 100px;
}
}
}
@container card-container (max-width: 299px) {
@when container(card-container) {
.card {
flex-direction: column;
align-items: flex-start;
}
.card__image {
width: 100%;
height: auto;
}
}
}
์ด ๊ฒฝ์ฐ, `card-container`๋ `@container`๋ก ํ ๋น๋ ์ปจํ ์ด๋ ์ด๋ฆ์ด๋ฉฐ, `@when`์ `container(card-container)`๋ ์ง์ ๋ ์ปจํ ์ด๋ ์ปจํ ์คํธ๊ฐ ํ์ฑ ์ํ์ธ์ง ํ์ธํฉ๋๋ค. ์ฐธ๊ณ : `container()` ํจ์ ๋ฐ ์ ํํ ๊ตฌ๋ฌธ์ ๋ํ ์ง์์ ๋ธ๋ผ์ฐ์ ๋ฐ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ตฌํํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ค์ฉ์ ์ธ ๊ตญ์ ์ ์์
- ์ ์์๊ฑฐ๋ ์ํ ๋ชฉ๋ก: ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง ๊ทธ๋ฆฌ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ๋ฐ๋ผ ์ํ ๋ชฉ๋ก์ ๋ค๋ฅด๊ฒ ํ์ํฉ๋๋ค. ์์ ์ปจํ ์ด๋๋ ์ํ ์ด๋ฏธ์ง์ ๊ฐ๊ฒฉ๋ง ํ์ํ ์ ์์ง๋ง, ํฐ ์ปจํ ์ด๋๋ ๊ฐ๋จํ ์ค๋ช ๊ณผ ํ์ ์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ์ธํฐ๋ท ์๋์ ๊ธฐ๊ธฐ ์ ํ์ ๊ฐ์ง ์ฌ๋ฌ ์ง์ญ์์ ์ ์ฉํ๋ฉฐ, ๊ฐ๋ฐ๋์๊ตญ์ ์ ๋์ญํญ ๋ชจ๋ฐ์ผ ์ฐ๊ฒฐ๊ณผ ๊ณ ์ฌ์ ๋ฐ์คํฌํฑ ๋ชจ๋์์ ์ต์ ํ๋ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ด์ค ๊ธฐ์ฌ ์์ฝ: ๋ด์ค ์น์ฌ์ดํธ ํํ์ด์ง์ ํ์๋๋ ๊ธฐ์ฌ ์์ฝ์ ๊ธธ์ด๋ฅผ ์ปจํ ์ด๋์ ๋๋น์ ๋ฐ๋ผ ์กฐ์ ํฉ๋๋ค. ์ข์ ์ฌ์ด๋๋ฐ์์๋ ์ ๋ชฉ๊ณผ ๋ช ๋จ์ด๋ง ํ์ํ๊ณ , ๋ฉ์ธ ์ฝํ ์ธ ์์ญ์์๋ ๋ ์์ธํ ์์ฝ์ ์ ๊ณตํฉ๋๋ค. ์ผ๋ถ ์ธ์ด(์: ๋ ์ผ์ด)๋ ๋จ์ด์ ๊ตฌ๋ฌธ์ด ๋ ๊ธด ๊ฒฝํฅ์ด ์์ด ์์ฝ์ ํ์ํ ๊ณต๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ ์ธ์ด์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋์๋ณด๋ ์์ ฏ: ์ปจํ ์ด๋ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋์๋ณด๋ ์์ ฏ์ ๋ ์ด์์์ ์์ ํฉ๋๋ค. ์์ ์์ ฏ์ ๊ฐ๋จํ ์ฐจํธ๋ฅผ ํ์ํ ์ ์์ง๋ง, ํฐ ์์ ฏ์ ์์ธํ ํต๊ณ์ ์ปจํธ๋กค์ ํฌํจํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์๊ฐํ์ ๋ํ ๋ฌธํ์ ์ ํธ๋๋ฅผ ๊ณ ๋ คํ์ฌ ํน์ ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ํ๋ฉด ํฌ๊ธฐ์ ๋ง๊ฒ ๋์๋ณด๋ ๊ฒฝํ์ ์กฐ์ ํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ฌธํ๊ถ์์๋ ํ์ด ์ฐจํธ๋ณด๋ค ๋ง๋ ์ฐจํธ๋ฅผ ์ ํธํ ์ ์์ต๋๋ค.
@when๊ณผ ์ฌ์ฉ์ ์ ์ ์ํ ํจ๊ป ์ฌ์ฉํ๊ธฐ
์ฌ์ฉ์ ์ ์ ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ๋ํ ๊ณ ์ ํ ์ํ๋ฅผ ์ ์ํ๊ณ ํด๋น ์ํ์ ๋ฐ๋ผ ์คํ์ผ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ :hover ๋ฐ :active์ ๊ฐ์ ๊ธฐ์กด CSS ๊ฐ์ ํด๋์ค๋ก๋ ์ถฉ๋ถํ์ง ์์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ํนํ ์ ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์ํ๋ ์์ง ๋ธ๋ผ์ฐ์ ๊ตฌํ์์ ๋ฐ์ ์ค์ด์ง๋ง, @when ๊ท์น์ ์ง์์ด ์ฑ์ํด์ง๋ฉด ์ด๋ฌํ ์ํ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ดํ ์ ์๋ ์ ๋งํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋ ์ ์์ (CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์๋ฎฌ๋ ์ด์ )
๋ค์ดํฐ๋ธ ์ฌ์ฉ์ ์ ์ ์ํ ์ง์์ด ์์ง ๋ณดํธํ๋์ง ์์๊ธฐ ๋๋ฌธ์ CSS ๋ณ์์ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
/* CSS */
.my-element {
--is-active: 0;
background-color: #eee;
}
@when var(--is-active) = 1 {
.my-element {
background-color: #aaf;
}
}
/* JavaScript */
const element = document.querySelector('.my-element');
element.addEventListener('click', () => {
element.style.setProperty('--is-active', element.style.getPropertyValue('--is-active') === '0' ? '1' : '0');
});
์ด ์์ ์์๋ CSS ๋ณ์ --is-active๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค. JavaScript ์ฝ๋๋ ์์๊ฐ ํด๋ฆญ๋ ๋ ์ด ๋ณ์์ ๊ฐ์ ํ ๊ธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ @when ๊ท์น์ --is-active๊ฐ 1์ผ ๋ ๋ค๋ฅธ ๋ฐฐ๊ฒฝ์์ ์ ์ฉํฉ๋๋ค. ์ด๊ฒ์ ์์๋ฐฉํธ์ด์ง๋ง, ์ํ์ ๋ฐ๋ฅธ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ๊ฐ๋
์ ๋ณด์ฌ์ค๋๋ค.
์ง์ ํ ์ฌ์ฉ์ ์ ์ ์ํ์ ์ ์ฌ์ ์ธ ๋ฏธ๋ ์ฌ์ฉ ์ฌ๋ก
์ง์ ํ ์ฌ์ฉ์ ์ ์ ์ํ๊ฐ ๊ตฌํ๋๋ฉด ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค (์ฐธ๊ณ : ์ด๊ฒ์ ์ถ์ธก์ด๋ฉฐ ์ ์์ ๊ธฐ๋ฐํฉ๋๋ค):
.my-element {
/* ์ด๊ธฐ ์คํ์ผ */
}
@when :state(my-custom-state) {
.my-element {
/* ์ฌ์ฉ์ ์ ์ ์ํ๊ฐ ํ์ฑ์ผ ๋์ ์คํ์ผ */
}
}
๊ทธ๋ฐ ๋ค์ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ์ํ๋ฅผ ์ค์ ํ๊ณ ํด์ ํฉ๋๋ค:
element.states.add('my-custom-state'); // ์ํ ํ์ฑํ
element.states.remove('my-custom-state'); // ์ํ ๋นํ์ฑํ
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๊ธฐ๋ฐํ ๋งค์ฐ ์ธ๋ฐํ ์คํ์ผ๋ง ์ ์ด๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
๊ตญ์ ํ ๋ฐ ํ์งํ ๊ณ ๋ ค ์ฌํญ
- ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ์ธ์ด(RTL): ์ฌ์ฉ์ ์ ์ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ด ๋ฐ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ RTL ์ธ์ด์ ๋ง๊ฒ ์ปดํฌ๋ํธ์ ๋ ์ด์์๊ณผ ์คํ์ผ๋ง์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ RTL ์ํ๊ฐ ํ์ฑ์ผ ๋ ํ์ ๋ฉ๋ด์ ๋ ์ด์์์ ๋ฏธ๋ฌ๋งํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ์ฌ์ฉ์ ์ ์ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ์ปค์ค๋ ์์๋ฅผ ๊ฐ์กฐ ํ์ํ๊ฑฐ๋ ์ฌ์ฉ์ ์ํธ์์ฉ ์ํ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋ ๋์ฒด ํ ์คํธ ์ค๋ช ์ ์ ๊ณตํ๋ ๋ฑ ํฅ์๋ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ์ด ๋ณด์กฐ ๊ธฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌ๋๋๋ก ํ์ญ์์ค.
- ๋ฌธํ์ ๋์์ธ ์ ํธ๋: ๋ฌธํ์ ๋์์ธ ์ ํธ๋์ ๋ฐ๋ผ ์ปดํฌ๋ํธ์ ์๊ฐ์ ๋ชจ์์ ์กฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ๋ก์ผ์ผ์ด๋ ์ธ์ด์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ ๊ตฌ์ฑํ๋ ์์ด์ฝ ์ธํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CSS ๋ณ์ ๋ฐ ๋ฒ์ ์ฟผ๋ฆฌ ์์
@when ๊ท์น์ CSS ๋ณ์์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋์ ์ด๊ณ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์คํ์ผ์ ๋ง๋ค ์๋ ์์ต๋๋ค. CSS ๋ณ์ ๊ฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์น์ฌ์ดํธ์ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
์์ : ํ ๋ง ์ ํ
:root {
--theme-color: #fff;
--text-color: #000;
}
body {
background-color: var(--theme-color);
color: var(--text-color);
}
@when var(--theme-color) = #000 {
body {
--text-color: #fff;
}
}
์ด ์์ ์์ --theme-color ๋ณ์๋ ๋ณธ๋ฌธ์ ๋ฐฐ๊ฒฝ์์ ์ ์ดํฉ๋๋ค. ์ด ๊ฐ์ด #000์ผ๋ก ์ค์ ๋๋ฉด @when ๊ท์น์ด --text-color๋ฅผ #fff๋ก ๋ณ๊ฒฝํ์ฌ ์ด๋์ด ํ
๋ง๋ฅผ ๋ง๋ญ๋๋ค. ์ฌ์ฉ์๋ JavaScript๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉ์ ์คํ์ผ์ํธ์์ ๋ค๋ฅธ CSS ๋ณ์๋ฅผ ์ค์ ํ์ฌ --theme-color์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ฒ์ ์ฟผ๋ฆฌ
๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ํน์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๋ ๋ณต์กํ ์กฐ๊ฑด๋ถ ์คํ์ผ์ ๋ง๋๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
@when (400px <= width <= 800px) {
.element {
/* ๋๋น๊ฐ 400px๊ณผ 800px ์ฌ์ด์ผ ๋ ์ ์ฉ๋๋ ์คํ์ผ */
}
}
๊ทธ๋ฌ๋ @when ๋ด์์์ ๋ฒ์ ์ฟผ๋ฆฌ์ ๋ํ ์ ํํ ๊ตฌ๋ฌธ ๋ฐ ์ง์์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ต์ ๋ช
์ธ ๋ฐ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ปจํ
์ด๋ ์ฟผ๋ฆฌ๋ ์ข
์ข
ํฌ๊ธฐ ๊ธฐ๋ฐ ์กฐ๊ฑด์ ๋ํด ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ง์๋๋ ๋์์ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ ๋ฐ ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ค์
- ๊ณ ๋๋น ํ
๋ง: CSS ๋ณ์์
@when๊ท์น์ ์ฌ์ฉํ์ฌ ์๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ๋๋น ํ ๋ง๋ฅผ ๊ตฌํํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์์ ํ๋ ํธ์ ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. - ์์ง์ ์ค์ด๊ธฐ: ์ฌ์ฉ์๊ฐ ์ด์ ์ฒด์ ์์ "์์ง์ ์ค์ด๊ธฐ" ์ค์ ์ ํ์ฑํํ์ ๋ CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋๋ฉ์ด์
๊ณผ ์ ํ์ ๋นํ์ฑํํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์ ํธ๋๋ฅผ ์กด์คํฉ๋๋ค.
prefers-reduced-motion๋ฏธ๋์ด ์ฟผ๋ฆฌ๋@when๊ณผ ๊ฒฐํฉํ์ฌ ๋ ์ ๋ฐํ ์ ์ด๋ฅผ ํ ์ ์์ต๋๋ค. - ๊ธ๊ผด ํฌ๊ธฐ ์กฐ์ : ์ฌ์ฉ์๊ฐ CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์ ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
@when๊ท์น์ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ธ๊ผด ํฌ๊ธฐ์ ๋ง๊ฒ ์์์ ๋ ์ด์์๊ณผ ๊ฐ๊ฒฉ์ ์กฐ์ ํ์ฌ ๋ชจ๋ ์ฌ์ฉ์์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฉ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ:
@when๊ท์น์ ์์ง ๋น๊ต์ ์๋กญ๊ณ ๋ธ๋ผ์ฐ์ ์ง์์ด ๋ณดํธ์ ์ด์ง ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ๋ฅผ ํ์ธํ์ญ์์ค. ์ด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด ํด๋ฆฌํ์ด๋ ๋์ฒด ์๋ฃจ์ ์ ๊ณ ๋ คํ์ญ์์ค. 2024๋ ํ๋ฐ ๊ธฐ์ค์ผ๋ก ๋ธ๋ผ์ฐ์ ์ง์์ ์ฌ์ ํ ์ ํ์ ์ด๋ฏ๋ก,@container์ ํฌ๊ฒ ์์กดํ๊ณ JavaScript ๋์ฒด(fallback)์ ํจ๊ป CSS ๋ณ์๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ๋ ์ค์ฉ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. - ๋ช
์๋(Specificity):
@when๊ท์น์ ์ฌ์ฉํ ๋ CSS ๋ช ์๋๋ฅผ ์ผ๋์ ๋์ญ์์ค. ์กฐ๊ฑด๋ถ ์คํ์ผ์ด ์ถฉ๋ํ๋ ๋ค๋ฅธ ์คํ์ผ์ ์ฌ์ ์ํ ๋งํผ ์ถฉ๋ถํ ๊ตฌ์ฒด์ ์ธ์ง ํ์ธํ์ญ์์ค. - ์ ์ง ๊ด๋ฆฌ์ฑ: CSS ๋ณ์์ ์ฃผ์์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋์ญ์์ค. ์ดํดํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ์ง๋์น๊ฒ ๋ณต์กํ ์กฐ๊ฑด๋ถ ๊ท์น์ ๋ง๋ค์ง ๋ง์ญ์์ค.
- ์ฑ๋ฅ:
@when๊ท์น์ ํ์ฑํด์ผ ํ๋ CSS์ ์์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง, ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์กฐ๊ฑด๋ถ ๊ท์น์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ํนํ ๊ตฌํ ๊ธฐ๊ธฐ์์ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. - ์ ์ง์ ํฅ์: ๋ธ๋ผ์ฐ์ ๊ฐ
@when๊ท์น์ ์ง์ํ์ง ์๋๋ผ๋ ์น์ฌ์ดํธ๊ฐ ์ ์๋ํ๋๋ก ์ ์ง์ ํฅ์์ ์ฌ์ฉํ์ญ์์ค. ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๊ธฐ๋ณธ์ ์ด๊ณ ๊ธฐ๋ฅ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ ๋ค์, ์ด ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ํด ์ ์ง์ ์ผ๋ก ํฅ์์ํค์ญ์์ค.
์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ๋ฏธ๋
@when ๊ท์น์ CSS์์ ์ค์ํ ์ง์ ์ ๋ํ๋
๋๋ค. ์ด๋ ๋ ํํ๋ ฅ ์๊ณ ๋์ ์ธ ์คํ์ผ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋ ๋ณต์กํ๊ณ ๋ฐ์ํ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธธ์ ์ด์ด์ค๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ๊ฐ์ ๋๊ณ ๋ช
์ธ๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ @when ๊ท์น์ ์น ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
CSS ํ๋๋(Houdini)์ ์ถ๊ฐ์ ์ธ ๋ฐ์ ๊ณผ ์ฌ์ฉ์ ์ ์ ์ํ์ ํ์คํ๋ @when์ ๊ธฐ๋ฅ์ ๋์ฑ ํฅ์์์ผ ์คํ์ผ๋ง์ ๋ํ ํจ์ฌ ๋ ์ธ๋ฐํ ์ ์ด์ JavaScript์์ ์ํํ ํตํฉ์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์
๋๋ค.
๊ฒฐ๋ก
CSS @when ๊ท์น์ ์ปจํ
์ด๋ ์ฟผ๋ฆฌ, ์ฌ์ฉ์ ์ ์ ์ํ, CSS ๋ณ์ ๋ฐ ๊ธฐํ ๊ธฐ์ค์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ ์์ง ๋ฐ์ ์ค์ด์ง๋ง, ๋ค์ํ ์ปจํ
์คํธ์ ์ฌ์ฉ์ ์ ํธ๋์ ์ ์ํ๋ ๋์ ์ด๊ณ ๋ฐ์ํ์ธ ์น ๋์์ธ์ ๋ง๋ค๊ธฐ ์ํ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. @when ๊ท์น์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ์ง์ ์ผ๋ก ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ํธํ์ฑ๊ณผ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ํญ์ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์ฒ ์ ํ๊ฒ ํ
์คํธํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์น์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ @when๊ณผ ๊ฐ์ ์๋ก์ด CSS ๊ธฐ๋ฅ์ ์์ฉํ๋ ๊ฒ์ ์๋์ ์์ ๋๊ฐ๊ณ ์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ์ต์ฒจ๋จ ์น ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.