CSS Flexbox는 현대 웹 레이아웃의 핵심 기술로, 복잡한 레이아웃을 간단하고 직관적으로 구현할 수 있게 해줍니다. 본 가이드에서는 Flexbox의 모든 속성과 개념을 상세히 설명하고, 실전에서 바로 활용할 수 있는 레이아웃 패턴까지 알아보겠습니다.
Flexbox 소개
Flexbox란?
Flexbox(Flexible Box Module)는 일차원(행 또는 열) 레이아웃을 효율적으로 처리하기 위해 설계된 CSS3 레이아웃 모델입니다. Flexbox 이전에는 복잡한 레이아웃을 만들기 위해 float, position 등의 속성을 조합해야 했지만, Flexbox는 이러한 작업을 훨씬 간단하게 만들어 줍니다.
Flexbox가 해결하는 문제들
- 요소들의 수직 중앙 정렬
- 컨테이너 내에서 아이템 간격 동일하게 조정
- 다양한 화면 크기에 맞추어 요소 크기 자동 조정
- 요소 순서 변경 (HTML 구조 변경 없이)
- 요소들의 너비/높이 비율 유지
Flexbox 기본 개념
Flex 컨테이너와 Flex 아이템
Flexbox 레이아웃은 두 가지 주요 요소로 구성됩니다:
- Flex 컨테이너:
display: flex
또는display: inline-flex
가 적용된 부모 요소 - Flex 아이템: Flex 컨테이너의 직계 자식 요소들
<div class="flex-container">
<div class="item">아이템 1</div>
<div class="item">아이템 2</div>
<div class="item">아이템 3</div>
</div>
.flex-container {
display: flex; /* 이 요소는 이제 Flex 컨테이너가 됩니다 */
}
.item {
/* 이 요소들은 자동으로 Flex 아이템이 됩니다 */
}
주축(Main Axis)과 교차축(Cross Axis)
Flexbox의 핵심 개념 중 하나는 방향성입니다:
- 주축(Main Axis): Flex 아이템이 배치되는 기본 방향 (기본값은 좌→우)
- 교차축(Cross Axis): 주축에 수직인 방향 (주축이 가로일 때는 세로, 세로일 때는 가로)
flex-direction
속성으로 주축의 방향을 결정하며, 이는 모든 Flexbox 레이아웃의 기초가 됩니다.
Flex 컨테이너 속성
Flex 컨테이너(부모 요소)에 적용하는 속성들로, 내부 아이템들의 전체적인 배치와 정렬을 제어합니다.
display
Flexbox 레이아웃을 만드는 첫 단계입니다.
.container {
display: flex; /* 블록 레벨 Flex 컨테이너 */
/* 또는 */
display: inline-flex; /* 인라인 레벨 Flex 컨테이너 */
}
flex-direction
Flex 아이템이 배치될 주축의 방향을 설정합니다.
.container {
display: flex;
flex-direction: row; /* 기본값: 좌→우 */
/* 다른 값들 */
flex-direction: row-reverse; /* 우→좌 */
flex-direction: column; /* 상→하 */
flex-direction: column-reverse; /* 하→상 */
}
flex-wrap
Flex 아이템들이 한 줄에 모두 표시되지 않을 때의 줄바꿈 처리 방식을 설정합니다.
.container {
display: flex;
flex-wrap: nowrap; /* 기본값: 줄바꿈 없음, 필요시 아이템 축소 */
/* 다른 값들 */
flex-wrap: wrap; /* 필요시 여러 줄로 배치 */
flex-wrap: wrap-reverse; /* wrap과 유사하나 역순으로 배치 */
}
flex-flow
flex-direction
과 flex-wrap
의 단축 속성입니다.
.container {
/* flex-flow: <flex-direction> <flex-wrap>; */
flex-flow: row nowrap; /* 기본값 */
/* 다른 예시 */
flex-flow: column wrap;
flex-flow: row-reverse wrap-reverse;
}
justify-content
주축(main axis)을 따라 Flex 아이템들을 정렬하는 방식을 설정합니다.
.container {
display: flex;
justify-content: flex-start; /* 기본값: 시작점 정렬 */
/* 다른 값들 */
justify-content: flex-end; /* 끝점 정렬 */
justify-content: center; /* 중앙 정렬 */
justify-content: space-between; /* 첫/끝 아이템은 양 끝에 붙이고 나머지 공간 균등 분배 */
justify-content: space-around; /* 모든 아이템 주변에 동일한 여백 */
justify-content: space-evenly; /* 모든 아이템과 양 끝에 동일한 여백 */
}
align-items
교차축(cross axis)을 따라 Flex 아이템들을 정렬하는 방식을 설정합니다.
.container {
display: flex;
align-items: stretch; /* 기본값: 컨테이너 높이에 맞게 아이템 늘림 */
/* 다른 값들 */
align-items: flex-start; /* 교차축의 시작점에 정렬 */
align-items: flex-end; /* 교차축의 끝점에 정렬 */
align-items: center; /* 교차축의 중앙에 정렬 */
align-items: baseline; /* 텍스트 기준선에 정렬 */
}
align-content
여러 줄의 Flex 아이템들이 교차축에서 어떻게 정렬될지 설정합니다. flex-wrap: wrap
또는 wrap-reverse
일 때만 효과가 있습니다.
.container {
display: flex;
flex-wrap: wrap;
align-content: stretch; /* 기본값: 공간을 채우기 위해 아이템 늘림 */
/* 다른 값들 */
align-content: flex-start; /* 교차축 시작점에 정렬 */
align-content: flex-end; /* 교차축 끝점에 정렬 */
align-content: center; /* 교차축 중앙에 정렬 */
align-content: space-between; /* 첫/끝 줄은 양 끝에 붙이고 나머지 공간 균등 분배 */
align-content: space-around; /* 모든 줄 주변에 동일한 여백 */
}
gap, row-gap, column-gap
Flex 아이템 사이의 간격을 설정합니다. 최신 Flexbox 기능입니다.
.container {
display: flex;
gap: 20px; /* 모든 방향에 20px 간격 */
/* 또는 개별 지정 */
row-gap: 10px; /* 행 간격 */
column-gap: 20px; /* 열 간격 */
}
Flex 아이템 속성
Flex 아이템(자식 요소)에 직접 적용하는 속성들로, 개별 아이템의 크기와 정렬을 제어합니다.
order
Flex 아이템의 표시 순서를 변경합니다. 기본값은 0이며, 숫자가 작을수록 먼저 배치됩니다.
.item {
order: 0; /* 기본값 */
/* 다른 예시 */
order: -1; /* 먼저 표시 */
order: 1; /* 나중에 표시 */
}
flex-grow
Flex 아이템이 필요에 따라 늘어나는 비율을 설정합니다. 기본값은 0(늘어나지 않음)입니다.
.item {
flex-grow: 0; /* 기본값: 늘어나지 않음 */
/* 다른 예시 */
flex-grow: 1; /* 남은 공간을 차지 */
flex-grow: 2; /* flex-grow: 1인 아이템보다 2배 더 늘어남 */
}
flex-shrink
Flex 아이템이 필요에 따라 줄어드는 비율을 설정합니다. 기본값은 1(동일한 비율로 줄어듦)입니다.
.item {
flex-shrink: 1; /* 기본값: 필요시 줄어듦 */
/* 다른 예시 */
flex-shrink: 0; /* 줄어들지 않음 */
flex-shrink: 2; /* 다른 아이템보다 2배 더 많이 줄어듦 */
}
flex-basis
Flex 아이템의 초기 크기를 설정합니다. 주축 방향으로의 기본 크기입니다.
.item {
flex-basis: auto; /* 기본값: 콘텐츠 크기에 따름 */
/* 다른 예시 */
flex-basis: 100px; /* 초기 크기를 100px로 설정 */
flex-basis: 50%; /* 부모 컨테이너의 50% 크기 */
flex-basis: 0; /* 콘텐츠 크기 무시, flex-grow 비율에 따라 공간 분배 */
}
flex
flex-grow
, flex-shrink
, flex-basis
의 단축 속성입니다.
.item {
/* flex: <flex-grow> <flex-shrink> <flex-basis>; */
flex: 0 1 auto; /* 기본값 */
/* 자주 사용하는 값들 */
flex: 1; /* flex: 1 1 0%; */
flex: auto; /* flex: 1 1 auto; */
flex: none; /* flex: 0 0 auto; - 크기 고정 */
flex: 1 0 0%; /* 콘텐츠 크기 무시, 균등 분배 */
}
align-self
개별 Flex 아이템의 교차축 정렬을 설정합니다. 컨테이너의 align-items
속성을 재정의합니다.
.item {
align-self: auto; /* 기본값: 부모의 align-items 값을 상속 */
/* 다른 값들 */
align-self: flex-start;
align-self: flex-end;
align-self: center;
align-self: baseline;
align-self: stretch;
}
Flexbox 레이아웃 패턴
실제 웹 디자인에서 자주 사용되는 Flexbox 레이아웃 패턴들을 알아보겠습니다.
1. 내비게이션 바
화면 상단에 로고와 메뉴 항목들이 있는 내비게이션 바는 Flexbox의 가장 일반적인 사용 사례입니다.
<nav class="navbar">
<div class="logo">로고</div>
<ul class="menu">
<li><a href="#">홈</a></li>
<li><a href="#">소개</a></li>
<li><a href="#">서비스</a></li>
<li><a href="#">연락처</a></li>
</ul>
</nav>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background-color: #333;
color: white;
}
.menu {
display: flex;
list-style: none;
gap: 20px;
}
2. 카드 레이아웃
블로그 포스트, 제품 목록 등에서 사용되는 카드 레이아웃은 Flexbox로 쉽게 구현할 수 있습니다.
<div class="card-container">
<div class="card">카드 1</div>
<div class="card">카드 2</div>
<div class="card">카드 3</div>
<div class="card">카드 4</div>
<div class="card">카드 5</div>
<div class="card">카드 6</div>
</div>
.card-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card {
flex: 0 0 calc(33.333% - 20px);
padding: 20px;
border: 1px solid #ddd;
border-radius: 4px;
}
3. 가운데 정렬 (수직, 수평)
이전에는 복잡했던 가운데 정렬이 Flexbox를 사용하면 간단해집니다.
<div class="center-container">
<div class="centered-content">가운데 정렬된 내용</div>
</div>
.center-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* 뷰포트 높이 */
}
4. 홀리 그레일 레이아웃 (Holy Grail Layout)
헤더, 푸터, 왼쪽/오른쪽 사이드바가 있는 전통적인 웹 레이아웃입니다.
<div class="layout">
<header>헤더</header>
<div class="main-content">
<nav class="sidebar left">왼쪽 사이드바</nav>
<main>메인 콘텐츠</main>
<aside class="sidebar right">오른쪽 사이드바</aside>
</div>
<footer>푸터</footer>
</div>
.layout {
display: flex;
flex-direction: column;
min-height: 100vh;
}
header, footer {
padding: 20px;
background-color: #f5f5f5;
}
.main-content {
display: flex;
flex: 1;
}
.sidebar {
padding: 20px;
background-color: #e0e0e0;
}
.left {
flex: 0 0 200px;
}
main {
flex: 1;
padding: 20px;
}
.right {
flex: 0 0 150px;
}
5. Flex 테이블
전통적인 테이블의 대안으로, 더 유연한 반응형 테이블을 만들 수 있습니다.
<div class="flex-table">
<div class="row header">
<div class="cell">이름</div>
<div class="cell">이메일</div>
<div class="cell">전화번호</div>
</div>
<div class="row">
<div class="cell">홍길동</div>
<div class="cell">hong@example.com</div>
<div class="cell">010-1234-5678</div>
</div>
<!-- 추가 행 생략 -->
</div>
.flex-table {
display: flex;
flex-direction: column;
border: 1px solid #ddd;
}
.row {
display: flex;
}
.header {
background-color: #f5f5f5;
font-weight: bold;
}
.cell {
flex: 1;
padding: 10px;
border-bottom: 1px solid #ddd;
}
반응형 디자인과 Flexbox
Flexbox는 반응형 디자인을 구현하는 데 매우 유용합니다. 미디어 쿼리와 함께 사용하면 다양한 화면 크기에 적응하는 레이아웃을 쉽게 만들 수 있습니다.
기본 반응형 패턴
/* 기본 레이아웃 (모바일 우선) */
.container {
display: flex;
flex-direction: column;
gap: 20px;
}
/* 태블릿 */
@media (min-width: 768px) {
.container {
flex-direction: row;
flex-wrap: wrap;
}
.item {
flex: 0 0 calc(50% - 10px);
}
}
/* 데스크톱 */
@media (min-width: 1024px) {
.item {
flex: 0 0 calc(33.333% - 14px);
}
}
유용한 반응형 패턴: 내비게이션 바
/* 기본 레이아웃 (모바일) */
.navbar {
display: flex;
flex-direction: column;
}
.menu {
display: flex;
flex-direction: column;
gap: 10px;
}
/* 데스크톱 */
@media (min-width: 768px) {
.navbar {
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.menu {
flex-direction: row;
gap: 20px;
}
}
브라우저 호환성
Flexbox는 모든 현대적인 브라우저에서 지원됩니다. 다만, 일부 오래된 브라우저(특히 IE 10 이하)에서는 지원이 제한적이거나 없을 수 있습니다.
브라우저 | 버전 |
---|---|
Chrome | 29+ |
Firefox | 28+ |
Safari | 9+ |
Edge | 12+ |
Opera | 17+ |
IE | 11 (부분 지원), 10 (제한적) |
Can I Use: Flexbox에서 최신 호환성 정보를 확인할 수 있습니다.
자주 겪는 문제와 해결법 CSS
1. 요소가 예상대로 줄어들지 않는 문제
문제: Flex 아이템이 컨테이너보다 커서 넘칠 때 줄어들지 않습니다.
해결법:
- 기본적으로
min-width: auto
가 적용되어 있어 텍스트가 줄바꿈되지 않을 수 있습니다. min-width: 0
을 추가하거나overflow: hidden
을 사용해보세요.
.item {
min-width: 0;
/* 또는 */
overflow: hidden;
}
2. 간격 조정 문제
문제: Flex 아이템 사이에 일관된 간격을 만들기 어렵습니다.
해결법:
- 최신 브라우저에서는
gap
속성 사용 - 이전 방식은
margin
을 사용하거나 시각적으로 보이지 않는 가상 요소 사용
/* 최신 방식 */
.container {
display: flex;
gap: 20px;
}
/* 대체 방식 */
.container {
display: flex;
margin: -10px;
}
.item {
margin: 10px;
}
3. 줄바꿈 후 정렬 문제
문제: flex-wrap: wrap
사용 시 마지막 줄의 아이템이 예상대로 정렬되지 않습니다.
해결법:
align-content
와align-items
의 차이를 이해하고 적절히 적용- 가능하다면 그리드 레이아웃 고려
4. IE11에서의 문제
문제: IE11에서 특정 Flexbox 기능이 제대로 작동하지 않습니다.
해결법:
- 단순한 Flexbox 레이아웃 사용
- Autoprefixer 같은 도구로 벤더 프리픽스 추가
- IE11용 폴리필 또는 대체 레이아웃 고려
마무리 및 추가 학습 자료
Flexbox는 웹 레이아웃을 구성하는 강력하고 유연한 도구입니다. 기본 개념을 이해하고 실제 사례에 적용해보면 레이아웃 작업이 훨씬 쉬워집니다.
이 가이드를 통해 Flexbox의 모든 핵심 속성과 개념을 배웠습니다. 이제 더 복잡한 레이아웃에도 자신 있게 Flexbox를 적용할 수 있을 것입니다.
정리
- Flex 컨테이너 주요 속성: display, flex-direction, flex-wrap, justify-content, align-items, align-content, gap
- Flex 아이템 주요 속성: flex-grow, flex-shrink, flex-basis, flex, order, align-self
- 주요 사용 사례: 내비게이션 바, 카드 레이아웃, 중앙 정렬, 반응형 디자인
다음 단계로는 CSS Grid를 공부하여 2차원 레이아웃에 대한 이해를 넓히겠습니다.
이 글이 도움이 되었나요? 궁금한 점이나 추가 질문이 있으면 댓글로 남겨주세요. 행복한 코딩 되세요! 😊
'HTML&CSS > 레이아웃 구성' 카테고리의 다른 글
실습: Flexbox로 카드형 레이아웃 만들기 완벽 가이드 (0) | 2025.05.11 |
---|---|
CSS Position 속성 완벽 가이드: static, relative, absolute, fixed, sticky 총정리 (1) | 2025.05.11 |