Compit
소개문의요금제개인정보처리방침이용약관환불규정

온드(ONDE) | 대표: 노승현 | 사업자등록번호: 778-22-02215

서울특별시 광진구 긴고랑로 133-1, 401호(중곡동, 백림주택) | 전화: 010-7794-3962

© 2026 Compit. All rights reserved.
COMPIT
챌린지연습장쇼케이스학습블로그랭킹가이드보안기초
챌린지연습장쇼케이스학습블로그랭킹가이드보안기초
📐

Flexbox 인터랙티브 가이드

CSS Flexbox 속성을 직접 조작하며 시각적으로 이해하세요.
설정을 바꿀 때마다 레이아웃이 실시간으로 변합니다.

미리보기
A
B
C
D
생성된 CSS
.flex-container {
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: stretch;
  flex-wrap: nowrap;
  gap: 12px;
}

Flexbox 완전 정복 가이드

Flexbox란 무엇인가?

CSS Flexbox(Flexible Box Layout Module)는 웹 페이지 레이아웃을 효율적으로 구성하기 위해 만들어진 CSS3 레이아웃 모델입니다. 기존의 float나 position 기반 레이아웃이 가지고 있던 한계를 극복하고, 컨테이너 안의 아이템들을 유연하게 배치할 수 있도록 설계되었습니다. Flexbox는 2009년에 처음 제안된 이후 꾸준히 발전해왔으며, 현재는 모든 주요 브라우저에서 완벽하게 지원됩니다.

Flexbox의 핵심 개념은 "플렉스 컨테이너(flex container)"와 "플렉스 아이템(flex item)"입니다. 부모 요소에 display: flex를 선언하면 해당 요소가 플렉스 컨테이너가 되고, 그 안의 직계 자식 요소들이 플렉스 아이템이 됩니다. 이 간단한 선언 하나로 강력한 레이아웃 시스템을 사용할 수 있게 됩니다.

Flexbox가 등장하기 전에는 수직 가운데 정렬을 위해 transform: translateY(-50%)이나 table-cell 같은 트릭을 사용해야 했습니다. 하지만 Flexbox에서는 align-items: center 한 줄이면 충분합니다. 이러한 직관성이 Flexbox가 현대 웹 개발에서 필수 도구가 된 이유입니다.

언제 Flexbox를 사용해야 할까?

Flexbox는 1차원 레이아웃, 즉 한 방향(가로 또는 세로)으로의 정렬에 최적화되어 있습니다. 네비게이션 바의 메뉴 항목 배치, 카드 리스트의 균일한 정렬, 폼 요소의 가로 배치, 푸터 링크 그룹 등 일상적인 UI 패턴에서 가장 많이 활용됩니다. 만약 가로와 세로 두 방향을 동시에 제어해야 하는 복잡한 그리드 레이아웃이 필요하다면 CSS Grid를 고려하는 것이 좋습니다. 실무에서는 Flexbox와 Grid를 적절히 조합하여 사용하는 것이 가장 효율적입니다.

Flexbox의 가장 큰 장점 중 하나는 아이템의 크기가 유동적일 때 자동으로 공간을 분배해준다는 것입니다. flex-grow, flex-shrink, flex-basis 속성을 통해 아이템이 남은 공간을 어떻게 차지하거나 줄어들지 세밀하게 제어할 수 있습니다. 이는 반응형 웹 디자인에서 미디어 쿼리 없이도 자연스러운 레이아웃 변화를 만들 수 있게 해줍니다.

주요 Flexbox 속성 설명

flex-direction — 주축 방향 설정

flex-direction 속성은 플렉스 컨테이너의 주축(main axis) 방향을 결정합니다. 기본값은 row로, 아이템들이 왼쪽에서 오른쪽으로 가로 배치됩니다. column으로 변경하면 위에서 아래로 세로 배치됩니다. row-reverse와 column-reverse는 각각 반대 방향으로 배치합니다. 이 속성은 레이아웃의 기본 흐름을 결정하는 가장 중요한 속성이며, 반응형 디자인에서 모바일 화면에서는 column, 데스크톱에서는 row로 전환하는 패턴이 매우 흔합니다.

justify-content — 주축 정렬

justify-content는 주축 방향으로 아이템들이 어떻게 분배될지를 결정합니다. flex-start는 시작점에 몰아 배치하고, flex-end는 끝점에 몰아 배치합니다. center는 가운데 정렬을 만들어 주며, space-between은 첫 번째와 마지막 아이템을 양 끝에 놓고 나머지를 균등하게 분배합니다. space-around는 각 아이템 양옆에 같은 크기의 여백을 두고, space-evenly는 모든 여백을 완벽히 동일하게 만듭니다. 특히 네비게이션 바에서 space-between은 로고와 메뉴를 양 끝에 배치하는 데 자주 쓰입니다.

align-items — 교차축 정렬

align-items는 교차축(cross axis) 방향의 정렬을 제어합니다. 주축이 가로(row)일 때 교차축은 세로 방향이 됩니다. 기본값인 stretch는 아이템이 컨테이너의 교차축 전체 크기만큼 늘어납니다. center는 수직 가운데 정렬을 만들어 주며, flex-start와 flex-end는 각각 위쪽과 아래쪽에 정렬합니다. baseline은 텍스트의 기준선에 맞춰 정렬하는데, 크기가 다른 텍스트 요소들을 정렬할 때 유용합니다. 이 속성과 justify-content: center를 함께 사용하면 완벽한 가로세로 가운데 정렬이 가능합니다.

flex-wrap — 줄 바꿈

