📐 CSS 레이아웃 · 정렬

Flexbox 레이아웃
완전 정복 가이드

가로 정렬, 세로 정렬, 가운데 맞추기… CSS로 레이아웃 잡는 게 어려웠다면 Flexbox 하나면 끝나요.
드래그 한 번으로 바뀌는 인터랙티브 데모로 바로 익혀봐요.

⏱️ 약 15분 📅 2026년 4월 🏷️ CSS · 레이아웃 👶 입문 난이도
① 개념

Flexbox란 무엇인가요?

복잡한 float 없이 한 줄로 정렬을 완성하는 CSS 레이아웃 시스템

HTML 요소를 나란히 놓거나, 가운데 정렬하거나, 일정 간격으로 나누는 작업은 웹 개발에서 매일 하는 일이에요. 과거에는 float이나 inline-block으로 억지로 맞췄지만, Flexbox가 등장하면서 단 몇 줄의 CSS로 원하는 정렬을 만들 수 있게 됐어요.

Flexbox는 부모(Container)display: flex를 선언하면 활성화돼요. 그 순간 자식 요소(Item)들은 자동으로 가로로 나란히 줄을 서고, 부모의 속성에 따라 자유롭게 위치를 조정할 수 있어요.

📦

Container (부모)

display: flex를 선언한 요소예요. 자식 아이템들의 배치 방향, 정렬, 간격을 여기서 결정해요.

🎁

Item (자식)

Container 안에 있는 직접 자식 요소들이에요. flex, order, align-self로 개별 제어해요.

주축 (Main Axis)

아이템이 배치되는 방향이에요. 기본값은 가로(row)이고, flex-direction으로 변경해요.

교차축 (Cross Axis)

주축과 수직인 방향이에요. align-items로 이 방향의 정렬을 조정해요.

💡

언제 Flexbox를 쓰나요? 버튼 안에 아이콘+텍스트를 나란히 정렬할 때, 네비게이션 메뉴를 가로로 줄 세울 때, 카드를 일정 간격으로 나열할 때, 화면 정 가운데에 요소를 놓을 때 — 모두 Flexbox가 정답이에요. 2차원 격자 레이아웃이 필요하면 CSS Grid를 사용해요.

② 핵심 속성

꼭 알아야 할 Flexbox 속성 6가지

Container에 적용하는 속성들 — 이것만 알면 대부분의 레이아웃이 가능해요

justify-content

주축(기본: 가로) 방향 정렬. 아이템들이 좌우로 어떻게 배치될지 결정해요.

flex-startflex-end centerspace-between space-aroundspace-evenly

align-items

교차축(기본: 세로) 방향 정렬. 아이템들이 위아래로 어떻게 배치될지 결정해요.

stretchflex-start flex-endcenterbaseline

flex-direction

주축 방향을 설정해요. row(가로)가 기본이고, column으로 바꾸면 세로로 쌓여요.

rowrow-reverse columncolumn-reverse

flex-wrap

아이템이 한 줄을 넘칠 때 줄 바꿈 여부를 결정해요. 반응형 카드 그리드에 필수예요.

nowrapwrapwrap-reverse

gap

아이템 사이의 간격이에요. margin 없이 깔끔하게 간격을 줄 수 있어서 가장 실용적인 속성이에요.

8px16px24px1rem

flex (아이템 속성)

아이템이 남은 공간을 얼마나 차지할지 결정해요. flex: 1이면 균등하게 나눠가져요.

flex: 1flex: 2 flex: 0 0 autoflex: none
③ 코드

자주 쓰는 Flexbox 패턴 3가지

복붙하면 바로 쓸 수 있는 실전 코드

① 완벽한 가운데 정렬

CSS
.center-box {
  display: flex;
  justify-content: center;   /* 가로 가운데 */
  align-items: center;      /* 세로 가운데 */
  height: 200px;
}

② 양쪽 끝 정렬 (헤더 레이아웃)

CSS
.header {
  display: flex;
  justify-content: space-between; /* 로고 왼쪽, 메뉴 오른쪽 */
  align-items: center;
  padding: 0 24px;
  height: 60px;
}

.header-right {
  display: flex;
  align-items: center;
  gap: 12px; /* 메뉴 간격 */
}

③ 반응형 카드 그리드

