Saturday, October 25, 2025

레이아웃의 두 축: Flexbox와 Grid 제대로 이해하기

웹 디자인의 세계에서 레이아웃은 사용자의 경험을 좌우하는 핵심적인 요소입니다. 과거 개발자들은 테이블(table), 플로트(float), 포지션(position)과 같은 속성을 활용해 웹 페이지의 구조를 잡아나갔습니다. 하지만 이러한 방식들은 본래의 목적과 다른 방식으로 사용되면서 복잡하고 비직관적인 코드, 그리고 반응형 디자인 구현의 어려움이라는 문제를 낳았습니다. 이러한 혼돈 속에서 CSS는 두 가지 강력한 현대적 레이아웃 시스템을 제시했습니다. 바로 Flexbox와 Grid입니다. 이 두 기술은 웹 레이아웃 설계의 패러다임을 완전히 바꾸어 놓았습니다. 하지만 많은 개발자들이 여전히 "언제 Flexbox를 써야 하고, 언제 Grid를 써야 할까?"라는 질문 앞에서 망설입니다. 이 글은 두 기술의 근본적인 철학과 작동 방식을 깊이 있게 탐구하고, 명확한 사용 기준을 제시하여 여러분이 레이아웃을 설계할 때 더 이상 고민하지 않도록 돕는 것을 목표로 합니다.

1. 1차원의 지배자, Flexbox

Flexible Box Layout, 흔히 Flexbox라고 불리는 이 모듈은 이름 그대로 '유연한 상자'를 다루는 데 특화되어 있습니다. Flexbox의 핵심 철학은 '콘텐츠 중심의 1차원 레이아웃'에 있습니다. 여기서 1차원이란, 아이템들이 하나의 축(가로 또는 세로)을 따라 정렬되는 것을 의미합니다. 즉, Flexbox는 여러 아이템을 한 줄의 행(row)이나 한 줄의 열(column)로 배치하고, 그 안에서 공간을 분배하고 정렬하는 데 매우 강력한 도구입니다.

Flexbox 레이아웃을 구성하기 위해서는 부모 요소인 '플렉스 컨테이너(Flex Container)'와 그 자식 요소들인 '플렉스 아이템(Flex Item)'의 개념을 이해해야 합니다. 컨테이너에 display: flex; 또는 display: inline-flex;를 적용하는 순간, 그 내부에 있는 자식 아이템들은 Flexbox의 규칙을 따르게 됩니다.

1.1. 플렉스 컨테이너(Flex Container)의 주요 속성

컨테이너는 아이템들이 배치될 전체적인 틀과 규칙을 정의합니다. 주요 속성들은 다음과 같습니다.

display

Flexbox를 시작하는 가장 첫 단계입니다. 부모 요소에 이 속성을 적용해야 합니다.

  • flex: 컨테이너가 블록(block) 레벨 요소처럼 동작합니다.
  • inline-flex: 컨테이너가 인라인(inline) 레벨 요소처럼 동작합니다.

.container {
  display: flex; /* 또는 inline-flex */
}

flex-direction

아이템들이 정렬될 주축(main axis)의 방향을 결정합니다. 이 속성에 따라 전체 레이아웃의 흐름이 결정됩니다.

  • row (기본값): 아이템들이 가로 방향(왼쪽에서 오른쪽)으로 정렬됩니다.
  • row-reverse: 아이템들이 가로 방향(오른쪽에서 왼쪽)으로 정렬됩니다.
  • column: 아이템들이 세로 방향(위에서 아래)으로 정렬됩니다.
  • column-reverse: 아이템들이 세로 방향(아래에서 위)으로 정렬됩니다.
/* flex-direction: row; (기본값) */
+----------------------------------------+
| +-------+   +-------+   +-------+      |
| | Item 1|   | Item 2|   | Item 3|      |
| +-------+   +-------+   +-------+      |
+----------------------------------------+
 주축 (Main Axis) ---------------------->

/* flex-direction: column; */
+-------------------+
|     +-------+     |
|     | Item 1|     |
|     +-------+     |
|     +-------+     |
|     | Item 2|     |
|     +-------+     |
|     +-------+     |
|     | Item 3|     |
|     +-------+     |
+-------------------+
          |
          |  주축 (Main Axis)
          V