기본적으로 플렉스 아이템들은 한 줄에 모두 배치되려고 합니다(nowrap). 이때 아이템이 컨테이너보다 넓으면 축소되거나 넘칠 수 있습니다. flex-wrap: wrap을 설정하면 공간이 부족할 때 다음 줄로 넘어갑니다. 이 속성은 반응형 카드 그리드를 만들 때 핵심적입니다. flex-wrap: wrap과 적절한 flex-basis 값을 조합하면, 화면 크기에 따라 카드 개수가 자동으로 조절되는 유연한 레이아웃을 미디어 쿼리 없이도 구현할 수 있습니다.

gap — 아이템 간격

gap 속성은 플렉스 아이템 사이의 간격을 설정합니다. 이전에는 margin으로 간격을 조절했지만, 이 방법은 마지막 아이템에도 불필요한 마진이 붙는 문제가 있었습니다. gap은 아이템 "사이"에만 간격을 적용하므로 훨씬 깔끔합니다. row-gap과 column-gap으로 가로 세로 간격을 따로 설정할 수도 있습니다. 이 속성은 원래 CSS Grid 전용이었으나, 현재는 Flexbox에서도 모든 주요 브라우저가 지원합니다.

실전 Flexbox 레이아웃 패턴

패턴 1: 네비게이션 바

가장 보편적인 Flexbox 사용 사례 중 하나가 네비게이션 바입니다. 컨테이너에 display: flex와 justify-content: space-between을 적용하면 로고는 왼쪽에, 메뉴 항목들은 오른쪽에 자연스럽게 배치됩니다. 메뉴 항목들을 감싸는 별도의 flex 컨테이너에 gap: 1rem을 추가하면 균일한 메뉴 간격도 쉽게 만들 수 있습니다. 모바일에서는 flex-direction: column으로 전환하여 세로 메뉴로 변경하는 것이 일반적인 패턴입니다.

패턴 2: 카드 그리드

카드 레이아웃은 flex-wrap: wrap과 함께 사용하면 매우 효과적입니다. 각 카드에 flex: 0 1 calc(33.333% - 16px)를 적용하면 3열 그리드가 만들어지고, 화면이 줄어들면 자동으로 2열, 1열로 변경됩니다. 카드의 높이를 균일하게 맞추고 싶다면 align-items: stretch(기본값)를 사용하면 됩니다. 카드 내부에서도 Flexbox를 중첩하여 사용하면, 콘텐츠 양이 다른 카드에서도 하단 버튼을 항상 같은 위치에 놓을 수 있습니다. 이를 위해 카드 자체를 display: flex; flex-direction: column으로 설정하고, 버튼에 margin-top: auto를 주면 됩니다.

패턴 3: 완벽한 가운데 정렬

CSS에서 요소를 가로세로 모두 가운데 정렬하는 것은 오래된 난제였지만, Flexbox에서는 단 3줄이면 해결됩니다: display: flex; justify-content: center; align-items: center; 이것만으로 자식 요소가 컨테이너의 정확한 중앙에 위치하게 됩니다. 로그인 폼, 로딩 스피너, 에러 메시지 등 화면 정중앙에 요소를 배치해야 하는 모든 경우에 이 패턴을 활용할 수 있습니다. 컨테이너에 min-height: 100vh를 추가하면 전체 화면 가운데 정렬도 가능합니다.

패턴 4: 사이드바 레이아웃

사이드바와 메인 콘텐츠 영역의 조합도 Flexbox로 깔끔하게 구현할 수 있습니다. 컨테이너에 display: flex를 적용하고, 사이드바에 고정 너비(flex: 0 0 250px)를 주고, 메인 영역에 flex: 1을 주면 메인 영역이 남은 공간을 모두 차지합니다. 모바일에서는 flex-direction: column으로 전환하여 사이드바를 상단에 배치하면 됩니다. order 속성을 활용하면 HTML 구조를 변경하지 않고도 시각적 순서를 바꿀 수 있어, 모바일에서 메인 콘텐츠를 먼저 보여주는 것도 가능합니다.

패턴 5: 푸터 레이아웃

페이지 하단의 푸터도 Flexbox로 쉽게 구성할 수 있습니다. 여러 개의 링크 그룹을 flex-wrap: wrap과 gap을 활용하여 균등하게 배치하고, 화면이 좁아지면 자동으로 줄 바꿈이 일어나도록 할 수 있습니다. 또한 전체 페이지를 display: flex; flex-direction: column; min-height: 100vh로 구성하고 메인 콘텐츠 영역에 flex: 1을 주면, 콘텐츠가 적은 페이지에서도 푸터가 항상 화면 하단에 위치하는 "스티키 푸터" 효과를 쉽게 만들 수 있습니다.

Flexbox vs. CSS Grid: 어떤 것을 선택해야 할까?

Flexbox와 CSS Grid는 경쟁 관계가 아닌 보완 관계입니다. Flexbox는 1차원(한 방향) 레이아웃에 강하고, Grid는 2차원(행과 열 동시) 레이아웃에 강합니다. 네비게이션 메뉴, 버튼 그룹, 간단한 카드 리스트처럼 한 방향 정렬이 필요한 곳에는 Flexbox가 적합합니다. 반면 대시보드, 매거진 스타일 레이아웃, 복잡한 폼 레이아웃처럼 행과 열의 정밀한 제어가 필요한 곳에는 Grid가 더 나은 선택입니다. 실무에서는 페이지 전체 구조를 Grid로 잡고, 각 섹션 내부의 정렬은 Flexbox로 처리하는 하이브리드 접근법이 가장 효율적이고 유지보수하기도 쉽습니다. 위의 인터랙티브 도구를 활용하여 다양한 조합을 직접 실험해보세요. 코드를 복사하여 바로 프로젝트에 적용할 수 있습니다.