CSS
.card-container {
  display: flex;
  flex-wrap: wrap;  /* 넘치면 다음 줄로 */
  gap: 20px;
}

.card {
  flex: 1 1 280px; /* 최소 280px, 그 이상은 균등 분배 */
  border: 1px solid #e5e7eb;
  border-radius: 12px;
  padding: 24px;
}
🤖 AI 프롬프트 TIP

"헤더에 로고는 왼쪽, 네비게이션 링크는 오른쪽에 배치해줘. Flexbox 사용해서."

"카드 4개를 가로로 나란히 배치하되, 모바일에서는 세로로 쌓이게 해줘."

④ 플레이그라운드

직접 조작해보는 Flexbox 데모

속성을 바꾸면 박스들이 실시간으로 움직여요

A
B
C
D
E
⑤ FAQ

자주 묻는 질문

Flexbox를 쓰다 보면 꼭 만나는 문제들

Flexbox와 CSS Grid의 차이가 뭔가요?
Flexbox는 1차원 레이아웃이에요. 가로 또는 세로, 한 방향으로만 아이템을 배치해요. 반면 CSS Grid는 2차원 레이아웃으로 가로와 세로를 동시에 제어할 수 있어요.

Flexbox가 적합한 경우: 네비게이션 바, 버튼 그룹, 한 줄짜리 카드 목록, 아이콘+텍스트 정렬
Grid가 적합한 경우: 신문 레이아웃, 대시보드, 행과 열이 동시에 필요한 복잡한 레이아웃

실무에서는 대부분 둘을 함께 써요. 전체 페이지 구조는 Grid, 구성 요소 내부는 Flexbox를 많이 사용해요.
flex: 1 이 정확히 무슨 뜻인가요?
flex: 1flex-grow: 1; flex-shrink: 1; flex-basis: 0%의 단축 표기예요.

flex-grow: 1 — 남은 공간이 있으면 채워 넣어요
flex-shrink: 1 — 공간이 부족하면 줄어들 수 있어요
flex-basis: 0% — 기본 크기를 0으로 시작해서 남은 공간을 균등 분배해요

여러 아이템에 모두 flex: 1을 주면 남은 공간을 1:1로 나눠 가져요. flex: 2를 주면 그 아이템은 2배 공간을 가져요.
자식 요소가 의도치 않게 줄어드는 이유가 뭔가요?
Flexbox의 기본값인 flex-shrink: 1 때문이에요. 공간이 부족하면 아이템이 자동으로 줄어들어요.

이를 막으려면:
flex-shrink: 0 — 절대 줄어들지 않게 고정
min-width: 0 — 반대로 내부 콘텐츠보다 더 줄어들 수 있게 허용 (긴 텍스트가 넘칠 때)
flex: none — grow도 shrink도 하지 않고 고정 크기 유지

이미지나 아이콘처럼 크기가 고정돼야 하는 요소에는 항상 flex-shrink: 0을 주는 게 안전해요.
세로 가운데 정렬이 안 돼요
세로 가운데 정렬이 안 되는 가장 흔한 이유는 부모 요소에 높이(height)가 없기 때문이에요. align-items: center는 부모 높이 안에서 가운데를 계산하기 때문에, 부모가 콘텐츠 높이만큼만 잡히면 효과가 없어요.

해결 방법:
• 부모에 height: 100vh 또는 고정 높이 지정
• 부모가 화면 전체를 차지하게 min-height: 100vh 사용

display: flex; align-items: center; justify-content: center; height: 100vh; — 이 4줄이면 화면 정중앙 배치가 가능해요.
IE(인터넷 익스플로러)에서도 동작하나요?
IE 10, 11에서 Flexbox가 부분적으로 지원되지만, 다양한 버그와 접두사 문제가 있어요. 현재 IE의 전 세계 점유율은 0.5% 미만이고, 마이크로소프트도 2022년에 IE를 공식 종료했어요.

2024년 기준으로 IE 지원은 일반적으로 고려하지 않아도 돼요. 한국의 공공기관·은행 서비스처럼 특수한 환경이 아니라면요.

gap 속성은 Safari 14+ (2020년)부터 지원돼요. 구버전 Safari가 걱정된다면 margin을 병행 사용하거나, caniuse.com에서 지원 범위를 확인하세요.
⑥ 다음 단계

이런 것도 배워봐요

Flexbox를 익혔다면 자연스럽게 이어지는 주제들