justify-content

주축(main axis)을 기준으로 아이템들의 정렬 방식을 결정합니다. 아이템들 사이의 공간을 어떻게 배분할지 정의하는 매우 중요한 속성입니다.

  • flex-start (기본값): 아이템들을 주축의 시작점으로 정렬합니다.
  • flex-end: 아이템들을 주축의 끝점으로 정렬합니다.
  • center: 아이템들을 주축의 중앙으로 정렬합니다.
  • space-between: 첫 아이템은 시작점에, 마지막 아이템은 끝점에 붙이고 나머지 아이템들 사이의 간격을 균등하게 분배합니다.
  • space-around: 모든 아이템들 주위에 균등한 공간을 만듭니다. 양 끝의 아이템은 다른 아이템들 사이 간격의 절반 크기의 공간을 가집니다.
  • space-evenly: 모든 아이템들 사이 및 양 끝의 간격을 완전히 동일하게 분배합니다.

align-items

교차축(cross axis)을 기준으로 아이템들의 정렬 방식을 결정합니다. 주축이 가로(row)라면 교차축은 세로가 되고, 주축이 세로(column)라면 교차축은 가로가 됩니다.

  • stretch (기본값): 아이템들이 교차축 방향으로 컨테이너의 높이(또는 너비)를 꽉 채우도록 늘어납니다. (아이템에 height/width가 지정되지 않았을 경우)
  • flex-start: 아이템들을 교차축의 시작점으로 정렬합니다.
  • flex-end: 아이템들을 교차축의 끝점으로 정렬합니다.
  • center: 아이템들을 교차축의 중앙으로 정렬합니다.
  • baseline: 아이템들의 문자 기준선(baseline)을 맞춰 정렬합니다.

flex-wrap

컨테이너에 아이템들을 한 줄에 모두 담을 공간이 없을 때, 줄바꿈을 어떻게 처리할지 결정합니다.

  • nowrap (기본값): 아이템들을 한 줄에 모두 표시하려고 시도하며, 필요하다면 아이템의 크기를 줄입니다.
  • wrap: 공간이 부족하면 아이템들을 여러 줄로 나눕니다.
  • wrap-reverse: 아이템들을 여러 줄로 나누되, 교차축의 반대 방향으로 쌓습니다.

align-content

flex-wrap: wrap;이 적용되어 아이템들이 여러 줄로 나누어졌을 때, 그 줄들 사이의 간격을 조절하는 속성입니다. justify-content의 교차축 버전이라고 생각할 수 있습니다. 한 줄만 있을 때는 아무런 효과가 없습니다.

  • stretch (기본값): 각 줄이 남은 공간을 차지하기 위해 늘어납니다.
  • flex-start: 여러 줄을 교차축의 시작점에 모읍니다.
  • flex-end: 여러 줄을 교차축의 끝점에 모읍니다.
  • center: 여러 줄을 교차축의 중앙에 모읍니다.
  • space-between: 첫 줄은 시작점에, 마지막 줄은 끝점에 붙이고 나머지 줄들 사이의 간격을 균등하게 분배합니다.
  • space-around: 모든 줄 주위에 균등한 공간을 만듭니다.
  • space-evenly: 모든 줄 사이 및 양 끝의 간격을 완전히 동일하게 분배합니다.

1.2. 플렉스 아이템(Flex Item)의 주요 속성

아이템들은 컨테이너가 정한 규칙 안에서 개별적으로 자신의 크기, 순서 등을 조절할 수 있습니다.

order

HTML 구조와 상관없이 아이템들의 시각적 순서를 변경합니다. 기본값은 0이며, 숫자가 작을수록 앞에 배치됩니다. 음수 값도 사용할 수 있습니다.

flex-grow

컨테이너에 여유 공간이 있을 때, 아이템이 그 공간을 얼마나 차지할 것인지를 결정하는 비율입니다. 기본값은 0이며, 이는 여유 공간이 있어도 늘어나지 않음을 의미합니다. 모든 아이템이 flex-grow: 1;을 가지면, 여유 공간을 모두가 균등하게 나눠 가집니다.

flex-shrink

