[CSS 공부] Flexbox와 Grid 모델

Photo of author

By OKePaPa

| 업데이트 :

float를 이용한 레이아웃 구현 방법은 약간 구식으로 여겨집니다. 복잡한 레이아웃을 생성하는데는 현대 CSS 레이아웃 기술인 flexbox나 grid가 권장됩니다. 복잡한 레이아웃 생성을 위해 안정적으로 사용할 수 있는 flexbox나 grid 모델에 대해서 알아봅니다.

안정적인 레이아웃 모델 Flexbox와 Grid 모델 개요

FlexboxGrid는 CSS의 레이아웃 모델로, 복잡한 레이아웃을 쉽게 만들 수 있도록 도와주는 기능입니다.

  1. Flexbox (Flexible Box): Flexbox는 1차원 레이아웃 모델로, 주 축(main axis)과 교차 축(cross axis)를 중심으로 아이템들을 조정합니다. Flexbox를 사용하면 아이템 간 간격을 쉽게 조절할 수 있고, 화면 크기에 따라 유연하게 아이템 크기를 조절할 수 있습니다.

.container {
    display: flex;
}

위 예제에서 .container 클래스가 붙은 요소 내부의 아이템들은 flex item으로 취급되어 배치됩니다.

  1. Grid: Grid는 2차원 레이아웃 모델로, 행(row)과 열(column)을 기준으로 아이템들을 배치합니다. Grid를 사용하면 복잡한 레이아웃도 손쉽게 구현할 수 있으며, 비율 기반의 디자인을 적용하기에 용이합니다.

.container {
    display: grid;
}

위 예제에서 .container 클래스가 붙은 요소 내부의 아이템들은 grid item으로 취급되어 배치됩니다.

두 방식 모두 반응형 웹 디자인에 매우 유용하며, 상황에 따라 적절한 방식을 선택하여 사용하면 됩니다. 일반적으로 Flexbox는 단일 축(수직 혹은 수평)에서의 요소 배치가 필요할 때 주로 사용되고, Grid는 행과 열 모두에서 복잡한 배치가 필요할 때 주로 사용됩니다.

Flexbox 모델

Flexbox, 즉 Flexible Box Model은 CSS의 레이아웃 모델 중 하나로, 아이템 간 공간 배분과 정렬을 쉽게 할 수 있도록 도와줍니다. 이는 1차원 레이아웃 모델로, 주 축(main axis)과 교차 축(cross axis)를 중심으로 아이템들을 조정합니다.

Flexbox의 주요 특징:

  1. Flexible Width/Height: Flexbox의 핵심 기능 중 하나는 요소의 너비와 높이를 유연하게 조절하는 것입니다. 이를 통해 다양한 화면 크기에 대응하는 반응형 디자인을 쉽게 구현할 수 있습니다.
  2. Ordering: Flexbox에서는 HTML 소스 코드 순서와 상관없이 flex item들의 순서를 변경할 수 있습니다.
  3. Alignment: Flexbox는 컨테이너 내에서 아이템들을 가로 혹은 세로축 기준으로 쉽게 정렬할 수 있습니다.

주요 사용처:

Flexbox는 다음과 같은 경우에 유용하게 사용됩니다:

  • 동일한 간격으로 아이템들을 배치하고 싶을 때
  • 여러 줄에 걸쳐 아이템들을 배치하고 싶을 때
  • 화면 크기에 따라 유동적으로 요소 크기와 위치를 조절하고 싶을 때

예시:

.container {
    display: flex;
    justify-content: space-between;
}

.item {
    flex-grow: 1;
}

위 예제에서 .container 클래스가 붙은 요소 내부의 아이템들은 flex item으로 취급되어, justify-content 속성에 의해 서로 사이에 공간(space-between)을 두고 배치됩니다.

또한 .item 클래스가 붙은 각각의 flex item은 flex-grow 속성 값 1만큼 비율로 공간 확장 가능성(grow factor)가 부여됩니다. 이 경우 모든 item들에 동일한 flex-grow 값(=1)가 설정되어 있으므로, item들 사이에 균등한 공간 비율을 유지하며 container공간 안에서 유연하게 넓어집니다.

