가로 정렬, 세로 정렬, 가운데 맞추기… CSS로 레이아웃 잡는 게 어려웠다면 Flexbox 하나면 끝나요.
드래그 한 번으로 바뀌는 인터랙티브 데모로 바로 익혀봐요.
복잡한 float 없이 한 줄로 정렬을 완성하는 CSS 레이아웃 시스템
HTML 요소를 나란히 놓거나, 가운데 정렬하거나, 일정 간격으로 나누는 작업은 웹 개발에서 매일 하는 일이에요.
과거에는 float이나 inline-block으로 억지로 맞췄지만, Flexbox가 등장하면서
단 몇 줄의 CSS로 원하는 정렬을 만들 수 있게 됐어요.
Flexbox는 부모(Container)에 display: flex를 선언하면 활성화돼요.
그 순간 자식 요소(Item)들은 자동으로 가로로 나란히 줄을 서고, 부모의 속성에 따라 자유롭게 위치를 조정할 수 있어요.
display: flex를 선언한 요소예요. 자식 아이템들의 배치 방향, 정렬, 간격을 여기서 결정해요.
Container 안에 있는 직접 자식 요소들이에요. flex, order, align-self로 개별 제어해요.
아이템이 배치되는 방향이에요. 기본값은 가로(row)이고, flex-direction으로 변경해요.
주축과 수직인 방향이에요. align-items로 이 방향의 정렬을 조정해요.
언제 Flexbox를 쓰나요? 버튼 안에 아이콘+텍스트를 나란히 정렬할 때, 네비게이션 메뉴를 가로로 줄 세울 때, 카드를 일정 간격으로 나열할 때, 화면 정 가운데에 요소를 놓을 때 — 모두 Flexbox가 정답이에요. 2차원 격자 레이아웃이 필요하면 CSS Grid를 사용해요.
Container에 적용하는 속성들 — 이것만 알면 대부분의 레이아웃이 가능해요
주축(기본: 가로) 방향 정렬. 아이템들이 좌우로 어떻게 배치될지 결정해요.
교차축(기본: 세로) 방향 정렬. 아이템들이 위아래로 어떻게 배치될지 결정해요.
주축 방향을 설정해요. row(가로)가 기본이고, column으로 바꾸면 세로로 쌓여요.
아이템이 한 줄을 넘칠 때 줄 바꿈 여부를 결정해요. 반응형 카드 그리드에 필수예요.
아이템 사이의 간격이에요. margin 없이 깔끔하게 간격을 줄 수 있어서 가장 실용적인 속성이에요.
아이템이 남은 공간을 얼마나 차지할지 결정해요. flex: 1이면 균등하게 나눠가져요.
복붙하면 바로 쓸 수 있는 실전 코드
.center-box { display: flex; justify-content: center; /* 가로 가운데 */ align-items: center; /* 세로 가운데 */ height: 200px; }
.header { display: flex; justify-content: space-between; /* 로고 왼쪽, 메뉴 오른쪽 */ align-items: center; padding: 0 24px; height: 60px; } .header-right { display: flex; align-items: center; gap: 12px; /* 메뉴 간격 */ }
.card-container { display: flex; flex-wrap: wrap; /* 넘치면 다음 줄로 */ gap: 20px; } .card { flex: 1 1 280px; /* 최소 280px, 그 이상은 균등 분배 */ border: 1px solid #e5e7eb; border-radius: 12px; padding: 24px; }
"헤더에 로고는 왼쪽, 네비게이션 링크는 오른쪽에 배치해줘. Flexbox 사용해서."
"카드 4개를 가로로 나란히 배치하되, 모바일에서는 세로로 쌓이게 해줘."
속성을 바꾸면 박스들이 실시간으로 움직여요
Flexbox를 쓰다 보면 꼭 만나는 문제들
flex: 1은 flex-grow: 1; flex-shrink: 1; flex-basis: 0%의 단축 표기예요.flex: 1을 주면 남은 공간을 1:1로 나눠 가져요. flex: 2를 주면 그 아이템은 2배 공간을 가져요.
flex-shrink: 1 때문이에요. 공간이 부족하면 아이템이 자동으로 줄어들어요.flex-shrink: 0 — 절대 줄어들지 않게 고정min-width: 0 — 반대로 내부 콘텐츠보다 더 줄어들 수 있게 허용 (긴 텍스트가 넘칠 때)flex: none — grow도 shrink도 하지 않고 고정 크기 유지flex-shrink: 0을 주는 게 안전해요.
align-items: center는 부모 높이 안에서 가운데를 계산하기 때문에, 부모가 콘텐츠 높이만큼만 잡히면 효과가 없어요.height: 100vh 또는 고정 높이 지정min-height: 100vh 사용display: flex; align-items: center; justify-content: center; height: 100vh; — 이 4줄이면 화면 정중앙 배치가 가능해요.
gap 속성은 Safari 14+ (2020년)부터 지원돼요. 구버전 Safari가 걱정된다면 margin을 병행 사용하거나, caniuse.com에서 지원 범위를 확인하세요.
Flexbox를 익혔다면 자연스럽게 이어지는 주제들