컨테이너에 공간이 부족할 때, 아이템이 얼마나 줄어들 것인지를 결정하는 비율입니다. 기본값은 1이며, 이는 공간이 부족하면 아이템의 크기가 줄어들 수 있음을 의미합니다. 0으로 설정하면 아이템의 크기가 줄어들지 않습니다.

flex-basis

아이템이 공간을 분배받기 전의 기본 크기를 설정합니다. widthheight와 유사하게 작동하지만, 주축 방향에 따라 기준이 됩니다. auto(기본값)로 설정하면 아이템의 콘텐츠나 width/height 값에 따라 크기가 결정됩니다.

flex (단축 속성)

flex-grow, flex-shrink, flex-basis를 한 번에 쓸 수 있는 단축 속성입니다. 순서는 flex: <grow> <shrink> <basis>; 입니다.

  • flex: 0 1 auto; (기본값)
  • flex: 1; (flex: 1 1 0; 과 동일) - 아이템이 유연하게 늘어나고 줄어들며, 기본 크기는 0부터 시작하여 여유 공간을 차지합니다.
  • flex: auto; (flex: 1 1 auto; 와 동일)
  • flex: none; (flex: 0 0 auto; 와 동일) - 아이템의 크기가 변하지 않습니다.

1.3. Flexbox 사용 사례: 내비게이션 바

Flexbox의 진가는 컴포넌트 수준의 정렬에서 드러납니다. 예를 들어, 웹사이트 상단의 내비게이션 바를 만드는 경우를 생각해 봅시다. 로고, 메뉴 아이템들, 그리고 로그인 버튼을 한 줄에 정렬하고 싶을 때 Flexbox는 완벽한 해결책입니다.


<!-- HTML -->
<nav class="main-nav">
  <div class="logo">MyLogo</div>
  <ul class="nav-links">
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Products</a></li>
  </ul>
  <a href="#" class="login-button">Login</a>
</nav>

<!-- CSS -->
.main-nav {
  display: flex;
  justify-content: space-between; /* 로고, 메뉴, 버튼을 양쪽으로 분산 */
  align-items: center; /* 세로 중앙 정렬 */
  padding: 10px 20px;
  background-color: #f8f8f8;
}

.nav-links {
  display: flex; /* 메뉴 아이템들도 flex로 정렬 */
  list-style: none;
  margin: 0;
  padding: 0;
  gap: 15px; /* 아이템 사이 간격 */
}

위 코드에서 .main-nav 컨테이너는 로고, 메뉴 목록, 로그인 버튼이라는 세 개의 아이템을 가집니다. justify-content: space-between;을 통해 로고는 왼쪽에, 로그인 버튼은 오른쪽에 붙고, 메뉴 목록은 그 사이에 위치하게 됩니다. align-items: center;는 모든 아이템들의 세로 높이를 중앙으로 맞춰주어 깔끔한 정렬을 완성합니다. 이처럼 단 몇 줄의 코드로 복잡한 수직/수평 정렬을 손쉽게 구현할 수 있다는 것이 Flexbox의 가장 큰 매력입니다.

2. 2차원의 설계자, Grid

CSS Grid Layout, 줄여서 Grid는 Flexbox와는 차원이 다른 접근 방식을 가집니다. Grid의 핵심 철학은 '레이아웃 중심의 2차원 시스템'입니다. 이는 가로(행, Row)와 세로(열, Column)를 동시에 제어하여 격자무늬의 레이아웃을 만들고, 각 칸(Cell)에 원하는 아이템을 정확하게 배치하는 것을 의미합니다. 웹 페이지 전체의 큰 구조를 잡는 데 있어서 Grid는 타의 추종을 불허하는 강력함을 보여줍니다.

Grid 역시 컨테이너와 아이템의 개념을 사용합니다. 부모 요소에 display: grid;를 선언하면, 그 요소는 그리드 컨테이너(Grid Container)가 되고, 직계 자식 요소들은 그리드 아이템(Grid Item)이 됩니다.

2.1. 그리드 컨테이너(Grid Container)의 주요 속성

컨테이너는 전체 그리드의 구조, 즉 행과 열의 개수 및 크기를 정의합니다.

display

  • grid: 컨테이너를 블록 레벨 그리드 컨테이너로 만듭니다.
  • inline-grid: 컨테이너를 인라인 레벨 그리드 컨테이너로 만듭니다.

