CSS Flex 완전정복
1차원 정렬의 모든 것 — 피그마 오토레이아웃과 1:1 비교
display: flex
flex-direction
justify-content
align-items
flex-grow/shrink/basis
flex-wrap
CHAPTER 01
display: flex
부모 요소에
display: flex를 선언하면 자식 요소들이 자동으로 가로로 나열돼요. 피그마 오토레이아웃과 거의 동일한 개념이에요.코드
.container {
display: flex; /* flex 활성화 — 자식들이 가로로 나열됨 */
}
/* flex 적용 전: 블록 요소라 세로로 쌓임 */
/* flex 적용 후: 자식들이 자동으로 가로로 나열 */
display: flex; /* flex 활성화 — 자식들이 가로로 나열됨 */
}
/* flex 적용 전: 블록 요소라 세로로 쌓임 */
/* flex 적용 후: 자식들이 자동으로 가로로 나열 */
라이브 프리뷰 — flex 토글
LIVE PREVIEW
아이템 1
아이템 2
아이템 3
display
💡 Flex vs Grid — Flex는 1차원(가로 또는 세로 한 방향), Grid는 2차원(가로+세로 동시). 정렬·배치엔 Flex, 레이아웃 전체 구조엔 Grid가 일반적이에요.
CHAPTER 02
flex-direction
아이템이 나열되는 방향(축)을 정해요. 피그마 오토레이아웃의 방향 설정과 완전히 일치해요.
코드
flex-direction: row; /* 기본값 — 가로 (왼→오) */
flex-direction: column; /* 세로 (위→아래) */
flex-direction: row-reverse; /* 가로 역순 (오→왼) */
flex-direction: column-reverse; /* 세로 역순 (아래→위) */
flex-direction: column; /* 세로 (위→아래) */
flex-direction: row-reverse; /* 가로 역순 (오→왼) */
flex-direction: column-reverse; /* 세로 역순 (아래→위) */
라이브 프리뷰
LIVE PREVIEW
1
2
3
4
flex-direction
🎨 피그마 오토레이아웃 방향과 1:1 매핑이에요.
row = 가로방향, column = 세로방향, reverse = 방향 뒤집기
row = 가로방향, column = 세로방향, reverse = 방향 뒤집기
CHAPTER 03
justify-content
메인축 방향으로 아이템을 어떻게 배치할지 결정해요. row면 가로, column이면 세로 방향이에요.
코드
justify-content: flex-start; /* 기본값 — 시작점 밀착 */
justify-content: flex-end; /* 끝점 밀착 */
justify-content: center; /* 가운데 정렬 */
justify-content: space-between;/* 양끝 붙이고 사이 균등 — 피그마 auto */
justify-content: space-around; /* 양쪽 여백 = 사이 여백의 절반 */
justify-content: space-evenly; /* 모든 여백 동일 */
justify-content: flex-end; /* 끝점 밀착 */
justify-content: center; /* 가운데 정렬 */
justify-content: space-between;/* 양끝 붙이고 사이 균등 — 피그마 auto */
justify-content: space-around; /* 양쪽 여백 = 사이 여백의 절반 */
justify-content: space-evenly; /* 모든 여백 동일 */
라이브 프리뷰
LIVE PREVIEW
1
2
3
justify-content
🎨
space-between이 피그마 오토레이아웃의 Auto 정렬과 같아요!CHAPTER 04
align-items
메인축과 수직 방향으로 아이템을 정렬해요. row면 세로, column이면 가로 방향이에요.
코드
align-items: stretch; /* 기본값 — 부모 높이만큼 늘어남 */
align-items: flex-start; /* 교차축 시작점 정렬 */
align-items: flex-end; /* 교차축 끝점 정렬 */
align-items: center; /* 교차축 가운데 정렬 */
align-items: flex-start; /* 교차축 시작점 정렬 */
align-items: flex-end; /* 교차축 끝점 정렬 */
align-items: center; /* 교차축 가운데 정렬 */
라이브 프리뷰 — 높이가 다른 아이템 정렬
LIVE PREVIEW — 아이템 높이가 다를 때 어떻게 정렬되는지 보여요
아이템1
짧음
짧음
아이템2
높음
높음
아이템3
짧음
짧음
align-items
⚠️ justify-content vs align-items
justify = 메인축 방향 (row면 가로, column이면 세로)
align = 교차축 방향 (row면 세로, column이면 가로)
justify = 메인축 방향 (row면 가로, column이면 세로)
align = 교차축 방향 (row면 세로, column이면 가로)
CHAPTER 05
gap
아이템 사이의 간격을 설정해요. 피그마 오토레이아웃의 gap과 완전히 동일해요.
코드
gap: 20px; /* 가로세로 동일 */
gap: 20px 10px; /* 행간격 열간격 */
column-gap: 20px; /* 가로 간격만 */
row-gap: 10px; /* 세로 간격만 */
gap: 20px 10px; /* 행간격 열간격 */
column-gap: 20px; /* 가로 간격만 */
row-gap: 10px; /* 세로 간격만 */
라이브 프리뷰
LIVE PREVIEW
아이템 1
아이템 2
아이템 3
아이템 4
gap
16px
🎨 피그마 오토레이아웃의 gap 수치와 1:1 매핑이에요! margin 대신 gap을 쓰는 게 훨씬 깔끔해요.
CHAPTER 06
flex-grow / flex-shrink / flex-basis
자식 아이템에 적용하는 속성이에요. 공간이 남거나 모자랄 때 아이템이 얼마나 늘어나고 줄어드는지 결정해요.
flex-grow — 남은 공간 나눠 갖기 (기본값 0)
/* 기본값 0 = 늘어나지 않음 */
.item { flex-grow: 0; } /* 내용 크기만큼만 차지 */
.item { flex-grow: 1; } /* 남은 공간 균등하게 차지 — 피그마 Fill */
.item { flex-grow: 2; } /* 다른 아이템보다 2배 더 차지 */
.item { flex-grow: 0; } /* 내용 크기만큼만 차지 */
.item { flex-grow: 1; } /* 남은 공간 균등하게 차지 — 피그마 Fill */
.item { flex-grow: 2; } /* 다른 아이템보다 2배 더 차지 */
라이브 프리뷰 — A, B, C의 grow 비율 조절
LIVE PREVIEW — 슬라이더로 각 아이템이 남은 공간을 얼마나 가져가는지 확인
A
grow: 1
grow: 1
B
grow: 1
grow: 1
C
grow: 1
grow: 1
A:B:C = 1:1:1 → 남은 공간을 균등하게 나눠 가져요
A grow
1
B grow
1
C grow
1
🎨
flex-grow: 1이 피그마의 Fill 모드와 같아요! grow: 0이면 내용 크기만큼만, grow: 1 이상이면 남은 공간을 비율대로 나눠 가져요.flex-shrink — 공간 부족할 때 줄어들기 (기본값 1)
/* 기본값 1 = 공간 부족하면 자동으로 줄어듦 */
.item { flex-shrink: 1; } /* 기본값 — 공간 부족하면 균등하게 줄어듦 */
.item { flex-shrink: 0; } /* 절대 줄어들지 않음 — 크기 고정 */
.item { flex-shrink: 2; } /* 다른 아이템보다 2배 더 줄어듦 */
.item { flex-shrink: 1; } /* 기본값 — 공간 부족하면 균등하게 줄어듦 */
.item { flex-shrink: 0; } /* 절대 줄어들지 않음 — 크기 고정 */
.item { flex-shrink: 2; } /* 다른 아이템보다 2배 더 줄어듦 */
라이브 프리뷰 — 컨테이너를 좁히면서 shrink 확인
LIVE PREVIEW — 컨테이너를 좁혀서 각 아이템이 얼마나 줄어드는지 확인
A
shrink: 1
shrink: 1
B
shrink: 1
shrink: 1
C
shrink: 0 🔒
shrink: 0 🔒
C는 shrink:0이라 줄어들지 않아요 — 컨테이너를 좁혀보세요
컨테이너 너비
100%
A shrink
1
B shrink
1
C shrink
0
⚠️ 기본값이 1이라서 따로 설정 안 해도 공간 부족하면 자동으로 줄어들어요.
shrink: 0으로 설정하면 줄어들지 않아서 고정 사이드바나 로고 같은 요소에 유용해요.flex-basis — 기본 크기 설정 (기본값 auto)
/* flex-basis: grow/shrink 적용 전 기본 너비 */
.item { flex-basis: auto; } /* 기본값 — 내용 크기만큼 (피그마 Hug) */
.item { flex-basis: 200px; } /* 기본 너비 200px로 시작 */
.item { flex-basis: 0; } /* 기본 크기 0 — grow 비율만으로 크기 결정 */
/* 단축 속성: flex: grow shrink basis */
.item { flex: 1; } /* = flex: 1 1 0 */
.item { flex: 0 1 auto; } /* 기본값 */
.item { flex: 0 0 200px; } /* 200px 고정 (grow도 shrink도 안 함) */
.item { flex-basis: auto; } /* 기본값 — 내용 크기만큼 (피그마 Hug) */
.item { flex-basis: 200px; } /* 기본 너비 200px로 시작 */
.item { flex-basis: 0; } /* 기본 크기 0 — grow 비율만으로 크기 결정 */
/* 단축 속성: flex: grow shrink basis */
.item { flex: 1; } /* = flex: 1 1 0 */
.item { flex: 0 1 auto; } /* 기본값 */
.item { flex: 0 0 200px; } /* 200px 고정 (grow도 shrink도 안 함) */
라이브 프리뷰 — basis 값 비교
LIVE PREVIEW — basis 값에 따라 시작 크기가 달라져요
A (짧은 텍스트)
B (조금 더 긴 텍스트)
C
auto: 각 아이템이 내용 크기만큼 공간을 차지해요
🎨
flex-basis: auto는 피그마의 Hug 모드와 같아요.flex: 1은 flex: 1 1 0의 단축이라 basis가 0부터 시작해서 grow 비율로만 크기가 결정돼요.CHAPTER 07
align-self / order
특정 아이템 하나만 개별적으로 정렬하거나 순서를 바꾸고 싶을 때 써요.
코드
/* align-self: 해당 아이템만 교차축 정렬 변경 */
.item-special { align-self: center; }
/* 부모의 align-items를 무시하고 개별 적용 */
/* order: HTML 순서 안 바꾸고 시각적 순서 변경 */
.item { order: 0; } /* 기본값 */
.first { order: -1; } /* 숫자 작을수록 앞으로 */
.last { order: 1; } /* 숫자 클수록 뒤로 */
.item-special { align-self: center; }
/* 부모의 align-items를 무시하고 개별 적용 */
/* order: HTML 순서 안 바꾸고 시각적 순서 변경 */
.item { order: 0; } /* 기본값 */
.first { order: -1; } /* 숫자 작을수록 앞으로 */
.last { order: 1; } /* 숫자 클수록 뒤로 */
라이브 프리뷰
align-self — 아이템 B만 개별 정렬
A
B
flex-start
flex-start
C
order — HTML 순서는 1,2,3인데
HTML 1번째
HTML 2번째
HTML 3번째
order: 2 / 3 / 1 → 시각적으로 3→1→2 순서
⚠️
order는 시각적 순서만 바꾸고 HTML 순서는 그대로예요. 스크린리더는 HTML 순서대로 읽어서 접근성 이슈가 생길 수 있어요!CHAPTER 08
flex-wrap / align-content
아이템이 한 줄을 넘칠 때 줄바꿈 여부와 여러 줄의 정렬 방식을 설정해요.
코드
/* flex-wrap: 줄바꿈 여부 */
flex-wrap: nowrap; /* 기본값 — 줄바꿈 없이 강제로 줄임 */
flex-wrap: wrap; /* 넘치면 다음 줄로 — 피그마 wrap */
/* align-content: wrap 됐을 때 여러 줄 정렬 */
/* 전제조건: flex-wrap: wrap + 두 줄 이상일 때만 작동 */
align-content: flex-start; /* 위쪽으로 몰기 */
align-content: center; /* 가운데 */
align-content: space-between; /* 줄 사이 균등 분배 */
flex-wrap: nowrap; /* 기본값 — 줄바꿈 없이 강제로 줄임 */
flex-wrap: wrap; /* 넘치면 다음 줄로 — 피그마 wrap */
/* align-content: wrap 됐을 때 여러 줄 정렬 */
/* 전제조건: flex-wrap: wrap + 두 줄 이상일 때만 작동 */
align-content: flex-start; /* 위쪽으로 몰기 */
align-content: center; /* 가운데 */
align-content: space-between; /* 줄 사이 균등 분배 */
라이브 프리뷰
LIVE PREVIEW — 컨테이너 너비를 줄이면 wrap 효과가 보여요
아이템 1
아이템 2
아이템 3
아이템 4
아이템 5
컨테이너 100% — 아이템 5개 × 100px = 500px 필요
flex-wrap
컨테이너 너비
100%
align-content
🎨
align-content는 wrap이 됐을 때만 작동해요 — 한 줄이면 반응 없어요.
flex-wrap: wrap이 피그마 오토레이아웃의 Wrap 모드와 같아요!align-content는 wrap이 됐을 때만 작동해요 — 한 줄이면 반응 없어요.
CHAPTER 09
실습 예제
오늘 배운 Flex 개념을 실제 사이트 레이아웃에 적용해보아요.
SBS 골프닷컴 — flex-grow + flex-basis
ul { display: flex; column-gap: 20px; }
ul > li {
flex-grow: 1; /* 남은 공간 균등 분배 */
flex-basis: 100%; /* 기본 너비 동일하게 */
overflow: hidden; /* 넘치는 텍스트 숨김 */
}
ul > li {
flex-grow: 1; /* 남은 공간 균등 분배 */
flex-basis: 100%; /* 기본 너비 동일하게 */
overflow: hidden; /* 넘치는 텍스트 숨김 */
}
LIVE PREVIEW
스카티카메론
Phantom 5
Phantom 5
스카티카메론
Phantom 7.5
Phantom 7.5
스카티카메론
Phantom 9.2R
Phantom 9.2R
스카티카메론
Phantom 11R OC
Phantom 11R OC
핀텔 — flex + flex-direction: column
section { display: flex; gap: 40px; }
.txt-box { flex: 0 0 200px; } /* 고정 너비, 줄어들지 않음 */
.list-box {
flex: 1; /* 남은 공간 채우기 */
display: flex; /* 자식도 flex */
flex-direction: column; /* 세로 배치 */
gap: 12px;
}
.txt-box { flex: 0 0 200px; } /* 고정 너비, 줄어들지 않음 */
.list-box {
flex: 1; /* 남은 공간 채우기 */
display: flex; /* 자식도 flex */
flex-direction: column; /* 세로 배치 */
gap: 12px;
}
LIVE PREVIEW
PREVAX
핀텔의 공식 기업 자료를 한곳에 담았습니다.
공시정보
재무정보
공지사항