Flex와 Grid의 차이점에 대해서 설명해주세요.

면접용

Flex와 Grid는 각각 다른 레이아웃 목적에 최적화된 CSS 도구입니다.

Flex는 1차원 레이아웃으로 한 축(가로 또는 세로)만 제어 가능하며 주로 수평 방향으로 레이아웃을 정렬합니다. Grid는 2차원 레이아웃으로 행(row)과 열(column)을 동시에 제어합니다. Flex는 콘텐츠 중심으로 유동적인 아이템 정렬(justify-content, align-items)에 적합합니다. 반면에, Grid는 레이아웃 중심으로 아이템크기를 미리 정의하고 셀의 크기를 일정하게 유지합니다. 즉, 고정된 구조 설계(grid-template-rows, columns)에 적합합니다. Flex는 네비게이션 바나 버튼 그룹처럼 단순 정렬이 필요할 때 유리하며, Grid는 대시보드나 카드형 UI처럼 정교한 2차원 배치가 필요한 경우 적합합니다.


개념설명

1. Flexbox란?

  • 한 방향 레이아웃 시스템을 의미합니다.

    • 아이템 배치: 가로(row) 또는 세로(column) 방향으로 배치합니다,

    • 아이템 배치: 일차원적 배치합니다,

    • x,y 동시에 제어하지 못함: 둘 중 하나를 주축으로 요소 배치합니다.

    • 메인축을 바탕으로 정렬되게됩니다.

  • 주요 개념

    • display: flex;: 부모 컨테이너를 Flexbox로 선언합니다.

    • 기본 속성: row (가로 방향)

    • 가로 선상: justify-content → 아이템의 가로 정렬합니다.

    • 세로 선상: align-items → 아이템의 세로 정렬합니다.

    • flex-direction: 정렬할 방향 지정합니다.

      • row(기본값): 왼→오 가로 방향으로 정렬합니다.

      • column: 위→아래 세로 방향으로 정렬합니다.

      • row-reverse / column-reverse: 반대 방향으로 정렬합니다.

Flexbox 주요 속성

  • 중심 축 정렬: justify-content

    • Flex Item을 중심축 방향(Main Axis)으로 정렬합니다

    • flex-start: 왼쪽으로 정렬 (기본값)합니다.

    • flex-end: 오른쪽으로 정렬합니다.

    • center: 가운데 정렬합니다.

    • space-between: 요소 간 균등한 간격 배치합니다.

    • space-around: 양쪽 여백 포함하여 간격 배치합니다.

  • 교차축 정렬: align-items

    • Flex Item을 교차축 방향(Cross Axis)으로 정렬합니다.

    • stretch: 컨테이너 크기에 맞게 늘어납니다.(기본값)

    • flex-start: 위쪽으로 정렬합니다.

    • flex-end: 아래쪽으로 정렬합니다.

    • center: 교차축 기준으로 세로 중앙에 정렬합니다.

    • baseline: 요소 내부 텍스트의 기준선을 맞춰 정렬합니다.


.container {
  display: flex; /* Flexbox 레이아웃 설정*/
  flex-direction: row; /* 가로 정렬 */
  justify-content: center; /* 가로 축 가운데 정렬 */
  align-items: center; /* 세로 축 가운데 정렬 */
}

2. Grid란?

  • 두 방향레이아웃 시스템을 의미합니다.

    • 두 방향 레이아웃 시스템 (가로, 세로)입니다.

    • 아이템 배치: 이차원으로 배치합니다.

Grid 주요 개념

  • display: grid;: 부모 컨테이너를 Grid로 선언합니다.

  • Grid Template 설정

    • grid-template-columns / grid-template-rows: 열과 행의 개수 및 크기를 설정합니다.

    • gap: 셀 사이 간격 설정합니다.

  • 반응형 크기 설정

    • repeat(): 반복적인 크기를 설정합니다.

    • minmax(): 최소/최대 크기 지정 가능합니다.

Grid 코드 예제


.container {
  display: grid;
  /* 3개의 고정 열 */
  grid-template-columns: 100px 100px 100px; 
  /* 행 크기 반복 설정 */
  grid-template-rows: 100px repeat(2, 150px); 
  /* 셀 사이 간격 */
  gap: 10px;
  }
  • 셀 크기 비율 지정

/* 부모 컨테이너를 3등분 */
grid-template-columns: 1fr 1fr 1fr;
  • 만약 2번에서 4번까지 영역을 하나로 하고싶다고 가정한다면?

.item2{
 grid-column-start:2;
 grid-column-end:4;
  /* 이렇게 축약해서 표현도 가능함! */
 grid-column: 2 / 4; 
 
 
 /*세로인 부분 차지*/
 grid-row-start:2;
 grid-row-end:4;

아이템 배치 예제


.item {
  grid-column: 2 / 4; /* 2번에서 4번 열까지 차지 */
  grid-row: 1 / 3; /* 1번에서 3번 행까지 차지 */
}

3. Flexbox와 Grid의 차이점

항목

Flexbox

Grid

레이아웃 방식

1차원 (가로 or 세로)

2차원 (가로 + 세로)

적합한 경우

단순한 콘텐츠 배치, 유연한 아이템 정렬

정교한 레이아웃 설계, 행/열 배치

정렬 기준

주축을 기준으로 아이템 정렬

전체 그리드를 템플릿으로 제어

4. 언제 Flexbox와 Grid를 사용할까요?

  • Flexbox를 사용하는 경우

    • 메뉴, 버튼 정렬처럼 단순한 한 줄 정렬이 필요할 때 사용합니다.

    • 아이템 간의 유연한 공간 분배가 중요할 때 사용합니다,

  • Grid를 사용하는 경우

    • 전체 페이지 레이아웃이나 복잡한 레이아웃을 설계할 때 사용합니다.

    • 정확히 행/열 기준으로 아이템을 배치해야 할 때 사용합니다.

Last updated