grid-template-columns / grid-template-rows

Grid의 핵심 속성입니다. 각각 그리드의 열(column)과 행(row)의 크기와 개수를 정의합니다. 다양한 단위를 사용할 수 있습니다.

  • px, rem, %: 고정적인 크기를 지정합니다.
  • fr (fraction): 사용 가능한 공간을 비율에 따라 나누어 가집니다. 예를 들어 1fr 2fr은 공간을 1:2 비율로 나눕니다.
  • auto: 콘텐츠의 크기에 맞춰 자동으로 크기가 조절됩니다.
  • repeat(): 반복되는 패턴을 간결하게 표현합니다. repeat(3, 1fr)1fr 1fr 1fr과 같습니다.
  • minmax(): 최소값과 최대값을 지정하여 유연한 크기를 만듭니다. minmax(100px, 1fr)은 최소 100px을 보장하되, 여유 공간이 있으면 1fr까지 늘어납니다.

.container {
  display: grid;
  /* 3개의 열: 첫 번째는 100px, 두 번째와 세 번째는 남은 공간을 2:1로 나눔 */
  grid-template-columns: 100px 2fr 1fr;
  /* 2개의 행: 첫 번째는 50px, 두 번째는 콘텐츠 크기에 맞춤 */
  grid-template-rows: 50px auto;
}

gap (grid-gap)

그리드 셀 사이의 간격(Gutter)을 설정합니다. row-gapcolumn-gap을 따로 설정하거나 gap 단축 속성을 사용할 수 있습니다.


.container {
  display: grid;
  gap: 20px 10px; /* row-gap: 20px, column-gap: 10px */
  /* gap: 15px; 이면 행과 열 간격 모두 15px */
}
/* gap: 10px; */
+----------+   +----------+   +----------+
|          |   |          |   |          |
|  Item 1  |   |  Item 2  |   |  Item 3  |
|          |   |          |   |          |
+----------+   +----------+   +----------+
          <---- 10px ---->
+----------+   +----------+   +----------+
|          |   |          |   |          |
|  Item 4  |   |  Item 5  |   |  Item 6  |
|          |   |          |   |          |
+----------+   +----------+   +----------+

grid-template-areas

그리드 레이아웃을 시각적으로, 그리고 의미적으로 설계할 수 있는 매우 직관적인 방법입니다. 먼저 각 아이템에 grid-area로 이름을 부여한 뒤, 컨테이너에서 그 이름들을 이용해 레이아웃을 그립니다.


.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

.container {
  display: grid;
  grid-template-columns: 1fr 3fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
}

위 코드는 2x3 그리드에서 헤더와 푸터가 두 열을 모두 차지하고, 사이드바와 메인 콘텐츠가 두 번째 행을 나누어 가지는 고전적인 레이아웃을 매우 명확하게 보여줍니다.

2.2. 그리드 아이템(Grid Item)의 주요 속성

아이템들은 정의된 그리드 내에서 자신이 위치할 시작점과 끝점을 지정하여 자리를 잡습니다.

grid-column-start / grid-column-end / grid-row-start / grid-row-end

아이템이 시작하고 끝날 그리드 라인(Grid Line)의 번호를 지정합니다. 그리드 라인은 셀의 경계선이며 1부터 시작합니다. span 키워드를 사용하여 몇 개의 셀을 차지할지 지정할 수도 있습니다.


.item-1 {
  /* 1번 세로 라인에서 시작해서 3번 세로 라인에서 끝남 (2개 열 차지) */
  grid-column-start: 1;
  grid-column-end: 3;
  
  /* 1번 가로 라인에서 시작해서 2번 가로 라인에서 끝남 (1개 행 차지) */
  grid-row-start: 1;
  grid-row-end: 2;
}

/* 단축 속성 사용 */
.item-2 {
  grid-column: 3 / 4; /* 3번 열 하나를 차지 */
  grid-row: 1 / span 2; /* 1번 행에서 시작해서 2개 행을 차지 */
}
      Line 1     Line 2     Line 3     Line 4
      +----------+----------+----------+
Line 1|          |          |          |
      |  Item-2 (col 3/4)    |          |
      |          |          |          |
