🎨 CSS Flexbox & Grid μ™„μ „ 정볡: μ–Έμ œ 뭘 써야 ν•˜λŠ”κ°€

@leekh8 Β· April 20, 2026 Β· 12 min read

CSS λ ˆμ΄μ•„μ›ƒμ„ 처음 배울 λ•Œ κ°€μž₯ 많이 λ‚˜μ˜€λŠ” 질문이 μžˆλ‹€.

"Flexboxλž‘ Grid 쀑에 뭘 써야 ν•΄μš”?"

정닡은 "λ‘˜ λ‹€ μ•Œμ•„μ•Ό ν•œλ‹€"λ‹€. 두 κΈ°μˆ μ€ μ„œλ‘œ κ²½μŸν•˜λŠ” 게 μ•„λ‹ˆλΌ λ‹€λ₯Έ 문제λ₯Ό ν•΄κ²°ν•œλ‹€. 이 글을 읽고 λ‚˜λ©΄ μ–΄λ–€ μƒν™©μ—μ„œ μ–΄λ–€ κ±Έ 써야 ν•˜λŠ”μ§€ λ°”λ‘œ νŒλ‹¨ν•  수 μžˆμ„ κ±°λ‹€.


Flexbox vs Grid β€” 핡심 차이

Grid β€” 2차원
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
Flexbox β€” 1차원
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ
μ•„μ΄ν…œ

  • 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 λ ˆμ΄μ•„μ›ƒμ„ μ‹œκ°μ μœΌλ‘œ λ³΄μ—¬μ£ΌλŠ” κΈ°λŠ₯이 μžˆλ‹€.

  1. Elements νƒ­μ—μ„œ display: grid λ˜λŠ” display: flex μš”μ†Œ 선택
  2. μš”μ†Œ μ˜†μ— λ‚˜νƒ€λ‚˜λŠ” grid / flex 뱃지 클릭
  3. μ˜€λ²„λ ˆμ΄λ‘œ κ·Έλ¦¬λ“œ/ν”Œλ ‰μŠ€ 라인, μ˜μ—­ 이름이 ν‘œμ‹œλ¨

자주 λ°œμƒν•˜λŠ” λ¬Έμ œμ™€ 해결법

문제 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 λ ˆμ΄μ•„μ›ƒμ„ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ²˜μŒμ—” ν•˜λ‚˜μ”© μ¨λ³΄λ©΄μ„œ 읡히고, μžμ—°μŠ€λŸ½κ²Œ 상황에 맞게 μ„ νƒν•˜λŠ” 감이 생길 것이닀.


κ΄€λ ¨ κΈ€

@leekh8
λ³΄μ•ˆ, μ›Ή 개발, Python을 λ‹€λ£¨λŠ” 기술 λΈ”λ‘œκ·Έ