Grid 모델

Grid는 CSS의 레이아웃 모델 중 하나로, 2차원(행과 열)의 레이아웃을 생성할 수 있습니다.

Grid의 주요 특징:

  1. 2D Layouts: Grid는 행과 열 모두에 걸쳐 요소를 배치할 수 있어 복잡한 2차원 레이아웃을 만드는 데 유용합니다.
  2. Placement Control: Grid 아이템은 그리드 셀 내에서 자유롭게 배치될 수 있으며, 이를 통해 복잡한 디자인을 쉽게 구현할 수 있습니다.
  3. Flexible and Fixed Track Sizes: 그리드 트랙(행 혹은 열)의 크기는 고정값, 비율, 내용물에 기반한 크기 등 다양하게 지정될 수 있습니다.
  4. Alignment Control: Flexbox와 마찬가지로 Grid도 컨테이너와 아이템 간 정렬 및 간격 조절을 손쉽게 할 수 있습니다.

주요 사용처:

Grid는 다음과 같은 경우에 유용하게 사용됩니다:

  • 복잡한 2차원 레이아웃을 만들고 싶을 때
  • 아이템 간 일관된 간격을 유지하고 싶을 때
  • 화면 크기에 따라 유동적으로 요소 크기와 위치를 조절하고 싶을 때

예시:

.container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
}

.item {
    background-color: #ddd;
}

위 예제에서 .container 클래스가 붙은 요소 내부의 아이템들은 grid item으로 취급되어 배치됩니다. grid-template-columns 속성으로 컨테이너를 세 개의 동일한 넓이(fr)로 나눕니다. gap 속성으로 그리드 아이템 사이의 간격(gutter)를 설정합니다.

.item 클래스가 붙은 각각의 grid item은 배경색(#ddd)가 지정되어 보여집니다.

Flexbox와 Grid 모델의 차이점과 특성 비교

Flexbox와 Grid 모두 CSS 레이아웃을 구성하는 방식이지만, 각각의 특성과 사용처는 다릅니다.

Flexbox

  1. 1차원 레이아웃: Flexbox는 주로 한 축(수평 혹은 수직)을 기준으로 요소들을 배치합니다. 따라서 단일 방향의 레이아웃에 최적화되어 있습니다.
  2. 콘텐츠 기반: Flexbox는 콘텐츠를 중심으로 레이아웃을 조절합니다. 즉, 요소의 크기나 위치를 그 안에 들어있는 콘텐츠에 맞춰 유연하게 조정할 수 있습니다.
  3. 주요 사용처: 단일 방향의 배치가 필요한 경우(예: 메뉴 바, 폼 항목 등), 아이템 간 공간 분배와 정렬 등을 처리하는 경우에 유용합니다.

Grid

  1. 2차원 레이아웃: Grid는 행과 열 모두를 다룰 수 있는 2차원 라우팅 시스템입니다. 따라서 복잡한 2차원 라우팅 구조를 만드는 것에 최적화되어 있습니다.
  2. 레이아웃 기반: Grid는 전체 페이지나 섹션의 뷰를 제어하기 위해 설계되었습니다. 이를 통해 복잡한 인터페이스와 정교한 디자인 패턴도 손쉽게 구현할 수 있습니다.
  3. 주요 사용처: 복잡한 2D 배치가 필요한 경우(예: 이미지 갤러리, 카드 UI 등), 공간 분할 및 요소 정렬 등 전체적인 페이지 구조 설계에 유용합니다.

비교:

  • Flexbox는 주로 한 축에서 작동하므로 단일 열 혹은 단일 행에서 아이템들 사이의 공간 분배와 정렬을 처리하는 것에 최적화되어 있습니다.
  • Grid는 2차원(열과 행 모두)에서 작동하므로 복잡한 인터페이스와 다양한 컬럼 레이아웃을 가진 디자인에 적합합니다.

실제 웹 개발에서는 Flexbox와 Grid를 상황에 따라 적절히 혼용하여 사용하는 것이 일반적입니다. 두 기술은 서로 보완적인 관계에 있으며, 복잡한 UI와 반응형 디자인을 구현하는데 함께 활용될 수 있습니다.