Line 2+----------+----------+----------+ -----
      |                     |          |  ^
      |      Item-1         |          |  | Item-2 (row 1/span 2)
      | (col 1/3, row 2/3)  |          |  |
Line 3+---------------------+----------+ -----
      |          |          |          |
Line 4+----------+----------+----------+

grid-area

위 속성들을 한 번에 지정하는 단축 속성(grid-row-start / grid-column-start / grid-row-end / grid-column-end)이거나, grid-template-areas에서 사용할 이름을 지정하는 데 사용됩니다.

2.3. Grid 사용 사례: 웹 페이지 전체 레이아웃

Grid는 페이지 전체의 골격을 만드는 데 가장 이상적입니다. '성배(Holy Grail)' 레이아웃으로 알려진 헤더-사이드바-메인-푸터 구조를 Grid로 만들어 보겠습니다.


<!-- HTML -->
<body class="site-container">
  <header>Header</header>
  <aside class="sidebar">Sidebar</aside>
  <main>Main Content</main>
  <footer>Footer</footer>
</body>

<!-- CSS -->
.site-container {
  display: grid;
  height: 100vh;
  grid-template-columns: 200px 1fr; /* 사이드바 200px, 메인은 나머지 모두 */
  grid-template-rows: auto 1fr auto; /* 헤더, 푸터는 콘텐츠 높이, 메인은 나머지 모두 */
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}

header { grid-area: header; }
.sidebar { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }

이 코드는 단 몇 줄만으로 완벽한 2차원 구조를 만들어냅니다. 각 부분이 어디에 위치할지 grid-template-areas를 통해 명확하게 정의되어 있어, 코드를 읽는 것만으로도 레이아웃을 상상할 수 있습니다. 과거 float를 이용해 이런 레이아웃을 만들 때 겪었던 `clearfix` 핵이나 복잡한 계산이 전혀 필요 없습니다. 이것이 바로 Grid가 가져온 혁신입니다.

3. 결정적 차이: 언제 무엇을 선택할까?

이제 두 기술의 핵심을 이해했으니, 가장 중요한 질문에 답할 차례입니다. "언제 Flexbox를 쓰고, 언제 Grid를 써야 하는가?" 정답은 그들의 핵심 철학에 있습니다.

3.1. 콘텐츠 중심 vs 레이아웃 중심

가장 근본적인 차이는 접근 방식에 있습니다.

  • Flexbox는 콘텐츠 중심(Content-First)입니다. 즉, 내가 가진 아이템들을 어떻게 정렬하고 분배할 것인가에 초점을 맞춥니다. 아이템의 개수나 크기가 변하면 레이아웃이 유연하게 반응합니다. 따라서 내비게이션 메뉴, 버튼 그룹, 카드 내부 요소 정렬 등 컴포넌트 단위의 작은 레이아웃에 이상적입니다.
  • Grid는 레이아웃 중심(Layout-First)입니다. 즉, 먼저 전체적인 격자 구조를 설계하고, 그 위에 콘텐츠를 얹는 방식입니다. 행과 열로 이루어진 엄격한 구조가 필요할 때 사용됩니다. 따라서 웹 페이지 전체의 골격, 대시보드, 복잡한 폼, 이미지 갤러리 등 전체 페이지 구조나 복잡한 2차원 배치에 최적화되어 있습니다.

간단한 비유를 들자면, Flexbox는 책장의 한 칸에 책들을 나란히 꽂거나 가운데로 모으는 것과 같고, Grid는 책장 자체의 칸을 나누고 설계하는 것과 같습니다.

3.2. 1차원 vs 2차원

이것은 가장 명확한 기술적 구분 기준입니다.

  • 한 방향으로만 정렬하면 충분한가?Flexbox를 사용하세요. (예: 가로로 놓인 버튼들)
  • 가로와 세로, 두 방향 모두에서 정렬과 배치가 중요한가?Grid를 사용하세요. (예: 행과 열이 모두 중요한 달력 UI)

물론 Flexbox의 flex-wrap 속성을 사용하면 여러 줄 배치가 가능하여 2차원처럼 보일 수 있습니다. 하지만 이는 단순히 공간이 부족할 때 다음 줄로 '넘어가는' 것일 뿐, Grid처럼 각 행의 열들이 서로 정렬되어 있지는 않습니다. 아래 예시를 보면 차이가 명확합니다.

