CSS ๋ ์ด์์์ ์ฒ์ ๋ฐฐ์ธ ๋ ๊ฐ์ฅ ๋ง์ด ๋์ค๋ ์ง๋ฌธ์ด ์๋ค.
"Flexbox๋ Grid ์ค์ ๋ญ ์จ์ผ ํด์?"
์ ๋ต์ "๋ ๋ค ์์์ผ ํ๋ค"๋ค. ๋ ๊ธฐ์ ์ ์๋ก ๊ฒฝ์ํ๋ ๊ฒ ์๋๋ผ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ์ด๋ค ์ํฉ์์ ์ด๋ค ๊ฑธ ์จ์ผ ํ๋์ง ๋ฐ๋ก ํ๋จํ ์ ์์ ๊ฑฐ๋ค.
Flexbox vs Grid โ ํต์ฌ ์ฐจ์ด
- Flexbox: ํ ๋ฐฉํฅ(ํ ๋๋ ์ด)์ผ๋ก ์์ดํ ์ ๋ฐฐ์น โ 1์ฐจ์ ๋ ์ด์์
- Grid: ํ๊ณผ ์ด์ ๋์์ ์ ์ด โ 2์ฐจ์ ๋ ์ด์์
์ ํ ๊ธฐ์ค
| ์ํฉ | ์ถ์ฒ |
|---|---|
| ๊ฐ๋ก๋ก ๋์ด๋ ๋ฒํผ๋ค, ๋ค๋น๊ฒ์ด์ ๋ฉ๋ด | Flexbox |
| ์ธ๋ก๋ก ์์ธ ๋ฆฌ์คํธ ํญ๋ชฉ๋ค | Flexbox |
| ์ปดํฌ๋ํธ ๋ด๋ถ ์ ๋ ฌ (์์ด์ฝ + ํ ์คํธ) | Flexbox |
| ์นด๋ ๊ทธ๋ฆฌ๋, ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ | Grid |
| ํ์ด์ง ์ ์ฒด ๋ ์ด์์ (ํค๋, ์ฌ์ด๋๋ฐ, ๋ฉ์ธ) | Grid |
| ํ๊ณผ ์ด์ ์ ๋ ฌ์ด ๋ชจ๋ ์ค์ํ ๊ฒฝ์ฐ | Grid |
| ์ฝํ ์ธ ์์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ | Flexbox |
๋ ๊ฐ์ง๋ฅผ ํจ๊ป ์ฐ๋ ๊ฒ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ค โ Grid๋ก ํ์ด์ง ๋ ์ด์์์ ์ก๊ณ , ๊ฐ ์ ๋ด๋ถ๋ Flexbox๋ก ์ ๋ ฌํ๋ ์์ด๋ค.
Flexbox ์์ ์ ๋ณต
Flexbox๋ ๋ถ๋ชจ ์์์ display: flex๋ฅผ ์ ์ธํ๋ฉด ์์๋๋ค. ์์ ์์๋ค์ด ์๋์ผ๋ก Flex ์์ดํ
์ด ๋๋ค.
ํต์ฌ ๊ฐ๋ : ์ฃผ์ถ๊ณผ ๊ต์ฐจ์ถ
flex-direction: row (๊ธฐ๋ณธ๊ฐ)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ์ฃผ์ถ (main axis)
โ [์์ดํ
1] [์์ดํ
2] [์์ดํ
3]
โ
โ ๊ต์ฐจ์ถ (cross axis)justify-content๋ ์ฃผ์ถ ์ ๋ ฌ, align-items๋ ๊ต์ฐจ์ถ ์ ๋ ฌ์ด๋ค.
Flex ์ปจํ ์ด๋ ์์ฑ
.container {
display: flex;
/* ๋ฐฉํฅ */
flex-direction: row; /* ๊ธฐ๋ณธ๊ฐ: ๊ฐ๋ก */
flex-direction: column; /* ์ธ๋ก (์ฃผ์ถ์ด ์์ง์ผ๋ก ๋ฐ๋) */
flex-direction: row-reverse; /* ๊ฐ๋ก ์ญ์ */
flex-direction: column-reverse;
/* ์ค๋ฐ๊ฟ */
flex-wrap: nowrap; /* ๊ธฐ๋ณธ๊ฐ: ํ ์ค์ ๋ค ์ฑ์ฌ๋ฃ์ */
flex-wrap: wrap; /* ๋์น๋ฉด ๋ค์ ์ค๋ก */
flex-wrap: wrap-reverse;
/* ์ฃผ์ถ ์ ๋ ฌ (justify-content) */
justify-content: flex-start; /* ๊ธฐ๋ณธ๊ฐ: ์์์ */
justify-content: flex-end; /* ๋์ */
justify-content: center; /* ๊ฐ์ด๋ฐ */
justify-content: space-between; /* ์ ๋ ๋ถ์ด๊ณ ์ฌ์ด ๊ท ๋ฑ */
justify-content: space-around; /* ์ ๋ ํฌํจ ๊ท ๋ฑ (์ ๋์ ์ ๋ฐ) */
justify-content: space-evenly; /* ๋ชจ๋ ๊ท ๋ฑ */
/* ๊ต์ฐจ์ถ ์ ๋ ฌ (align-items) */
align-items: stretch; /* ๊ธฐ๋ณธ๊ฐ: ์ปจํ
์ด๋ ๋์ด๋งํผ ๋๋ฆผ */
align-items: flex-start; /* ์์ชฝ ์ ๋ ฌ */
align-items: flex-end; /* ์๋์ชฝ ์ ๋ ฌ */
align-items: center; /* ์์ง ๊ฐ์ด๋ฐ */
align-items: baseline; /* ํ
์คํธ ๊ธฐ์ค์ ๋ง์ถค */
/* ์ฌ๋ฌ ์ค์ผ ๋ ์ค ๊ฐ๊ฒฉ */
align-content: flex-start;
align-content: space-between;
/* ๊ฐ๊ฒฉ */
gap: 16px; /* ํ ์ด ๋ชจ๋ ๊ฐ์ ๊ฐ๊ฒฉ */
gap: 16px 24px; /* ํ ๊ฐ๊ฒฉ, ์ด ๊ฐ๊ฒฉ */
row-gap: 16px;
column-gap: 24px;
}Flex ์์ดํ ์์ฑ
.item {
/* flex-grow: ๋จ์ ๊ณต๊ฐ์ ์ผ๋ง๋ ์ฐจ์งํ ์ง */
flex-grow: 0; /* ๊ธฐ๋ณธ๊ฐ: ์ ๋์ด๋จ */
flex-grow: 1; /* ๊ฐ๋ฅํ ๊ณต๊ฐ ๋ชจ๋ ์ฐจ์ง */
flex-grow: 2; /* flex-grow: 1 ์์ดํ
์ 2๋ฐฐ ๊ณต๊ฐ */
/* flex-shrink: ๊ณต๊ฐ ๋ถ์กฑํ ๋ ์ผ๋ง๋ ์ค์ด๋ค์ง */
flex-shrink: 1; /* ๊ธฐ๋ณธ๊ฐ: ์ค์ด๋ฆ */
flex-shrink: 0; /* ์ค์ด๋ค์ง ์์ */
/* flex-basis: ๊ธฐ๋ณธ ํฌ๊ธฐ */
flex-basis: auto; /* ๊ธฐ๋ณธ๊ฐ: ์ฝํ
์ธ ํฌ๊ธฐ */
flex-basis: 200px; /* 200px๋ถํฐ ์์ */
flex-basis: 0; /* flex-grow๋ก๋ง ํฌ๊ธฐ ๊ฒฐ์ */
/* ๋จ์ถ ์์ฑ */
flex: 1; /* flex: 1 1 0% */
flex: 0 0 200px; /* ๊ณ ์ 200px */
flex: auto; /* flex: 1 1 auto */
/* ๊ฐ๋ณ ๊ต์ฐจ์ถ ์ ๋ ฌ */
align-self: center; /* ์ด ์์ดํ
๋ง ์์ง ๊ฐ์ด๋ฐ */
/* ์์ ๋ณ๊ฒฝ */
order: 0; /* ๊ธฐ๋ณธ๊ฐ */
order: -1; /* ๋งจ ์์ผ๋ก */
order: 99; /* ๋งจ ๋ค๋ก */
}์์ฃผ ํ๋ ์ค์
/* โ flex ์ปจํ
์ด๋ ์์์ width 100% ์ฃผ๋ฉด ์๋๋๋ก ์ ๋ ์ ์์ */
.item {
width: 100%; /* flex ์์ดํ
์ width๋ณด๋ค flex-basis๊ฐ ์ฐ์ */
}
/* โ
flex-basis ์ฌ์ฉ */
.item {
flex: 0 0 100%;
}
/* โ flex-shrink ๋ชจ๋ฅด๊ณ min-width ์ค์ */
.item {
/* ๊ธฐ๋ณธ์ ์ผ๋ก ์์ดํ
์ min-content ํฌ๊ธฐ๊น์ง๋ ์ค์ด๋ค์ง ์์ */
/* ํ
์คํธ๊ฐ ๊ธด ์์ดํ
์ด ์์๋ณด๋ค ์ ์ค์ด๋ค๋ฉด ์๋๋ฅผ ์ถ๊ฐ */
}
/* โ
ํ
์คํธ ๋์นจ ํด๊ฒฐ */
.item {
min-width: 0; /* ์ด๊ฑธ ์ถ๊ฐํด์ผ ํ
์คํธ๊ฐ overflow ์ฒ๋ฆฌ๋จ */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}Flexbox ์ค์ ํจํด
์์ง/์ํ ๊ฐ์ด๋ฐ ์ ๋ ฌ
/* ์๋ฒฝํ ๊ฐ์ด๋ฐ ์ ๋ ฌ */
.center-container {
display: flex;
justify-content: center; /* ์ํ ๊ฐ์ด๋ฐ */
align-items: center; /* ์์ง ๊ฐ์ด๋ฐ */
min-height: 100vh; /* ํ๋ฉด ์ ์ฒด ๋์ด */
}<div class="center-container">
<div class="content">๊ฐ์ด๋ฐ์ ์๋ ์ฝํ
์ธ </div>
</div>๋ค๋น๊ฒ์ด์ ๋ฐ (๋ก๊ณ ์ผ์ชฝ, ๋ฉ๋ด ์ค๋ฅธ์ชฝ)
.navbar {
display: flex;
align-items: center;
padding: 0 24px;
height: 60px;
}
.logo {
margin-right: auto; /* ๋๋จธ์ง ๊ณต๊ฐ์ logo ์ค๋ฅธ์ชฝ์ ํ ๋น โ ๋ฉ๋ด๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ฆผ */
}
.nav-menu {
display: flex;
gap: 24px;
}<nav class="navbar">
<a class="logo" href="/">MyBrand</a>
<ul class="nav-menu">
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>์นด๋ ์ปดํฌ๋ํธ ๋ด๋ถ ๋ ์ด์์
.card {
display: flex;
flex-direction: column; /* ์ธ๋ก ๋ฐฐ์น */
height: 100%; /* ๋์ด ํต์ผ์ ์ํด
}
.card-body {
flex: 1; /* ๋จ์ ๊ณต๊ฐ ๋ชจ๋ ์ฐจ์ง โ ๋ฒํผ์ ํญ์ ํ๋จ์ */
}
.card-footer {
margin-top: auto; /* ๋๋ ์ด ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅ */
}ํธํฐ๋ฅผ ํญ์ ํ๋จ์ ๊ณ ์ (Sticky Footer)
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1; /* ๋จ์ ๊ณต๊ฐ ๋ชจ๋ ์ฐจ์ง โ footer๊ฐ ํญ์ ์๋ */
}
footer {
/* ์๋์ผ๋ก ํ๋จ์ ์์น */
}๋ฐ์ํ ํ๊ทธ ๋ชฉ๋ก
.tags {
display: flex;
flex-wrap: wrap; /* ํ๊ทธ๊ฐ ๋ง์ผ๋ฉด ์๋์ผ๋ก ์ค๋ฐ๊ฟ */
gap: 8px;
}
.tag {
padding: 4px 12px;
background: #e2e8f0;
border-radius: 99px;
white-space: nowrap;
}CSS Grid ์์ ์ ๋ณต
Grid๋ ํ(row)๊ณผ ์ด(column)์ ๋์์ ์ ์ํด์ ์์ดํ ์ ๋ฐฐ์นํ๋ค.
Grid ์ปจํ ์ด๋ ์์ฑ
.grid-container {
display: grid;
/* ์ด ์ ์ */
grid-template-columns: 200px 1fr 1fr; /* 200px ๊ณ ์ , ๋๋จธ์ง 1:1 */
grid-template-columns: repeat(3, 1fr); /* 3๋ฑ๋ถ */
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); /* ๋ฐ์ํ! */
/* ํ ์ ์ */
grid-template-rows: 60px 1fr 60px; /* ํค๋, ๋ฉ์ธ, ํธํฐ */
grid-template-rows: repeat(3, auto); /* ์ฝํ
์ธ ํฌ๊ธฐ์ ๋ง๊ฒ */
/* ๊ฐ๊ฒฉ */
gap: 16px;
row-gap: 24px;
column-gap: 16px;
/* ์๋ ์์ฑ๋๋ ํ์ ํฌ๊ธฐ */
grid-auto-rows: minmax(100px, auto);
/* Named Areas */
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}fr ๋จ์
fr์ fractional unit โ ๋จ์ ๊ณต๊ฐ์ ๋น์จ์ด๋ค.
/* 3:1:1 ๋น์จ๋ก ๋๋ */
grid-template-columns: 3fr 1fr 1fr;
/* 200px ๊ณ ์ ํ ๋๋จธ์ง๋ฅผ 2:1๋ก ๋๋ */
grid-template-columns: 200px 2fr 1fr;auto-fill vs auto-fit
/* auto-fill: ๋น ์นผ๋ผ ์ ์ง */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* ์์ดํ
์ด 3๊ฐ์ฌ๋ 5์นธ์ด ๋ค์ด๊ฐ ๊ณต๊ฐ์ด๋ฉด 5์นธ ์ ์ง */
/* auto-fit: ๋น ์นผ๋ผ ์ ํ */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* ์์ดํ
์ด 3๊ฐ๋ฉด 3๊ฐ๊ฐ ๋จ์ ๊ณต๊ฐ์ ๊ท ๋ฑ ๋ถํ */๋๋ถ๋ถ์ ๋ฐ์ํ ์นด๋ ๊ทธ๋ฆฌ๋์๋ auto-fill์ด ๋ ์์ฐ์ค๋ฝ๋ค.
Grid ์์ดํ ์์ฑ
.item {
/* ์์์ด, ๋์ด ์ง์ */
grid-column: 1 / 3; /* 1๋ฒ์งธ ์ ์์ 3๋ฒ์งธ ์ ๊น์ง */
grid-column: 1 / span 2; /* 1๋ฒ์งธ ์ด์์ 2์นธ ์ฐจ์ง */
grid-column: span 2; /* ํ์ฌ ์์น์์ 2์นธ ์ฐจ์ง */
/* ์์ํ, ๋ํ ์ง์ */
grid-row: 1 / 3;
grid-row: span 2;
/* Named Area ์ฌ์ฉ */
grid-area: header;
/* ์
๋ด๋ถ ์ ๋ ฌ */
justify-self: center; /* ์ํ */
align-self: center; /* ์์ง */
place-self: center; /* ๋ ๋ค */
}Grid ์ค์ ํจํด
๋ฐ์ํ ์นด๋ ๊ทธ๋ฆฌ๋ (ํต์ฌ ํจํด!)
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
}<div class="card-grid">
<div class="card">์นด๋ 1</div>
<div class="card">์นด๋ 2</div>
<div class="card">์นด๋ 3</div>
<!-- ๋ช ๊ฐ๋ ์๋์ผ๋ก ๋ฐ์ํ ๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ -->
</div>์ด ๋จ 3์ค์ง๋ฆฌ CSS๊ฐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ด ์์ ํ ๋ฐ์ํ ๊ทธ๋ฆฌ๋๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ๋์ ๋: 4์ด, 5์ด, ...
- ์ข์ ๋: 3์ด, 2์ด, 1์ด
์น์ฌ์ดํธ ์ ์ฒด ๋ ์ด์์
.page-layout {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 60px 1fr 50px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100vh;
}
header { grid-area: header; }
.sidebar { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ header โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโค
โ โ โ
โ sidebar โ main โ
โ โ โ
โโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโค
โ footer โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ์ฌ์ง ๊ฐค๋ฌ๋ฆฌ (๋น๋์นญ span)
.gallery {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 200px;
gap: 8px;
}
/* ์ฒซ ๋ฒ์งธ ์ฌ์ง์ 2๋ฐฐ ํฌ๊ฒ */
.gallery-item:first-child {
grid-column: span 2;
grid-row: span 2;
}
/* ๊ฐ๋ก๋ก ๊ธด ์ฌ์ง */
.gallery-item.wide {
grid-column: span 2;
}๋์๋ณด๋ ๋ ์ด์์
.dashboard {
display: grid;
grid-template-columns: repeat(12, 1fr); /* 12์ด ๊ทธ๋ฆฌ๋ */
gap: 16px;
padding: 24px;
}
/* ํต๊ณ ์นด๋: 12์ด ์ค 3์ด์ฉ (4๊ฐ) */
.stat-card {
grid-column: span 3;
}
/* ์ฐจํธ: 8์ด */
.chart {
grid-column: span 8;
}
/* ์ฌ์ด๋ ํจ๋: 4์ด */
.side-panel {
grid-column: span 4;
}
/* ํ
์ด๋ธ: ์ ์ฒด ๋๋น */
.data-table {
grid-column: 1 / -1; /* ์ฒ์๋ถํฐ ๋๊น์ง */
}๋ฐ์ํ ๋ ์ด์์ ์ ๋ต
Mobile First ์ ๊ทผ๋ฒ
/* ๊ธฐ๋ณธ ์คํ์ผ = ๋ชจ๋ฐ์ผ */
.container {
display: flex;
flex-direction: column;
gap: 16px;
}
/* ํ๋ธ๋ฆฟ (768px ์ด์) */
@media (min-width: 768px) {
.container {
flex-direction: row;
flex-wrap: wrap;
}
.card {
flex: 0 0 calc(50% - 8px); /* 2์ด */
}
}
/* ๋ฐ์คํฌํฑ (1024px ์ด์) */
@media (min-width: 1024px) {
.card {
flex: 0 0 calc(33.333% - 11px); /* 3์ด */
}
}๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ด ๋ฐ์ํ ๋ง๋ค๊ธฐ
/* auto-fill + minmax โ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ถํ์ */
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}clamp()๋ก ์ ๋์ ์ธ ํฌ๊ธฐ
/* clamp(์ต์๊ฐ, ๊ธฐ๋ณธ๊ฐ, ์ต๋๊ฐ) */
.title {
font-size: clamp(1.25rem, 4vw, 2.5rem);
/* ์ต์ 20px, ๋ทฐํฌํธ ๋๋น์ 4%, ์ต๋ 40px */
}
.container {
width: clamp(320px, 90%, 1200px);
/* ์ต์ 320px, ํ๋ฉด์ 90%, ์ต๋ 1200px */
margin: 0 auto;
}CSS ๋ณ์๋ก ๋ ์ด์์ ๊ด๋ฆฌ
:root {
--columns: 1;
--gap: 16px;
--sidebar-width: 0px;
}
@media (min-width: 768px) {
:root {
--columns: 2;
--gap: 24px;
}
}
@media (min-width: 1024px) {
:root {
--columns: 3;
--sidebar-width: 260px;
}
}
.grid {
display: grid;
grid-template-columns: repeat(var(--columns), 1fr);
gap: var(--gap);
}CSS ๋ ์ด์์ ๋๋ฒ๊น
Chrome DevTools Grid/Flex ์๊ฐํ
Chrome DevTools๋ Grid์ Flex ๋ ์ด์์์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ค.
- Elements ํญ์์
display: grid๋๋display: flex์์ ์ ํ - ์์ ์์ ๋ํ๋๋
grid/flex๋ฑ์ง ํด๋ฆญ - ์ค๋ฒ๋ ์ด๋ก ๊ทธ๋ฆฌ๋/ํ๋ ์ค ๋ผ์ธ, ์์ญ ์ด๋ฆ์ด ํ์๋จ
์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฒ
๋ฌธ์ 1: ํ ์คํธ๊ฐ Flex ์์ดํ ์ ๋ฐ์ด๋
/* ๋ฌธ์ : ํ
์คํธ๊ฐ ๊ธธ๋ฉด ์์ดํ
์ด ์ค์ด๋ค์ง ์์ */
.nav-item { ... }
/* ํด๊ฒฐ: min-width: 0 ์ถ๊ฐ */
.nav-item {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}๋ฌธ์ 2: Grid ์์ดํ ์ด ์์๋ณด๋ค ํผ
/* ๋ฌธ์ : ์ฝํ
์ธ ๊ฐ grid ์
์ ๋ฒ์ด๋จ */
.grid-item { ... }
/* ํด๊ฒฐ: min-width: 0 ๋๋ overflow ์ค์ */
.grid-item {
min-width: 0; /* Grid์์๋ ๋์ผํ๊ฒ ํ์ */
}๋ฌธ์ 3: box-sizing ๋ฌธ์
/* padding์ด ํฌํจ๋ ํฌ๊ธฐ ๊ณ์ฐ์ ์ํด ์ ์ญ ์ค์ ๊ถ์ฅ */
*, *::before, *::after {
box-sizing: border-box;
}๋ฌธ์ 4: z-index๊ฐ ์ ๋จนํ
z-index๋ position์ด ์ค์ ๋์ด ์๊ฑฐ๋, Flex/Grid ์์ดํ
์ธ ๊ฒฝ์ฐ์๋ง ๋์ํ๋ค.
/* z-index๊ฐ ์ ๋จนํ ๋ */
.item {
position: relative; /* ๋๋ absolute, fixed, sticky */
z-index: 10;
}๋ฌธ์ 5: Flex ์์ดํ ์ด ์์ ํฌ๊ธฐ์ ๋ค๋ฆ
/* flex-shrink: 1 ์ด ๊ธฐ๋ณธ๊ฐ์ด๋ผ ์์ดํ
์ด ์ค์ด๋ค ์ ์์ */
.item {
flex-shrink: 0; /* ์ค์ด๋ค์ง ์๊ฒ ๊ณ ์ */
}Flexbox vs Grid ์ต์ข ์ ํ ๊ฐ์ด๋
| ์ฌ์ฉ ์ฌ๋ก | Flexbox | Grid | ๋น๊ณ |
|---|---|---|---|
| ๋ฒํผ ๊ทธ๋ฃน, ํด๋ฐ | โ | - | 1์ฐจ์ ๋์ด |
| ๋ค๋น๊ฒ์ด์ ๋ฉ๋ด | โ | - | ํ ๋ฐฉํฅ ๋ฐฐ์น |
| ์นด๋/์์ดํ ์ ๋ ฌ | โณ | โ | ๋ฐ์ํ์ด๋ฉด Grid |
| ํ์ด์ง ์ ์ฒด ๋ ์ด์์ | - | โ | 2์ฐจ์ ๊ตฌ์กฐ |
| ์์ง/์ํ ๊ฐ์ด๋ฐ ์ ๋ ฌ | โ | โ | ๋ ๋ค OK |
| ์์ด์ฝ + ํ ์คํธ ์ ๋ ฌ | โ | - | ์ปดํฌ๋ํธ ๋ด๋ถ |
| ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ | - | โ | 2์ฐจ์ ๋ฐฐ์น |
| ๋ฐ์ํ ์ด ๋ ์ด์์ | โณ | โ | Grid๊ฐ ๋ ๊ฐ๊ฒฐ |
| ์ฝํ ์ธ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ๋์ ๋ฐฐ์น | โ | - | Flex๊ฐ ์ ์ฐ |
| ๊ณ ์ ๋ ์ด ๊ตฌ์กฐ (ํ ์ด๋ธํ) | - | โ | Grid๊ฐ ๋ช ํ |
๊ฒฐ๋ก : ์ปดํฌ๋ํธ ๋ด๋ถ ์ ๋ ฌ์ด๋ ํ ๋ฐฉํฅ ๋์ด์ Flexbox, 2์ฐจ์ ๋ ์ด์์๊ณผ ์ ์ฒด ํ์ด์ง ๊ตฌ์กฐ๋ Grid. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ํ๋ก๋์ UI์์๋ ๋์ ํจ๊ป ์ด๋ค.
/* ์ค๋ฌด์์ ์์ฃผ ๋ณด์ด๋ ์กฐํฉ */
.page {
display: grid;
grid-template-areas:
"header"
"main"
"footer";
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header {
grid-area: header;
display: flex; /* ํค๋ ๋ด๋ถ๋ Flex */
align-items: center;
justify-content: space-between;
}
.main {
grid-area: main;
display: grid; /* ๋ฉ์ธ ์ฝํ
์ธ ๋ Grid */
grid-template-columns: 1fr 300px;
gap: 24px;
}
.card-list {
display: grid; /* ์นด๋ ๋ชฉ๋ก๋ Grid */
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 16px;
align-content: start;
}
.card {
display: flex; /* ์นด๋ ๋ด๋ถ๋ Flex */
flex-direction: column;
}Flexbox์ Grid๋ฅผ ๋ชจ๋ ์ตํ๋ค๋ฉด ๊ฑฐ์ ๋ชจ๋ UI ๋ ์ด์์์ ๊ตฌํํ ์ ์๋ค. ์ฒ์์ ํ๋์ฉ ์จ๋ณด๋ฉด์ ์ตํ๊ณ , ์์ฐ์ค๋ฝ๊ฒ ์ํฉ์ ๋ง๊ฒ ์ ํํ๋ ๊ฐ์ด ์๊ธธ ๊ฒ์ด๋ค.
์ด์ด์ ์ฝ๊ธฐ
- ๐ ์น ์ ๊ทผ์ฑ์ ์ค์์ฑ๊ณผ ๊ธฐ๋ณธ ์์น โ ๋ ์ด์์์ ์ ๊ทผ์ฑ ์๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
- โก JavaScript ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ๊ฐ์ด๋ โ CSS์ ํจ๊ป ๋ฐฐ์ฐ๋ ํ๋ก ํธ์๋ ํต์ฌ
- ๐ท TypeScript ์ ๋ฌธ โ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ ๋จ๊ณ ์ฌ๋ ค์ฃผ๋ ํ์ ์์คํ




