6.7 KiB
6.7 KiB
Flexbox
Flexbox(플렉스박스)는 요소를 효율적으로 정렬하고 배치하는 강력한 레이아웃 시스템이야.
가로, 세로 정렬을 쉽게 제어하고, 반응형 디자인에 유용!
| 부모 속성 | 설명 | 옵션 |
|---|---|---|
| flex-direction | 주축 방향 설정 | row, row-reverse, column, column-reverse |
| justify-content | 주축 방향에서 아이템 정렬 | flex-start, flex-end, center, space-between, space-around, space-evenly |
| align-items | 교차축 방향에서 아이템 정렬 | flex-start, flex-end, center, stretch, baseline |
| align-content | 여러 줄 정렬 | flex-start, flex-end, center, space-between, space-around, stretch |
| flex-wrap | 자동 줄바꿈 | nowrap, wrap, wrap-reverse |
| flex-flow | = flex-direction + flex-wrap |
| 자식 속성 | 설명 | 옵션 |
|---|---|---|
| flex | = flex-grow + flex-shrink + flex-basis | |
| flex-grow | 남은 공간 비율 | |
| flex-shrink | 축소 비율 | |
| flex-basis | 기본 크기 | auto |
| align-self | 개별적 아이템 정렬 | auto, flex-start, flex-end, center, baseline, stretch |
| order | 순서 변경 |
Flexbox 개념 및 기본 구조
Flexbox는 **부모 요소(flex container)와 자식 요소(flex items)**로 구성돼.
.container {
display: flex;
} /* .container 내부의 모든 자식 요소가 Flex 아이템이 되어 정렬됨. */
요소들을 flexbox로 레이아웃될 때 그 상자들은 두 개의 축을 따라 배치됩니다.
- 주축 (main axis) 은 flex item이 배치되고 있는 방향으로 진행하는 축입니다. 이 기본 축의 시작과 끝을 일컬어 main start과 main end라고 합니다.
- 교차축 (cross axis) 은 flex item이 내부에 배치되는 방향에 직각을 이루는 축입니다. 이 축의 시작과 끝을 일컬어 cross start과 cross end라고 합니다.
display: flex이 설정된 부모 요소를 일컬어 플렉스 컨테이너 (flex container) 라고 합니다.- 플렉스 컨테이너 내부에 flexbox로 레이아웃되는 항목을 일컬어 플렉스 아이템 (flex items) 이라고 합니다.
display: flex 기본 효과
- flex를 적용한 요소의 자식 요소(flex items)가 한 줄에 정렬됨
- 자식 요소의 width는 자동으로 콘텐츠 크기에 맞게 조정됨
- 기본적으로 가로 방향(row) 정렬. inline 요소도 블록처럼 배치됨
.container {
display: flex;
background-color: lightgray;
}
.item {
width: 100px;
height: 50px;
background-color: skyblue;
margin: 5px;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
부모 요소(.container) 속성
Flexbox 컨테이너(부모 요소)에서 레이아웃을 조정할 수 있는 주요 속성들!
flex-direction
주축(main axis) 방향을 설정
- row : 기본값 (왼쪽 → 오른쪽 정렬)
- row-reverse : 오른쪽 → 왼쪽 정렬
- column : 위 → 아래 정렬
- column-reverse : 아래 → 위 정렬
.container {
display: flex;
flex-direction: column;
} /* 아이템이 세로 방향으로 정렬됨! */
justify-content
주축(main axis) 방향에서 아이템 정렬 방식
- flex-start : 왼쪽 정렬 (기본값)
- flex-end : 오른쪽 정렬
- center : 가운데 정렬
- space-between : 양끝 정렬 (사이 간격 자동)
- space-around : 요소 주변 간격 동일
- space-evenly : 요소 간 간격 동일
.container {
display: flex;
justify-content: center;
} /* 아이템이 가로 방향으로 가운데 정렬됨! */
align-items
교차축(cross axis) 방향에서 아이템 정렬 방식
- flex-start : 위쪽 정렬
- flex-end : 아래쪽 정렬
- center : 세로 중앙 정렬
- stretch : 높이를 컨테이너에 맞게 늘림 (기본값)
- baseline : 텍스트 기준선에 맞춤
.container {
display: flex;
align-items: center;
}
align-content
여러 줄의 아이템 정렬 방식 (flex-wrap: wrap 필요)
- flex-start : 위쪽 정렬
- flex-end : 아래쪽 정렬
- center : 가운데 정렬
- space-between : 위아래 간격 동일
- space-around : 요소 주변 간격 동일
- stretch : 전체 높이를 채움
.container {
display: flex;
flex-wrap: wrap;
align-content: center;
}
flex-wrap
flex-wrap 속성은 Flexbox 컨테이너 안의 아이템이 한 줄에 배치될지, 여러 줄로 나눠질지를 결정하는 속성이야.
기본적으로 flex는 한 줄(nowrap)에 모든 아이템을 배치하지만, flex-wrap을 설정하면 자동 줄바꿈이 가능!
- nowrap : 한 줄에 모든 아이템을 배치 (기본값)
- wrap : 자동으로 줄바꿈하여 여러 줄로 배치
- wrap-reverse : 줄바꿈 + 아이템의 줄 순서를 반대로 배치
.container {
display: flex;
flex-wrap: wrap;
} /* 아이템이 컨테이너 너비를 초과하면 다음 줄로 이동! */
자식 요소(.item) 속성
각 개별 아이템(flex items)에 적용하는 속성들!
flex-grow
컨테이너의 남은 공간을 어떻게 나눌지 설정
- 0 : 기본값 (남은 공간을 차지하지 않음)
- 1 : 동일한 비율로 남은 공간을 나눠 가짐
- 2 이상 : 비율을 설정하여 공간 차지
.item:first-child {
flex-grow: 2; /* 첫 번째 아이템이 두 배 크기 */
}
.item {
flex-grow: 1;
}
flex-shrink
공간이 부족할 때 크기가 줄어드는 비율
- 0 : 크기를 줄이지 않음
- 1 : 기본값 (동일한 비율로 축소)
- 2 이상 : 더 많이 줄어듦
.item:first-child {
flex-shrink: 2; /* 첫 번째 아이템이 두 배 더 줄어듦 */
}
flex-basis
요소의 기본 크기를 지정
- auto : 내용 크기에 따라 자동 설정
- px, % : 고정 크기 지정
.item {
flex-basis: 200px;
}
align-self
align-self는 개별 그리드(Grid) 또는 플렉스(Flexbox) 아이템의 세로 정렬을 조정하는 속성이야.
align-items가 컨테이너 내부의 모든 아이템을 정렬하는 반면, align-self는 특정 아이템 하나만 개별적으로 정렬 가능!
- auto : 부모(align-items) 설정을 따름 (기본값)
- flex-start : 위쪽 정렬
- flex-end : 아래쪽 정렬
- center : 세로 중앙 정렬
- baseline : 텍스트 기준선에 맞춤
- stretch : 컨테이너 높이에 맞게 늘어남 (기본값)
.container {
display: flex;
align-items: center; /* 모든 아이템을 세로 중앙 정렬 */
}
.item:nth-child(2) {
align-self: flex-start; /* 두 번째 아이템만 위쪽 정렬 */
}
order
아이템의 정렬 순서를 변경
- 0 : 기본값 (HTML 순서대로)
- 1, 2, 3 : 숫자가 클수록 뒤로 이동
- -1 : 앞으로 이동
.item:nth-child(2) {
order: -1; /* 두 번째 아이템을 맨 앞으로 이동 */
}