/* Flexbox with wrap */
+------------------------------------------+
| +--------+ +-------------+ +----------+ |
| | Item 1 | |   Item 2    | |  Item 3  | |
| +--------+ +-------------+ +----------+ |
| +------------+ +-------+                 |
| |   Item 4   | | Item 5|                 |
| +------------+ +-------+                 |
+------------------------------------------+
(Item 1과 Item 4는 세로로 정렬되지 않음)

/* Grid */
+----------+---------------+--------------+
| +--------+ | +-------------+ | +----------+ |
| | Item 1 | | |   Item 2    | | |  Item 3  | |
| +--------+ | +-------------+ | +----------+ |
+----------+---------------+--------------+
| +------------+ | +-------+   |            |
| |   Item 4   | | | Item 5|   | (빈 공간)  |
| +------------+ | +-------+   |            |
+----------+---------------+--------------+
(Item 1과 Item 4는 완벽하게 세로로 정렬됨)

4. 함께 사용하기: 시너지의 극대화

현대 웹 개발에서 Flexbox와 Grid는 경쟁 관계가 아닌, 서로를 보완하는 협력 관계입니다. "Flexbox냐 Grid냐"의 이분법적 사고에서 벗어나 "Flexbox와 Grid를 어떻게 함께 사용할까"를 고민해야 합니다. 가장 일반적이고 강력한 패턴은 Grid로 전체적인 페이지 구조를 잡고, 그 안에 들어가는 각 컴포넌트의 내부 정렬은 Flexbox로 처리하는 것입니다.

앞서 보았던 '성배 레이아웃' 예제를 확장해 봅시다. Grid로 만든 `<header>` 내부에 로고와 내비게이션 메뉴를 배치해야 한다면, 그 `<header>` 자체를 Flex Container로 만들어 내부 아이템들을 정렬할 수 있습니다.


<!-- HTML -->
<body class="site-container">
  <header>
    <div class="logo">MySite</div>
    <nav>...</nav>
  </header>
  <aside class="sidebar">...</aside>
  <main>...</main>
  <footer>...</footer>
</body>

<!-- CSS -->
/* Grid로 전체 구조 잡기 */
.site-container {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}

header { grid-area: header; }
/* ... 다른 grid-area 설정 ... */

/* Grid 아이템인 header 내부를 Flexbox로 정렬하기 */
header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
}

이처럼 거시적인 관점에서는 Grid를, 미시적인 관점에서는 Flexbox를 사용하는 것이 현대 CSS 레이아웃의 핵심 전략입니다. Grid 아이템이 동시에 Flex Container가 될 수 있다는 점을 기억하는 것이 중요합니다. 두 기술을 모두 자유자재로 다룰 수 있을 때, 비로소 상상하는 거의 모든 종류의 레이아웃을 효율적이고 견고하게 구현할 수 있게 될 것입니다.

결론: 명확한 목적, 올바른 도구

Flexbox와 Grid는 각각 다른 문제를 해결하기 위해 탄생했습니다. Flexbox는 한 축을 따라 흐르는 콘텐츠의 정렬과 분배에, Grid는 행과 열의 교차로 만들어지는 2차원 공간의 구획과 배치에 최적화되어 있습니다. 어느 하나가 다른 하나보다 우월한 것이 아니라, 각자의 역할과 목적이 명확히 다릅니다.

이제 여러분은 두 기술의 근본적인 차이를 이해했습니다. 다음 프로젝트에서 레이아웃을 구성할 때, 스스로에게 질문을 던져보세요.

  • "나는 지금 컴포넌트 내부의 아이템들을 한 줄로 정렬하고 있는가?" → Flexbox
  • "나는 지금 페이지 전체의 구조를 여러 행과 열로 나누고 있는가?" → Grid

이 간단한 질문이 여러분을 올바른 선택으로 이끌 것입니다. Flexbox와 Grid를 함께 사용하여 그 시너지를 경험하고, 더 이상 레이아웃 때문에 골머리를 앓지 않는 즐거운 개발을 이어나가시길 바랍니다.


0 개의 댓글:

Post a Comment