๐ @media๋ ์ด์ ๊ทธ๋ง ! ์ต์ @container ์ฌ์ฉ๋ฒ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ vs ๋ฏธ๋์ด ์ฟผ๋ฆฌ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๊ฐ์ด ๋ฌธ์์ ์คํ์ผ์ ๋ฐ์ํ์ผ๋ก ์ง์ ํ ์ ์๋ค. ์ด ๋์ ์๋ ๋ฐฉ์์ ์ ์ฌํ์ง๋ง, ์ฐจ์ด์ ์ ์ด๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ๋์๋๋๋ ์ ์ด๋ค. ์๋ฅผ๋ค์ด ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ๋๋ฐ์ด์ค ๋๋ ๋ฏธ๋์ด ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ๋ทฐํฌํธ์ ์ํด ๋ฐ์ํ์ง๋ง, ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ํ์ด์ง๋ด์ ํน์ ์ปดํฌ๋ํธ ์์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ํ๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ํ ๋ฐ, ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๋๋น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ํ์ง๋ง, ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ๋ฌธ์ ๋ด ๊ฐ ์์ ์ ํฌ๊ธฐ๋ ๋ชจ์์ ๋ฐ๋ผ ๋ฐ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์๋ค๋ ์ ์์ ์์ ํธํ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๊ฐ ์์์ ์์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ Resize Observer ๊ธฐ์ ์ ํตํด ํน์ ์์์ ํฌ๊ธฐ ๋ณํ๋ฅผ ๊ด์ฐฐํ์ฌ ์คํฌ๋ฆฝํธ๋ก ์คํ์ผ๋ง์ ํด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์ด์ ๊ฐ๋จํ CSS ์ปจํ ์ด๋ ๋ฌธ๋ฒ ์ง์ ์ ํตํด ๋งค์ฐ ๊ฐํธํ๊ฒ ๋ณด๋ค ์ธ๋ฐํ๊ณ ์ ํํ ๋ฐ์ํ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋์๋ค.
์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ์ฅ์
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ์ด ๋น์ ๋ฐํ๋ ์๊ฐ์ ์๋์ ๊ฐ์ '์ฌํ ๋ชจ๋' ๋ 'ํ์ฅ ๋ชจ๋' ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐ์ํ ์ฌ์ด๋๋ฐ๋ฅผ ์ค๊ณํ ๋ ์ฐ์ธก ๋ณธ๋ฌธ ์์ญ์ ๋ํ ๋ฐ์ํ ์คํ์ผ๋ง์ด ํ์ํ ๋์ด๋ค.
์๋ฅผ๋ค์ด ์ข์ธก ์ฌ์ด๋๋ฐ ์์ญ์ ์ ์ธํ ์ฐ์ธก ๋ณธ๋ฌธ ์์ญ ์์ ์๋ ์ฌ๋ฌ ์์๋ค์ ํํ์ด์ง์ ๊ฐ๋กํญ์ ๋ฐ๋ผ ์์์ ๋ณํ๋ฅผ ์ฃผ์ด์ผ ํ๋ค๊ณ ํ ๋, ๊ธฐ์กด ๋ฐฉ์๋๋ก ๋ฏธ๋์ด ์ฟผ๋ฆฌ(@media)๋ฅผ ์ด๋ค๋ฉด ์ฌ์ด๋๋ฐ ์์ญ์ ํฌํจํ ์ ์ฒด ๋ธ๋ผ์ฐ์ ๊ฐ๋กํญ์ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ '์ฌํ ๋ชจ๋' ์ผ๋ ์ 'ํ์ฅ ๋ชจ๋' ์ผ๋๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด์ผ ๋์ด ๊ฐ์ ๋์์ธ์ ์ ์ฉํ๋๋ผ๋ ๋ณธ๋ฌธ๊ณผ ๊ตฌ๋ถํ์ฌ ๋ฐ๋ก ๊ด๋ฆฌํด์ผํ๋ ๋ถํธํจ์ด ์๋ค.
๊ตณ์ด ๊ตฌํํ๋ค ๋ผ๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ด๋๋ฐ๊ฐ '์ฌํ ๋ชจ๋' ๋ 'ํ์ฅ ๋ชจ๋' ์ ๋ฐ๋ผ ์ฌ์ด๋๋ฐ์ ๊ธธ์ด์ ๋ฐ๋ผ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๋๋ฒ ๊ตฌํํด์ผ ํ ์ง๋ ๋ชจ๋ฅธ๋ค. ์๋ํ๋ฉด ๋ณธ๋ฌธ(main) ์์ญ ๋ถ๋ถ์ด ์ฌ์ด๋๋ฐ ๊ธธ์ด์ ํจ๊ป ๋ธ๋ผ์ฐ์ ํญ์ ๊ณ์ฐํด์ผ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
main {
width: 1100px;
}
/* ์ฌ์ด๋๋ฐ ํ์ฅ ๋ชจ๋ ์ํ์ผ๋์ ๋ฐ์ํ ์ฟผ๋ฆฌ */
@media screen and (max-width: 1400px) {
html[data-sidebar='expand'] main {
padding: 0 35px;
width: 100%;
}
}
/* ์ฌ์ด๋๋ฐ ์ฌํ ๋ชจ๋ ์ํ์ผ๋์ ๋ฐ์ํ ์ฟผ๋ฆฌ */
@media screen and (max-width: 1200px) {
html[data-sidebar='simple'] main {
padding: 0 35px;
width: 100%;
}
}
๊ทธ๋ฌ๋ ์์ ๋ณธ๋ฌธ์ main ์์ญ์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ก ์ง์ ํ๋ค๋ฉด, ์ข์ธก ์ฌ์ด๋๋ฐ ์ํ๋ฅผ ๋ฐ์ง์ง ์๊ณ ์ค๋ก์ง main ์์ญ์ ๊ฐ๋กํญ์ ๋ฐ๋ผ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ข๋ ์ง๊ด์ ์ด๊ณ ์ ์ง ๋ณด์ ์ข๊ฒ ๊ตฌ์ฑํ ์ ์๊ฒ ๋๋ค.
main {
width: 1100px;
container-name : main-container;
container-type : inline-size;
}
/* ๋ณธ๋ฌธ ๋ฉ์ธ ํน์ ์์ญ์ ๋ฐ๋ฅธ ๋ฐ์ํ ์ฟผ๋ฆฌ */
@container main-container (max-width: 992px) {
html main {
padding: 0 35px;
width: 100%;
}
}
CSS Container Queries ์ ๋ฆฌ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ฌ์ฉ๋ฒ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ viewport ๊ธฐ์ค์ด ์๋, ํน์ ์์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฐ์์ ์ธ ๋์์ ํ๋ค. ๊ทธ๋์ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ฐ์ํ์ ์ ์ฉํ ์ปจํ ์ด๋ ์์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ผ ํน์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์น์๋ฅผ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
1. ๋จผ์ ๋ฐ์ํ์ผ๋ก ๋ฑ๋กํ ์์๋ฅผ ์ปจํ ์ด๋๋ก ๋ฑ๋กํด์ค๋ค.
container-name ์ ํตํด ์ฟผ๋ฆฌ ์ปจํ
์ด๋์ ์ด๋ฆ์ ์ง์ ํ๋ค.
div {
container-name: div-container; /* ์ปจํ
์ด๋ ์ฟผ๋ฆฌ ์์ ์ด๋ฆ */
}
2. ์ปจํ ์ด๋ ์์์ ํ์ ์ ์ง์ ํด์ค๋ค.
container-type ์๋ size, inline-size, normal ์์ฑ๊ฐ์ด ์กด์ฌํ๋ค.
inline-size: ์ธ๋ผ์ธ ๋ ๋ฒจ ๊ธฐ์ค์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์ ์ฉ. ์์์width๊ฐ์ ๋ฐ๋ผ ๋ฐ์ํ์ด ๋์๋๋ค.size: ๋ธ๋ก ๋ ๋ฒจ ๊ธฐ์ค์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์ ์ฉ.width๋ฟ๋ง ์๋๋ผheight๊ฐ์ ๋ฐ๋ผ ๋ฐ์ํ์ด ๋์ ๋๋ค.normal: ํด๋น ๊ฐ์ด ๋ถ์ฌ๋ ์์๋ฅผ container์์ ์ ์ธ์ํจ๋ค. ์ผ์ข ์ none ์๋ฏธ๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
div {
container-name: div-container;
container-type: inline-size; /* ์ ๋งํ ์ํฉ์์ inline-size ๋ก ์ด์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค */
}
div {
/* container-name / container-type */
container : div-container / inline-size; /* ํ์ค๋ก๋ ๋จ์ถ ํํ์ด ๊ฐ๋ฅํ๋ค */
}
3. @container ๋ฐ์ ์น์๋ฅผ ์ง์ ํด์ค๋ค
@media ์ฟผ๋ฆฌ๋ฅผ ๋ฑ๋กํ๋ ๊ฒ ์ฒ๋ผ ๋๊ฐ์ด @container ์ฟผ๋ฆฌ๋ฅผ ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค. ์ด๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ง์ ํด์ฃผ๋ฉด ํน์ ์ปจํ ์ด๋ ๋ด์์๋ง ๋ฐ์ํ๊ณ , ์ด๋ฆ์ ์ง์ ์ํด์ฃผ๋ฉด ๋ชจ๋ ์ปจํ ์ด๋์ ๋ํด ์ ์ญ์ผ๋ก ๋ฐ์ํ๊ฒ ๋๋ค.
/* ๋ชจ๋ ์ปจํ
์ด๋ ์์์ ๋ฐ์ */
@container (min-width: 700px) {
div {
font-size: 2em;
}
}
/* ํน์ container-name์ ์์์ ๋ฐ์ */
@container div-container (min-width: 700px) {
div {
font-size: 2em;
}
}
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๊ธธ์ด ๋จ์
viewport์ vw, vh ๋จ์ ์ฒ๋ผ container์ ๋๋น์ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์๋ ๊ธฐ์ค์ ๋จ์๊ฐ ์กด์ฌํ๋ค. ์ด ๋จ์๊ฐ์ ์ด์ฉํ๋ฉด ์์์ ๊ตฌ์ฒด์ ์ธ ๊ธธ์ด ๊ฐ์ ๋ค์ ๊ณ์ฐํ ํ์ ์์ด ๋ค๋ฅธ ์ปจํ ์ด๋์์ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- cqw : ์ฟผ๋ฆฌ ์ปจํ ์ด๋ ๋๋น์ 1%
- cqh : ์ฟผ๋ฆฌ ์ปจํ ์ด๋ ๋์ด์ 1%
- cqi : ์ฟผ๋ฆฌ ์ปจํ ์ด๋ ์ธ๋ผ์ธ ํฌ๊ธฐ์ 1%
- cqb : ์ฟผ๋ฆฌ ์ปจํ ์ด๋์ ๋ธ๋ก ํฌ๊ธฐ์ 1%
- cqmin : cqi ๋๋ cqb ์ค ๋ ์์ ๊ฐ
- cqmax : cqi ๋๋ cqb ์ค ๋ ํฐ ๊ฐ
/* ์ปจํ
์ด๋์ ์ธ๋ผ์ธ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ชฉ์ ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ์ค์ */
@container (min-width: 700px) {
div {
font-size: 1em + 2cqi;
}
}
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์
IE๋ฅผ ์ ์ธํ๊ณค ์ ๋งํ PC, Mobile ๋ธ๋ผ์ฐ์ ์์ ๋ฌธ์ ์์ด ๋ชจ๋ ์ง์๋จ์ ๋ณผ ์ ์์ด ๋์ฑ๋ ์ฌ์ฉํ์ง ์์ ์ด์ ๊ฐ ์๋ค.
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ํด๋ฆฌํ
๋ง์ผ ๋ง์ด๋ํ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ผญ ์ง์ํด์ผ๋ง ํ๋ค๋ฉด, ํด๋ฆฌํ(polyfill) ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ ์ด๊ฑธ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฌ์ฉ๋ฒ๋ css์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๋ฌธ๋ฒ์ ์ฐ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํด ์คํฌ๋ฆฝํธ๋ง ์คํํ๋ฉด ์์์ ๋ธ๋ผ์ฐ์ ์ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ง์ ์ ๋ฌด๋ฅผ ๊ฐ์งํ๊ณ ํด๋ฆฌํ ํด์ค๋ค.
<script src="https://unpkg.com/container-query-polyfill/dist/container-query-polyfill.modern.js"></script>
<script>
const supportsContainerQueries = "container" in document.documentElement.style;
if (!supportsContainerQueries) {
import("container-query-polyfill");
}
</script>
# ์ฐธ๊ณ ์๋ฃ
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries
https://web.dev/cq-stable/