๋ธ๋ผ์ฐ์ ์ CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์บ์ ์์ง์ ๋ํ ์ฌ์ธต ๋ถ์์ ๋๋ค. ์บ์ฑ ์๋ ๋ฐฉ์, ์ฑ๋ฅ์ ์ค์ํ ์ด์ , ์ฝ๋ ์ต์ ํ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์ฑ๋ฅ ๊ทน๋ํ: CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์บ์ ๊ด๋ฆฌ ์์ง ์ฌ์ธต ๋ถ์
CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ๋ฑ์ฅ์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์ดํ ๋ฐ์ํ ์น ๋์์ธ์์ ๊ฐ์ฅ ์ค์ํ ๋ฐ์ ์ค ํ๋์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋๋์ด ๋ทฐํฌํธ์ ์ ์ฝ์์ ๋ฒ์ด๋ ์ปดํฌ๋ํธ๊ฐ ํ ๋น๋ ๊ณต๊ฐ์ ์ ์ํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฌํ ํจ๋ฌ๋ค์์ ๋ณํ๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ผ๋ก ๋ชจ๋ํ๋๊ณ ์ํฉ ์ธ์์ ์ด๋ฉฐ ํ๋ ฅ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฐ ํ์๋ ํฐ ์ฑ ์์ด ๋ฐ๋ฆ ๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ก์ด ์์ค์ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ด ํ์ํฉ๋๋ค. ์ปจํ ์ด๋์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ผ๋ จ์ ์ฟผ๋ฆฌ ํ๊ฐ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค. ์ ๊ตํ ๊ด๋ฆฌ ์์คํ ์ด ์์ผ๋ฉด ์ฌ๊ฐํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์, ๋ ์ด์์ ์ค๋์ฑ ๋ฐ ๋๋ฆฐ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ธ๋ผ์ฐ์ ์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์บ์ ๊ด๋ฆฌ ์์ง์ด ์๋ํฉ๋๋ค. ์ด ์จ๊ฒจ์ง ์์ ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋์์ธ์ด ์ ์ฐํ ๋ฟ๋ง ์๋๋ผ ๋งค์ฐ ๋น ๋ฅด๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์์์ด ์๋ํฉ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ ์ด ์์ง์ ๋ด๋ถ ์๋ ๋ฐฉ์์ ๋ํด ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ํ ์ด์ , ์๋ ๋ฐฉ์, ์ฌ์ฉํ๋ ์บ์ฑ ๋ฐ ๋ฌดํจํ ์ ๋ต, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ฐ๋ฐ์์ธ ์ฌ์ฉ์๊ฐ ์ต๋ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ด ์์ง๊ณผ ํ๋ ฅํ๋ CSS๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด ๋๋ค.
์ฑ๋ฅ ๋ฌธ์ : ์บ์ฑ์ ํ์
์บ์ฑ ์์ง์ ์ดํดํ๋ ค๋ฉด ๋จผ์ ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค. ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ์ฑ๋ฅ ๊ด์ ์์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋จ์ผ ์ ์ญ ์ปจํ ์คํธ์ธ ๋ทฐํฌํธ์ ๋ํด ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ํ๊ฐํฉ๋๋ค. ๋ทฐํฌํธ์ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ๊ฐํ๊ณ ๊ด๋ จ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ ์ฒด ๋ฌธ์์ ๋ํด ํ ๋ฒ ๋ฐ์ํฉ๋๋ค.
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๋ฉฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋ ๋ณต์กํฉ๋๋ค.
- ์์๋ณ ํ๊ฐ: ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ์ ์ญ ๋ทฐํฌํธ๊ฐ ์๋ ํน์ ์ปจํ ์ด๋ ์์์ ๋ํด ํ๊ฐ๋ฉ๋๋ค. ๋จ์ผ ์น ํ์ด์ง์๋ ์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ์ฟผ๋ฆฌ ์ปจํ ์ด๋๊ฐ ์์ ์ ์์ต๋๋ค.
- ๋ค์ค ํ๊ฐ ์ถ: ์ฟผ๋ฆฌ๋ `width`, `height`, `inline-size`, `block-size`, `aspect-ratio` ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ ์์ฑ์ ์ถ์ ํด์ผ ํฉ๋๋ค.
- ๋์ ์ปจํ ์คํธ: ์ปจํ ์ด๋์ ํฌ๊ธฐ๋ ๊ฐ๋จํ ์ฐฝ ํฌ๊ธฐ ์กฐ์ , CSS ์ ๋๋ฉ์ด์ , JavaScript ์กฐ์, ์ฝํ ์ธ ๋ณ๊ฒฝ(์: ์ด๋ฏธ์ง ๋ก๋) ๋๋ ์์ ์์์ ๋ํ ๋ค๋ฅธ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ ์ฉ ๋ฑ ๋ค์ํ ์ด์ ๋ก ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์บ์ฑ์ด ์๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ฌ์ฉ์๊ฐ ๋ถํ ์๋ฅผ ๋์ด ์ฌ์ด๋ ํจ๋์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค. ์ด ์์ ์ ๋ช ์ด ์์ ์๋ฐฑ ๊ฐ์ ํฌ๊ธฐ ์กฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ํจ๋์ด ์ฟผ๋ฆฌ ์ปจํ ์ด๋์ธ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์คํ์ผ์ ๋ค์ ํ๊ฐํด์ผ ํ๋ฉฐ, ์ด๋ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ ์ด์์ ์ฌ๊ณ์ฐ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด ๋ ์ด์์ ๋ณ๊ฒฝ์ ์ค์ฒฉ๋ ์ฟผ๋ฆฌ ์ปจํ ์ด๋์ ํฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์ณ ์์ฒด ์คํ์ผ์ ๋ค์ ํ๊ฐํ๋๋ก ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฌ๊ท์ ์ด๊ณ ์ฐ์์ ์ธ ํจ๊ณผ๋ ๋ ์ด์์ ์ค๋์ฑ์ ์์ธ์ด ๋ฉ๋๋ค. ๋ ์ด์์ ์ค๋์ฑ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ๊ธฐ-์ฐ๊ธฐ ์์ ๋ฃจํ(์์์ ํฌ๊ธฐ ์ฝ๊ธฐ, ์ ์คํ์ผ ์ฐ๊ธฐ)์ ๊ฐํ ๊ณ ์ ๋ ํ๋ ์๊ณผ ๋ต๋ตํ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
์บ์ ๊ด๋ฆฌ ์์ง์ ์ด๋ฌํ ํผ๋์ ๋ํ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ๋ฐฉ์ด ์๋จ์ ๋๋ค. ๋ชฉํ๋ ์ฟผ๋ฆฌ ํ๊ฐ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ์ํํ๊ณ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด์ ํ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ด๋ถ: ์ฟผ๋ฆฌ ์บ์ ์์ง ํด๋ถ
์ ํํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ Blink(Chrome, Edge), Gecko(Firefox) ๋ฐ WebKit(Safari)์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์์ง์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ง๋ง ์บ์ ๊ด๋ฆฌ ์์ง์ ํต์ฌ ์๋ฆฌ๋ ๊ฐ๋ ์ ์ผ๋ก ์ ์ฌํฉ๋๋ค. ์ฟผ๋ฆฌ ํ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ฒ์ํ๋๋ก ์ค๊ณ๋ ์ ๊ตํ ์์คํ ์ ๋๋ค.
1. ํต์ฌ ๊ตฌ์ฑ ์์
์์ง์ ๋ช ๊ฐ์ง ๋ ผ๋ฆฌ์ ๊ตฌ์ฑ ์์๋ก ๋๋ ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ ํ์ ๋ฐ ์ ๊ทํ๊ธฐ: ๋ธ๋ผ์ฐ์ ๊ฐ CSS๋ฅผ ์ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํ ๋ ๋ชจ๋ `@container` ๊ท์น์ ์ฝ์ต๋๋ค. ์์ ํ ์คํธ๋ก ์ ์ฅํ์ง ์์ต๋๋ค. ๊ตฌ์กฐํ๋๊ณ ์ต์ ํ๋ ํ์(์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ ๋๋ ์ ์ฌํ ํํ)์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. ์ด ์ ๊ทํ๋ ํ์์ ์ฌ์ฉํ๋ฉด ๋์ค์ ๋ ๋น ๋ฅด๊ฒ ๋น๊ตํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด `(min-width: 300.0px)`์ `(min-width: 300px)`๋ ๋์ผํ ๋ด๋ถ ํํ์ผ๋ก ์ ๊ทํ๋ฉ๋๋ค.
- ์บ์ ์ ์ฅ์: ์์ง์ ํต์ฌ์
๋๋ค. ๊ฒฐ๊ณผ ์ ์ฅ์๋ ๋ค๋จ๊ณ ํด์ ๋งต ๋๋ ์ ์ฌํ ๊ณ ์ฑ๋ฅ ์กฐํ ํ
์ด๋ธ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ๋จ์ํ๋ ์ ์ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค. `Map
>`. ์ธ๋ถ ๋งต์ ์ปจํ ์ด๋ ์์ ์์ฒด๋ฅผ ํค๋ก ํฉ๋๋ค. ๋ด๋ถ ๋งต์ ์ฟผ๋ฆฌ๋๋ ๊ธฐ๋ฅ(์: `inline-size`)์ ํค๋ก ํ๊ณ ๊ฐ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ์ฌ๋ถ์ ๋ํ ๋ถ์ธ ๊ฒฐ๊ณผ์ ๋๋ค. - ๋ฌดํจํ ์์คํ : ์ด๊ฒ์ ์๋ง๋ ์์ง์ ๊ฐ์ฅ ์ค์ํ๊ณ ๋ณต์กํ ๋ถ๋ถ์ผ ๊ฒ์ ๋๋ค. ์บ์๋ ๋ฐ์ดํฐ๊ฐ ์ค๋๋ ์๊ธฐ๋ฅผ ์์์ผ๋ง ์ ์ฉํฉ๋๋ค. ๋ฌดํจํ ์์คํ ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ชจ๋ ์ข ์์ฑ์ ์ถ์ ํ๊ณ ์ข ์์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ฌํ๊ฐ๋ฅผ ์ํด ์บ์๋ฅผ ํ๋๊ทธ ์ง์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
2. ์บ์ ํค: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ์ ํ๊ฒ ๋ง๋๋ ์์๋ ๋ฌด์์ ๋๊น?
๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ ค๋ฉด ์์ง์ ๊ณ ์ ํ ํค๊ฐ ํ์ํฉ๋๋ค. ์ด ํค๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์์์ ์กฐํฉ์ ๋๋ค.
- ์ปจํ ์ด๋ ์์: ์ฟผ๋ฆฌ ์ปจํ ์ด๋์ธ ํน์ DOM ๋ ธ๋์ ๋๋ค.
- ์ฟผ๋ฆฌ ์กฐ๊ฑด: ์ฟผ๋ฆฌ ์์ฒด์ ์ ๊ทํ๋ ํํ์ ๋๋ค(์: `inline-size > 400px`).
- ์ปจํ ์ด๋์ ๊ด๋ จ ํฌ๊ธฐ: ํ๊ฐ ๋น์ ์ฟผ๋ฆฌ๋๋ ์ฐจ์์ ํน์ ๊ฐ์ ๋๋ค. `(inline-size > 400px)`์ ๊ฒฝ์ฐ ์บ์๋ ๊ณ์ฐ๋ `inline-size` ๊ฐ๊ณผ ํจ๊ป ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ ๊ฒ ์บ์ฑํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ผํ ์ปจํ ์ด๋์์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ํ๊ฐํด์ผ ํ๊ณ ์ปจํ ์ด๋์ `inline-size`๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋น๊ต ๋ ผ๋ฆฌ๋ฅผ ๋ค์ ์คํํ์ง ์๊ณ ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
3. ๋ฌดํจํ ์๋ช ์ฃผ๊ธฐ: ์บ์๋ฅผ ํ๊ธฐํด์ผ ํ๋ ๊ฒฝ์ฐ
์บ์ ๋ฌดํจํ๋ ์ด๋ ค์ด ๋ถ๋ถ์ ๋๋ค. ์์ง์ ๋ณด์์ ์ด์ด์ผ ํฉ๋๋ค. ์๊ฐ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์๋ ์ค๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ์๋ชป ๋ฌดํจํํ๊ณ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌดํจํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- ๊ธฐํํ์ ๋ณ๊ฒฝ: ์ปจํ ์ด๋์ ๋๋น, ๋์ด, ํจ๋ฉ, ํ ๋๋ฆฌ ๋๋ ๊ธฐํ ์์ ๋ชจ๋ธ ์์ฑ์ ๋ํ ๋ณ๊ฒฝ์ ํฌ๊ธฐ ๊ธฐ๋ฐ ์ฟผ๋ฆฌ์ ์บ์๋ฅผ ๋๋ฝํ๋๋ค. ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํธ๋ฆฌ๊ฑฐ์ ๋๋ค.
- DOM ๋ณ๊ฒฝ: ์ฟผ๋ฆฌ ์ปจํ ์ด๋๊ฐ DOM์ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ด๋๋๋ฉด ๊ด๋ จ ์บ์ ํญ๋ชฉ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
- ์คํ์ผ ๋ณ๊ฒฝ: ํฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น๋ ์์ฑ(์: ์๋ ํฌ๊ธฐ ์กฐ์ ์ปจํ ์ด๋์ `font-size` ๋๋ `display`)์ ๋ณ๊ฒฝํ๋ ํด๋์ค๊ฐ ์ปจํ ์ด๋์ ์ถ๊ฐ๋๋ฉด ์บ์๊ฐ ๋ฌดํจํ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์คํ์ผ ์์ง์ ์์๋ฅผ ์คํ์ผ์ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ ๊ฒ์ผ๋ก ํ๋๊ทธ ์ง์ ํ๋ฉฐ, ์ด๋ ์ฟผ๋ฆฌ ์์ง์ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค.
- `container-type` ๋๋ `container-name` ๋ณ๊ฒฝ: ์์๋ฅผ ์ปจํ ์ด๋๋ก ์ค์ ํ๋ ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ์ฟผ๋ฆฌ์ ์ ์ฒด ๊ธฐ์ค์ด ๋ณ๊ฒฝ๋๊ณ ์บ์๋ฅผ ์ง์์ผ ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ง์ด ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ
๋จ์ํ ์บ์ฑ ์ธ์๋ ๋ธ๋ผ์ฐ์ ์์ง์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ์ต์ ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(์คํ์ผ -> ๋ ์ด์์ -> ํ์ธํธ -> ํฉ์ฑ)์ ๊น์ด ํตํฉ๋์ด ์์ต๋๋ค.
CSS Containment์ ์ค์ํ ์ญํ
`container-type` ์์ฑ์ ์ฟผ๋ฆฌ ์ปจํ ์ด๋๋ฅผ ์ค์ ํ๊ธฐ ์ํ ํธ๋ฆฌ๊ฑฐ์ผ ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ ฅํ ์ฑ๋ฅ ๊ธฐ๋ณธ ์์์ ๋๋ค. `container-type: inline-size;`๋ฅผ ์ค์ ํ๋ฉด ๋ ์ด์์ ๋ฐ ์คํ์ผ containment๋ฅผ ์์์ ์์์ ์ผ๋ก ์ ์ฉํฉ๋๋ค(`contain: layout style`).
์ด๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ ๋ํ ์ค์ํ ํํธ์ ๋๋ค.
- `contain: layout`์ ์ด ์์์ ๋ด๋ถ ๋ ์ด์์์ด ์ธ๋ถ์ ๊ธฐํํ์ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฆฝ๋๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์ ๊ณ์ฐ์ ๊ฒฉ๋ฆฌํ ์ ์์ต๋๋ค. ์ปจํ ์ด๋ ๋ด๋ถ์ ํ์ ์์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด ํ์ด์ง๊ฐ ์๋ ์ปจํ ์ด๋ ์์ฒด์ ๋ํด์๋ง ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
- `contain: style`์ ์์ ์ธ๋ถ์์ ํจ๊ณผ๋ฅผ ๊ฐ์ง ์ ์๋ ์คํ์ผ ์์ฑ(์: CSS ์นด์ดํฐ)์ด ์ด ์์์ ๋ฒ์๊ฐ ์ง์ ๋จ์ ๋ธ๋ผ์ฐ์ ์ ์๋ฆฝ๋๋ค.
์ด containment ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค๋ฉด ์บ์ ๊ด๋ฆฌ ์์ง์ ๊ด๋ฆฌํ ์ ์ ์๋๊ณ ๊ฒฉ๋ฆฌ๋ ํ์ ํธ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ปจํ ์ด๋ ์ธ๋ถ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ปจํ ์ด๋ ์์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ํ ์ปจํ ์ด๋์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด๋ ์ ์ฌ์ ์ธ ์บ์ ๋ฌดํจํ ๋ฐ ์ฌ๊ณ์ฐ์ ๋ฒ์๋ฅผ ํฌ๊ฒ ์ค์ฌ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฅ ์ค์ํ ์ฑ๋ฅ ๋ ๋ฒ ์ค ํ๋๊ฐ ๋ฉ๋๋ค.
์ผ๊ด ํ๊ฐ ๋ฐ ๋ ๋๋ง ํ๋ ์
๋ธ๋ผ์ฐ์ ๋ ํฌ๊ธฐ ์กฐ์ ์ค์ ๋ชจ๋ ๋จ์ผ ํฝ์ ๋ณ๊ฒฝ์ ๋ํด ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ๊ฐํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ๋๋ํฉ๋๋ค. ์์ ์ ์ผ๊ด ์ฒ๋ฆฌ๋์ด ๋์คํ๋ ์ด์ ์๋ก ๊ณ ์นจ ๋น๋(์ผ๋ฐ์ ์ผ๋ก ์ด๋น 60ํ)์ ๋๊ธฐํ๋ฉ๋๋ค. ์ฟผ๋ฆฌ ์ฌํ๊ฐ๋ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋ ๋๋ง ๋ฃจํ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ปจํ ์ด๋์ ํฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ฆ์ ๋ฉ์ถ๊ณ ๋ชจ๋ ๊ฒ์ ๋ค์ ๊ณ์ฐํ์ง ์์ต๋๋ค. ๋์ DOM ํธ๋ฆฌ์ ํด๋น ๋ถ๋ถ์ "๋ํฐ"๋ก ํ์ํฉ๋๋ค. ๋์ค์ ๋ค์ ํ๋ ์์ ๋ ๋๋งํ ์๊ฐ์ด ๋๋ฉด(์ผ๋ฐ์ ์ผ๋ก `requestAnimationFrame`์ ํตํด ์ค์ผ์คํธ๋ ์ด์ ๋จ) ๋ธ๋ผ์ฐ์ ๋ ํธ๋ฆฌ๋ฅผ ํ์ํ๊ณ , ๋ชจ๋ ๋ํฐ ์์์ ๋ํ ์คํ์ผ์ ๋ค์ ๊ณ์ฐํ๊ณ , ์ปจํ ์ด๋๊ฐ ๋ณ๊ฒฝ๋ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ๊ฐํ๊ณ , ๋ ์ด์์์ ์ํํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํธํฉ๋๋ค. ์ด๋ฌํ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ํตํด ์์ง์ด ๋ง์ฐ์ค ๋๋๊ทธ์ ๊ฐ์ ๊ณ ์ฃผํ ์ด๋ฒคํธ์ ์ํด ์ค๋์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
ํ๊ฐ ํธ๋ฆฌ ๊ฐ์ง์น๊ธฐ
๋ธ๋ผ์ฐ์ ๋ DOM ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ์ฉํฉ๋๋ค. ์ปจํ ์ด๋์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์์ง์ ํด๋น ์ปจํ ์ด๋์ ํด๋น ํ์ ํญ๋ชฉ์ ๋ํ ์ฟผ๋ฆฌ๋ง ๋ค์ ํ๊ฐํ๋ฉด ๋ฉ๋๋ค. ํ์ ๋๋ ์์ ํญ๋ชฉ์ ํ์ธํ ํ์๊ฐ ์์ต๋๋ค. ํ๊ฐ ํธ๋ฆฌ์ ์ด๋ฌํ "๊ฐ์ง์น๊ธฐ"๋ ๊น์ด ์ค์ฒฉ๋ ์ปดํฌ๋ํธ์ ์์ ๋ก์ปฌ ๋ณ๊ฒฝ์ด ํ์ด์ง ์ ์ฒด ์ฌ๊ณ์ฐ์ ํธ๋ฆฌ๊ฑฐํ์ง ์์์ ์๋ฏธํ๋ฉฐ, ์ด๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํ์์ ์ ๋๋ค.
๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ์ต์ ํ ์ ๋ต
์บ์ ์์ง์ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ ๊ฒ์ ๋งค๋ ฅ์ ์ด์ง๋ง ์ค์ ๊ฐ์น๋ ๋ฐ๋๊ฐ ์๋ ํจ๊ป ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ฐ ์์ต๋๋ค. ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๊ฐ ์ต๋ํ ์ฑ๋ฅ์ด ์ข๋๋ก ๋ณด์ฅํ๋ ์คํ ๊ฐ๋ฅํ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. `container-type`์ ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ์ธ์.
์ด๊ฒ์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ์ต์ ํ์ ๋๋ค. ๋๋น์ ๋์ด๋ฅผ ๋ชจ๋ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ผ๋ฐ์ ์ธ `container-type: size;`๋ฅผ ํผํ์ธ์.
- ์ปดํฌ๋ํธ ๋์์ธ์ด ๋๋น ๋ณ๊ฒฝ์๋ง ๋ฐ์ํ๋ ๊ฒฝ์ฐ ํญ์ `container-type: inline-size;`๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋์ด์๋ง ๋ฐ์ํ๋ ๊ฒฝ์ฐ `container-type: block-size;`๋ฅผ ์ฌ์ฉํ์ธ์.
์ ์ค์ํ ๊น์? `inline-size`๋ฅผ ์ง์ ํ๋ฉด ์บ์ ์์ง์ ์ปจํ ์ด๋์ ๋๋น ๋ณ๊ฒฝ๋ง ์ถ์ ํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๋ฆฝ๋๋ค. ์บ์ ๋ฌดํจํ ๋ชฉ์ ์ผ๋ก ๋์ด ๋ณ๊ฒฝ์ ์์ ํ ๋ฌด์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ง์ด ๋ชจ๋ํฐ๋งํด์ผ ํ๋ ์ข ์์ฑ ์๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ค์ด ์ฌํ๊ฐ ๋น๋๊ฐ ์ค์ด๋ญ๋๋ค. ๋์ด๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง๋ง ๋๋น๋ ์์ ์ ์ธ ์ธ๋ก ์คํฌ๋กค ์ปจํ ์ด๋์ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ด๋ ์์ฒญ๋ ์ฑ๋ฅ ํฅ์์ ๋๋ค.
์:
์ฑ๋ฅ์ด ๋ฎ์ ๊ฒฝ์ฐ(๋๋น์ ๋์ด ์ถ์ ):
.card {
container-type: size;
container-name: card-container;
}
์ฑ๋ฅ์ด ๋ ์ข์ ๊ฒฝ์ฐ(๋๋น๋ง ์ถ์ ):
.card {
container-type: inline-size;
container-name: card-container;
}
2. ๋ช ์์ CSS Containment๋ฅผ ์ฌ์ฉํ์ธ์.
`container-type`์ ์ผ๋ถ containment๋ฅผ ์์์ ์ผ๋ก ์ ๊ณตํ์ง๋ง ์ฟผ๋ฆฌ ์ปจํ ์ด๋๊ฐ ์๋๋๋ผ๋ ๋ชจ๋ ๋ณต์กํ ์ปดํฌ๋ํธ์ `contain` ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์๊ณ ์ ์ฉํด์ผ ํฉ๋๋ค.
์์ฒด ํฌํจ๋ ์์ ฏ(์: ์บ๋ฆฐ๋, ์ฃผ์ ์ฐจํธ ๋๋ ๋ํํ ์ง๋)์ด ์๊ณ ๋ด๋ถ ๋ ์ด์์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์ ํฐ ์ฑ๋ฅ ํํธ๋ฅผ ์ ๊ณตํ์ธ์.
.complex-widget {
contain: layout style;
}
์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์์ ฏ ์ฃผ์์ ์ฑ๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค๋๋ก ์ง์ํฉ๋๋ค. ๋ ๋๋ง ๊ณ์ฐ์ ๊ฒฉ๋ฆฌํ์ฌ ์์ ฏ ๋ด๋ถ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์กฐ์ ์ปจํ ์ด๋์ ๋ํ ์บ์ ๋ฌดํจํ๋ฅผ ๋ถํ์ํ๊ฒ ํธ๋ฆฌ๊ฑฐํ์ง ์๋๋ก ํ์ฌ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์์ง์ ๊ฐ์ ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
3. DOM ๋ณ๊ฒฝ์ ์ ์ํ์ธ์.
์ฟผ๋ฆฌ ์ปจํ ์ด๋๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋๋ค. ์ปจํ ์ด๋๊ฐ DOM์ ์ฝ์ ๋ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
- ์ปจํ ์ด๋๋ก ์ธ์ํฉ๋๋ค.
- ์ด๊ธฐ ์คํ์ผ ๋ฐ ๋ ์ด์์ ํจ์ค๋ฅผ ์ํํ์ฌ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๊ด๋ จ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ํ๊ฐํฉ๋๋ค.
- ์บ์๋ฅผ ์ฑ์๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ํญ๋ชฉ์ด ์์ฃผ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ ๋ชฉ๋ก(์: ๋ผ์ด๋ธ ํผ๋ ๋๋ ๊ฐ์ํ๋ ๋ชฉ๋ก)์ด ํฌํจ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋จ์ผ ๋ชฉ๋ก ํญ๋ชฉ์ ์ฟผ๋ฆฌ ์ปจํ ์ด๋๋ก ๋ง๋ค์ง ๋ง์ธ์. ๋์ ์์ ์์๋ฅผ ์ฟผ๋ฆฌ ์ปจํ ์ด๋๋ก ๋ง๋ค๊ณ ์์์ Flexbox ๋๋ Grid์ ๊ฐ์ ํ์ค CSS ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํญ๋ชฉ์ด ์ปจํ ์ด๋์ฌ์ผ ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ์กฐ๊ฐ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ DOM ์ฝ์ ์ ๋จ์ผ ์์ ์ผ๋ก ์ผ๊ด ์ฒ๋ฆฌํ์ธ์.
4. JavaScript ๊ธฐ๋ฐ ํฌ๊ธฐ ์กฐ์ ์ ๋๋ฐ์ด์คํ์ธ์.
ํฌ๊ธฐ๊ฐ ๋๋๊ทธ ๊ฐ๋ฅํ ๋ถํ ์ ๋๋ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ ๋ชจ๋ฌ ์ฐฝ๊ณผ ๊ฐ์ด JavaScript๋ก ์ ์ด๋๋ ๊ฒฝ์ฐ ์ด๋น ์๋ฐฑ ๊ฐ์ ํฌ๊ธฐ ๋ณ๊ฒฝ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฝ๊ฒ ์ฑ์ธ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฟผ๋ฆฌ ์บ์ ์์ง์ด ์ค๋์ฑ๋ฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํฌ๊ธฐ ์กฐ์ ๋ ผ๋ฆฌ๋ฅผ ๋๋ฐ์ด์คํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ `mousemove` ์ด๋ฒคํธ์์ ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋์ ๋๋ฐ์ด์ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ์ ๋์ ๋๋๊ทธ๋ฅผ ์ค์งํ ํ์๋ง ํฌ๊ธฐ๊ฐ ์ ์ฉ๋๋๋ก ํฉ๋๋ค(์: 100ms). ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฒคํธ ํญํ์ด ๋จ์ผํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ๋ฐ์ดํธ๋ก ์ถ์๋์ด ์บ์ ์์ง์ด ์๋ฐฑ ๋ฒ ๋์ ํ ๋ฒ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ JavaScript ์:
function debounce(func, delay) {
let timeoutId;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
const splitter = document.querySelector('.splitter');
const panel = document.querySelector('.panel');
const applyResize = (newWidth) => {
panel.style.width = `${newWidth}px`;
// This change will trigger container query evaluation
};
const debouncedResize = debounce(applyResize, 100);
splitter.addEventListener('drag', (event) => {
// On every drag event, we call the debounced function
debouncedResize(event.newWidth);
});
5. ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๊ฐ๋จํ๊ฒ ์ ์งํ์ธ์.
์ต์ ๋ธ๋ผ์ฐ์ ์์ง์ CSS๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ํ๊ฐํ๋ ๋ฐ ๋งค์ฐ ๋น ๋ฅด์ง๋ง ๋จ์์ฑ์ด ํญ์ ๋ฏธ๋์ ๋๋ค. `(min-width: 30em) and (max-width: 60em)`์ ๊ฐ์ ์ฟผ๋ฆฌ๋ ์์ง์ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ `and`, `or` ๋ฐ `not` ์ ์ด ์๋ ๋งค์ฐ ๋ณต์กํ ๋ถ์ธ ๋ ผ๋ฆฌ๋ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ํ๊ฐ์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์ดํฌ๋ก ์ต์ ํ์ด์ง๋ง ํ์ด์ง์์ ์์ฒ ๋ฒ ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์์ ์ด๋ฌํ ์์ ๋น์ฉ์ด ํฉ์ฐ๋ ์ ์์ต๋๋ค. ๋์์ผ๋ก ์ง์ ํ๋ ค๋ ์ํ๋ฅผ ์ ํํ๊ฒ ์ค๋ช ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ์ํด ๋ ธ๋ ฅํ์ธ์.
์ฟผ๋ฆฌ ์ฑ๋ฅ ๊ด์ฐฐ ๋ฐ ๋๋ฒ๊น
๋ธ๋ผ์ธ๋๋ก ๋ ํ์๋ ์์ต๋๋ค. ์ต์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Chrome ๋๋ Edge DevTools์ ์ฑ๋ฅ ํญ์์ ์ํธ ์์ฉ(์: ์ปจํ ์ด๋ ํฌ๊ธฐ ์กฐ์ )์ ์ถ์ ์ ๊ธฐ๋กํ ์ ์์ต๋๋ค. "์คํ์ผ ์ฌ๊ณ์ฐ"์ด๋ผ๋ ๋ ์ด๋ธ์ด ๋ถ์ ๊ธด ์์ฃผ์ ๋ง๋์ "๋ ์ด์์"์ ๋ํ ๋ น์ ๋ง๋๋ฅผ ์ฐพ์ผ์ธ์. ์ด๋ฌํ ์์ ์ด ํฌ๊ธฐ ์กฐ์ ์ค์ ์ค๋ ์๊ฐ(๋ช ๋ฐ๋ฆฌ์ด ์ด์) ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ํ๊ฐ๊ฐ ์์ ๋์ ๊ธฐ์ฌํ๊ณ ์์์ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ ์ ๋ง์ฐ์ค๋ก ๊ฐ๋ฆฌํค๋ฉด ์ํฅ์ ๋ฐ์ ์์ ์์ ๋ํ ํต๊ณ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์์ ์ปจํ ์ด๋ ํฌ๊ธฐ ์กฐ์ ํ์ ์์ฒ ๊ฐ์ ์์๊ฐ ๋ค์ ์คํ์ผ ์ง์ ๋๋ ๊ฒฝ์ฐ ์ ์ ํ CSS containment๊ฐ ๋ถ์กฑํ๋ค๋ ์ ํธ์ผ ์ ์์ต๋๋ค.
์ฑ๋ฅ ๋ชจ๋ํฐ ํจ๋์ ๋ ๋ค๋ฅธ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. CPU ์ฌ์ฉ๋, JS ํ ํฌ๊ธฐ, DOM ๋ ธ๋ ๋ฐ ์ค์ํ ๋ ์ด์์/์ด ๋ฐ ์คํ์ผ ์ฌ๊ณ์ฐ/์ด์ ์ค์๊ฐ ๊ทธ๋ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ์ ์ํธ ์์ฉํ ๋ ์ด๋ฌํ ์ซ์๊ฐ ํฌ๊ฒ ๊ธ์ฆํ๋ฉด ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๋ฐ containment ์ ๋ต์ ์กฐ์ฌํ๋ผ๋ ๋ช ํํ ์ ํธ์ ๋๋ค.
์ฟผ๋ฆฌ ์บ์ฑ์ ๋ฏธ๋: ์คํ์ผ ์ฟผ๋ฆฌ ๋ฐ ๊ทธ ์ด์
์ฌ์ ์ ๋๋์ง ์์์ต๋๋ค. ์น ํ๋ซํผ์ ์คํ์ผ ์ฟผ๋ฆฌ(`@container style(...)`)์ ๋์ ์ผ๋ก ์งํํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์์๋ ์์ ์์์ CSS ์์ฑ์ ๊ณ์ฐ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์คํ์ผ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(์: ์์ ์์์ `--theme: dark` ์ฌ์ฉ์ ์ง์ ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ ๋ชฉ์ ์์ ๋ณ๊ฒฝ).
์คํ์ผ ์ฟผ๋ฆฌ๋ ์บ์ ๊ด๋ฆฌ ์์ง์ ๋ํ ์์ ํ ์๋ก์ด ๊ณผ์ ์ธํธ๋ฅผ ๋์ ํฉ๋๋ค. ์์ง์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ง ์ถ์ ํ๋ ๋์ ์ด์ ์์์ CSS ์์ฑ์ ๊ณ์ฐ๋ ๊ฐ์ ์ถ์ ํด์ผ ํฉ๋๋ค. ์ข ์์ฑ ๊ทธ๋ํ๊ฐ ํจ์ฌ ๋ ๋ณต์กํด์ง๊ณ ์บ์ ๋ฌดํจํ ๋ ผ๋ฆฌ๊ฐ ํจ์ฌ ๋ ์ ๊ตํด์ ธ์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ด ํ์ค์ด ๋จ์ ๋ฐ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ ์์น(๊ตฌ์ฒด์ฑ๊ณผ containment๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ ๋ช ํํ ํํธ ์ ๊ณต)์ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น์ ์ ์งํ๋ ๋ฐ ํจ์ฌ ๋ ์ค์ํด์ง ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก : ์ฑ๋ฅ์ ์ํ ํํธ๋์ญ
CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์บ์ ๊ด๋ฆฌ ์์ง์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ง๋ฅ์ ์ผ๋ก ์บ์ฑํ๊ณ , ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ํตํด ์์ ์ ์ต์ํํ๊ณ , ํ๊ฐ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง์น๊ธฐํ์ฌ ์ต์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํ์ฌ ํ๋์ ์ธ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋์์ธ์ ๋๊ท๋ชจ๋ก ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์์ง๋์ด๋ง์ ๊ฑธ์์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ๊ณต์ ์ฑ ์์ ๋๋ค. ์์ง์ ๊ฐ๋ฐ์์ธ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅธ ์ ํธ๋ฅผ ์ ๊ณตํ ๋ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค. ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์์ฑ์ ํต์ฌ ์์น์ ์์ฉํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ ฅํ ํํธ๋์ญ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ค์ ์ฃผ์ ๋ด์ฉ์ ๊ธฐ์ตํ์ธ์.
- ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ์ธ์. ๊ฐ๋ฅํ ๊ฒฝ์ฐ `size` ๋์ `container-type: inline-size` ๋๋ `block-size`๋ฅผ ์ฌ์ฉํ์ธ์.
- Containmentํ์ธ์. `contain` ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์ปดํฌ๋ํธ ์ฃผ์์ ์ฑ๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋ง๋์ธ์.
- ์ ์ํ์ธ์. DOM ๋ณ๊ฒฝ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๊ณ ๊ณ ์ฃผํ JavaScript ๊ธฐ๋ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ์ ๋๋ฐ์ด์คํ์ธ์.
์ด๋ฌํ ์ง์นจ์ ๋ฐ๋ฅด๋ฉด ๋ฐ์ํ ์ปดํฌ๋ํธ๊ฐ ์๋ฆ๋ต๊ฒ ์ ์๋ ๋ฟ๋ง ์๋๋ผ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ ์ฌ์ฉ์ ์ฅ์น๋ฅผ ์กด์คํ๊ณ ์ต์ ์น์์ ๊ธฐ๋ํ๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.