๐ฑ 09. ๋ฐ์ํ ๋์์ธ: 'Media Queries vs Container Queries'
๐ ๊ฐ์
๊ธฐ๊ธฐ ํฌ๊ธฐ์ ๋ง์ถ๋ ๊ณ ์ ์ ์ธ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๋์ด, ์์๊ฐ ๋ด๊ธด ๊ทธ๋ฆ์ ํฌ๊ธฐ์ ๋ฐ์ํ๋ ์ต์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๊น์ง ๋ฐ์ํ์ ๋ชจ๋ ๊ฒ์ ์์ฒ ์ด์ ํจ๊ป ๋ง์คํฐํฉ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๋ชจ๋ฐ์ผ ํผ์คํธ์ ์ฒ ํ] โ [๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํ๊ณ] โ [์ปจํ
์ด๋ ์ฟผ๋ฆฌ์ ํ๋ช
]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํด ๋ค์ํ ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ ํ๊ฒฝ์ ๋์ํฉ๋๋ค.
- 'Mobile First' ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํฉ๋๋ค.
- ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋จ์์ ์ง์ ํ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ํ ์คํ์ผ์ ๊ตฌํํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋! ์ด ์นด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์๋๋ฐ, ๋ฉ์ธ ํ์ด์ง์์๋ ๋๊ฒ ์ ๋์ค๊ฑฐ๋ ์? ๊ทผ๋ฐ ์ค๋ฅธ์ชฝ ์ข์ ์ฌ์ด๋๋ฐ์ ๋ฃ์ผ๋๊น ๊ธ์๊ฐ ๊ฒน์น๊ณ ๋ค ๊นจ์ ธ์. ํ๋ฉด ์ ์ฒด ํฌ๊ธฐ๋ ๋๊ฐ์๋ฐ, ์ฌ์ด๋๋ฐ ์์์๋ง ์คํ์ผ์ ๋ฐ๊ฟ ์ ์๋์? ๐ญ"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ๊ทธ๋์ ์ฐ๋ฆฐ '๋ธ๋ผ์ฐ์ ํ๋ฉด(Viewport)'๋ง ์ณ๋ค๋ณด๊ณ ์ฝ๋๋ฅผ ์งฐ์ฃ . ํ์ง๋ง ๊ณ ์๋ ์ปดํฌ๋ํธ๊ฐ ์ด๋์ ๋ด๊ธฐ๋ ์์์ ์ ์ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด์ '์ปจํ ์ด๋ ์ฟผ๋ฆฌ'๋ผ๋ ์ต์ ๋ฌด๊ธฐ๋ฅผ ์ฅ์ฐฉํ ๋๊ฐ ๋๊ตฐ์."
๐ค ์ ์์์ผ ํ๋๊ฐ
๊ณผ๊ฑฐ์ ๋ฐ์ํ ๋์์ธ์ "์์ดํฐ์ด๋ ์์ดํจ๋๋"๋ง ๋ฐ์ก์ต๋๋ค. ํ์ง๋ง ํ๋์ ์น์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ๋ณต์กํ ๋์๋ณด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ๋๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋์ ๊ณณ์ ์ฐ์ผ ์๋, ์ข์ ๊ณณ์ ์ฐ์ผ ์๋ ์์ฃ .
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ง์ผ๋ก๋ ์ด๋ฐ '์ปดํฌ๋ํธ์ ๋ ๋ฆฝ์ฑ' ์ ์งํค๊ธฐ ํ๋ญ๋๋ค. 5๋ ์ฐจ ์ด์์ ์๋์ด๋ Viewport์ ์์กดํ๋ ๋์ , ์ปดํฌ๋ํธ๊ฐ ์๊ธฐ๊ฐ ๋์ธ ์ปจํ ์ด๋(๋ถ๋ชจ) ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ชจ์ต์ ๋ฐ๊พธ๋๋ก ์ค๊ณํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ๋์ ์ธ ์น ๊ฐ๋ฐ์ ํ์ค์ ๋๋ค.
๐ฑ 1. ๋ฏธ๋์ด ์ฟผ๋ฆฌ(Media Query)์ ๋ชจ๋ฐ์ผ ํผ์คํธ
- Mobile First: ์์ ํ๋ฉด ์คํ์ผ์ ๋จผ์ ์ง๊ณ , ํฐ ํ๋ฉด์ผ๋ก ๊ฐ๋ฉด์ ๋ด์ฉ์ ์ถ๊ฐํ๋ ๋ฐฉ์์
๋๋ค. (
min-width์ฌ์ฉ) - ์ฅ์ : ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๊ณ , ๋ชจ๋ฐ์ผ ์ฑ๋ฅ ์ต์ ํ์ ์ ๋ฆฌํฉ๋๋ค.
/* ๐ฆ ์ํธ: ์๋์ด๋ 0๋ถํฐ ์์ํด์ ํค์๋๊ฐ๋๋ค. */
.card { font-size: 1rem; }
@media (min-width: 768px) {
.card { font-size: 1.2rem; } /* ํ๋ธ๋ฆฟ ์ด์์์๋ง ์ถ๊ฐ! */
}๐ฑ Mobile First: ์์ ๊ฒ๋ถํฐ ์์์ฌ๋ฆฌ๊ธฐ
(๊ธฐ๋ณธ)
(768px+)
(1024px+)
(1440px+)
โ min-width๋ก ์คํ์ผ์ ์ ์ ์ถ๊ฐ (๊น๋ ๊ฒ ์๋๋ผ ์๋ ๊ฒ!)
๐๏ธ 2. ๋ฐ์ํ์ ํ๋ช : ์ปจํ ์ด๋ ์ฟผ๋ฆฌ (Container Queries)
์์ฒ ์ด์ ๊ณ ๋ฏผ์ ํด๊ฒฐํ ์ ๋ต์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฒด ๋๋น๊ฐ ์๋๋ผ, ๋ถ๋ชจ ์์์ ๋๋น๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์ผ์ ๋ฐ๊ฟ๋๋ค.
- ๋ถ๋ชจ ์ ์: "๋๋ ์ด ์์ดํ ๋ค์ ์ปจํ ์ด๋์ผ!"๋ผ๊ณ ์ ์ธํฉ๋๋ค.
- ์ฟผ๋ฆฌ ์์ฑ:
@container๋ฅผ ์ฌ์ฉํด ์คํ์ผ์ ์ ํ๋๋ค.
.sidebar { container-type: inline-size; } /* 1. ๋ถ๋ชจ ์ ์ธ */
@container (max-width: 300px) { /* 2. ๋ถ๋ชจ ๋๋น๊ฐ 300px ์ดํ๋ฉด? */
.card {
display: block; /* ๊ฐ๋ก ๋ฐฐ์ด์์ ์ธ๋ก ๋ฐฐ์ด๋ก ์๋ ์ ํ! */
}
}๐๏ธ Media Query vs Container Query
โ Media Query (๋ทฐํฌํธ ๋์ด ๊ธฐ์ค)
โ Container Query (๋ถ๋ชจ ๋์ด ๊ธฐ์ค)
๐ 3. Logical Properties: ๋ฐฉํฅ์ ์์
๋ฐ์ํ์ ํฌ๊ธฐ๋ฟ๋ง ์๋๋ผ '์ฝ๋ ๋ฐฉํฅ'๋ ํฌํจํฉ๋๋ค. margin-left ๋์ margin-inline-start๋ฅผ ์ฐ๋ฉด, ์ฐ์ธก์์ ์ข์ธก์ผ๋ก ์ฝ๋ ์ธ์ด(Arabic ๋ฑ)์์๋ ์คํ์ผ์ด ์๋์ผ๋ก ๋ค์งํ๋๋ค.
๐ฃ ์์ฒ : "์... ์ด์ ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ๊ณ ๋ฏผํ๋ ๊ฒ ์๋๋ผ '์์/๋'์ ๊ณ ๋ฏผํด์ผ ํ๋ ์๋๋ค์!"
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. CSS์์ 'Mobile First' ์ ๋ต์ ๊ตฌํํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด๋ฌธ์ ๋ฌด์์ผ๊น์?
max-widthmin-widthdevice-widthaspect-ratio
โ
์ ๋ต: 2. min-width
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ: ๋ชจ๋ฐ์ผ ์คํ์ผ์ ๊ธฐ๋ณธ์ผ๋ก ์์ฑํ๊ณ , ํ๋ฉด์ด ์ปค์ง์ ๋ฐ๋ผ(min-width) ์คํ์ผ์ ์ถ๊ฐํด ๋๊ฐ๋ ๊ฒ์ด ๋ชจ๋ฐ์ผ ํผ์คํธ์ ์ ์์
๋๋ค. ๋ฐ๋๋ก ํฐ ๊ฒ๋ถํฐ ๊น์๋ด๋ ค๊ฐ๋ ๊ฒ์ ๋ฐ์คํฌํฑ ํผ์คํธ(
max-width)์ฃ . - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ง์ ์ง์ ๋ ๊ธฐ์ด๋ถํฐ ์๋ ๊ฒ ์ฝ์ง, ์์ฑ๋ ์ง์ ๊น์๋ด๋ฉฐ ์๊ฒ ๋ง๋๋ ๊ฑด ํ๋ค์์์? CSS๋ ๋ง์ฐฌ๊ฐ์ง์์."
Q2. ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ถ๋ชจ ์์์ ๋ฐ๋์ ์ค์ ํด์ผ ํ๋ ์์ฑ์ ๋ฌด์์ธ๊ฐ์?
display: blockcontainer-typecontain: contentresize: both
โ
์ ๋ต: 2. container-type
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ: ์ปจํ
์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๋ ค๋ฉด ์ด๋ค ์์๋ฅผ '๊ธฐ์ค(Container)'์ผ๋ก ์ผ์์ง ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ ค์ค์ผ ํฉ๋๋ค.
container-type: inline-size๋ฑ์ ํตํด ๊ทธ๋ฆ์ ์ง์ ํ๋ ๊ฒ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๊ธฐ์ค์ ์๋ ์ฟผ๋ฆฌ๋ ์๋ํ์ง ์์์. ๋ถ๋ชจ์๊ฒ '๋๋ ๊ด์ฐฐ ๋์์ด์ผ'๋ผ๊ณ ๋ช ์ฐฐ์ ๋ฌ์์ฃผ์ธ์."
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ๋ง๋ 'ํ๋กํ ์นด๋' ์ปดํฌ๋ํธ๊ฐ ๋ฉ์ธ ํ์ด์ง(๋๋น 1200px)์์๋ 3์ปฌ๋ผ์ผ๋ก ์์๊ฒ ๋์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ๋๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ด๋๋ฐ(๋๋น 300px)์ ๋ฃ์๋๋ ์นด๋ ์์ ์ด๋ฏธ์ง๊ฐ ๋๋ฌด ์ปค์ ธ์ ํ
์คํธ๋ฅผ ๋ค ๊ฐ๋ ค๋ฒ๋ฆฌ๋ค์. ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฐ๋ฉด ๋ฉ์ธ ํ์ด์ง์ ์ฌ์ด๋ํ์ผ ๋์ ๊ตฌ๋ถ์ด ์ ๊ฐ๋ ์ํฉ์
๋๋ค. ์์ฒ ์ด๊ฐ ํํด์ผ ํ ๊ฐ์ฅ ํ๋์ ์ธ ํด๊ฒฐ์ฑ
์?
โ
์ ๋ต: ์ปจํ
์ด๋ ์ฟผ๋ฆฌ(@container)๋ฅผ ๋์
ํ์ฌ ๋ถ๋ชจ ๋๋น๊ฐ ์ผ์ ์์ค ์ดํ์ผ ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์คํ์ผ์ ์์ฑํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ๋ทฐํฌํธ ๊ธฐ์ค์ด๋ฏ๋ก, ํ๋ฉด์ด 1200px์ด๋ฉด ์ฌ์ด๋๋ฐ ์์ ์นด๋๋ 1200px ๊ธฐ์ค์ผ๋ก ์๋ํฉ๋๋ค. ํ์ง๋ง ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๋ฉด 300px์ด๋ผ๋ ์ข์ ๋ถ๋ชจ ํ๊ฒฝ์ ์ธ์ํ ์ ์์ต๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ํด๋์ค๋ฅผ ์ผ์ผ์ด
.card--small์ฒ๋ผ ๋ง๋ค์ด์ ์ฃผ์ ํ๋ ๊ฑด ๋๋ฌด ๋ ธ๊ฐ๋ค์์. ์ปดํฌ๋ํธ๊ฐ ์ค์ค๋ก ๋๋ํด์ง๊ฒ ๋ง๋์ธ์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ปดํฌ๋ํธ์ ์ด๋ช ์ ๋ทฐํฌํธ๊ฐ ์๋๋ผ ์ปจํ ์ด๋๊ฐ ๊ฒฐ์ ํ๋ค!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ์ ๋ง ๋คํต์๋ฅผ ํ ๋ ๋ง์ ๊ธฐ๋ถ์ด๋ค.
ํญ์ ๋ธ๋ผ์ฐ์ ์ฐฝ๋ง ์ค์๋ค ๋๋ ธ๋ค ํ๋ฉด์ ํ
์คํธํ๋๋ฐ, ์ ์ ์ค์ํ ๊ฑด ์ปดํฌ๋ํธ๊ฐ ๋์ธ 'ํ๊ฒฝ'์ด์๋ค๋ ๊ฑธ ๊นจ๋ฌ์๋ค. ์ปจํ
์ด๋ ์ฟผ๋ฆฌ... ์ด๊ฑด ์ ๋ง ๊ฒ์ ์ฒด์ธ์ ๋ค!
๐ก "์ง์ ํ ๋ฐ์ํ์ ํ๋ฉด์ ๋ง์ถ๋ ๊ฒ์ด ์๋๋ผ, ํ๊ฒฝ์ ์ ์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ๋ ๊ฒ์ด๋ค."
์ํธ ๋์ด "๋ชจ๋ฐ์ผ ํผ์คํธ๋ ์ฝ๋ฉ ์คํ์ผ์ด ์๋๋ผ ์ฒ ํ์ด๋ค"๋ผ๊ณ ํ์
จ๋ ๋ง์๋ ์ด์ ์ผ ์ข ์ ๊ฒ ๊ฐ๋ค. ์์ ์ฌ๋ฆฌ๋ ๊ฒ ๊น์๋ด๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝ๋ค๋ ๊ฑธ ๋ง์ด๋ค.
์ง์ ๊ฐ์ ๋ด ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ์ ์ปจํ
์ด๋ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ ์ ์ฉํด๋ด์ผ๊ฒ ๋ค.
๋ด์ผ์ ๋๋์ด '์ ๋๋ฉ์ด์
'! ์น์ ์๋ช
๋ ฅ์ ๋ถ์ด๋ฃ๋ ๋ฒ์ ๋ฐฐ์ด๋ค๋ ์ ๋๋ค! ๐ฑ