Flexbox는 CSS3에서 처음 등장한 개념으로 Flexible Box Layout을 의미합니다.
container와 item이라는 개념을 이용하여 가로 정렬, 세로 정렬 등 레이아웃을 지정해줄 수 있는 속성을 말합니다. Flexbox 등장 이전에는 요소들을 정렬하는 방법이 정해져있지가 않아 여러가지 방법(inline-block과 같은)을 사용해 우회해서 정렬을 했었습니다.
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.container {
border: 5px dashed orange;
display: flex;
}
.item {
width: 50px;
height: 50px;
border: 3px solid blue;
}
기본 용어
flex container
display: flex
를 지정해줄 영역을 말합니다.
flex item
container에 포함될 요소들을 말합니다.
main axis
main이 되는 축, 주축을 의미합니다.
cross axis
main axis와 수직을 이루는 축, 교차축을 의미합니다.
Container 관련
Container - display
display: inline
, display: block
은 해당 요소와 인접해 있는 외부 요소들과의 레이아웃
를 바꾸기 위해 사용했던 속성인데 display: flex
로 지정을 하게 되면 내부 요소들의 레이아웃
를 바꿀 수 있습니다.
- 외부, 내부 레이아웃을 둘 다 바꾸는 방법도 있는데
display: inline-flex
와 같이 hyphen('-')을 이용하면 가능합니다.
💡 display: flex는 container
에서 지정해줘야 합니다 !
💡 CSS2에서는 display: inline flex
처럼 space(' ')로 구분해줍니다.
flex-direction
레이아웃의 정렬 방향을 지정해줄 수 있습니다.
- row: 가로로 배치, 정방향
- row-reverse: 가로로 배치, 역방향
- column: 세로로 배치, 정방향
- column-reverse: 세로로 배치, 역방향
flex-wrap
item들을 강제로 한줄에 배치되게 할 것인지 여러행으로 나누어 배치되게 할 것인지 정해주는 속성입니다. (기본값: nowrap, 강제로 한 줄에 배치)
- nowrap: item들을 강제로 한 줄에 배치합니다. container 크기에 맞춰서 item들의 width, height가 변경됩니다.
- wrap: item들이 여러 행에 걸쳐서 배치됩니다. item들의 width, height값을 유지할 수 있게 됩니다.
- wrap-reverse: wrap 속성값과 동일하지만 시작점, 끝점이 반대가 됩니다.
flex-flow(shorthand)
flex-direction, flex-wrap을 한번에 지정해줄 수 있는 shorthand입니다.
flex-flow: row wrap
justify-content
- main-axis(주축) 방향으로 아이템들을 정렬할 수 있는 속성입니다.
- flex-start: 아이템들을 시작점으로 정렬합니다. (왼쪽 혹은 위쪽)
- flex-end: 아이템들을 끝점으로 정렬합니다. (오른쪽 혹은 밑에)
- center 아이템들을 가운데로 정렬합니다.
- space-between: 아이템들의 “사이(between)”에 균일한 간격을 만들어 줍니다.
- space-around: 아이템들의 “둘레(around)”에 균일한 간격을 만들어 줍니다.
align-items
- cross-axis(수직축) 방향으로 아이템들을 정렬할 수 있는 속성입니다.(기본값은 stretch)
- 한 줄만을 가지는 플렉스 박스에서는 효과가 없으며, 두 줄 이상을 가지는 플렉스 박스에서만 효과가 있습니다.
- 다음과 같은 속성값을 설정할 수 있습니다.
- stretch : 플렉스 요소의 높이가 플렉스 컨테이너의 높이와 같게 변경된 뒤 연이어 배치됩니다.
- flex-start : 플렉스 요소는 플렉스 컨테이너의 위쪽에 배치됩니다.
- flex-end : 플렉스 요소는 플렉스 컨테이너의 아래쪽에 배치됩니다.
- center : 플렉스 요소는 플렉스 컨테이너의 가운데에 배치됩니다.
- baseline : 플렉스 요소는 플렉스 컨테이너의 기준선(baseline)에 배치됩니다.
align-content
flex-wrap: wrap;
이 설정된 상태에서, 아이템들의 행이 2줄 이상 되었을 때의 수직축 방향 정렬을 결정하는 속성입니다.
Item 관련
order
flex, grid 컨테이너 안에서 현재 요소의 배치 순서를 결정할 수 있는 속성입니다.
기본값은 0이며 음수, 양수를 지정하여 맨 앞, 맨 뒤로 배치를 변경할 수 있게 됩니다.
내용을 변경하지 않고 출력 순서만 변경해줄 때 사용합니다. 논리 순서가 변하지 않으므로 order를 통해 순서를 변경했다면 tab키를 눌렀을 때 focus가 보이는 것과 다르게 동작할 수 있습니다.
flex-grow
- item이 container 내부에서 차지하는 공간의 크기를 결정할 수 있는 속성입니다. 기본값은 0입니다.
- flex-grow: 1로 설정하게 되면 남아있는 모든 공간을 item의 갯수로 나눠서 설정된 width값 보다 더 넓게 설정하게 됩니다. 소숫점으로도 값을 지정할 수 있습니다.
- item들이 각각 다른 flex-grow값을 갖게 된다면 값에 비례하는 공간값을 나누어서 할당받게 됩니다.
- container에
flex-wrap: nowrap
을 설정하면 여러 줄로 배치되어 나눠진 item들이 각각의 줄에서 내부공간을 차지하게 됩니다.

- 해당 라인에 있는 item들의 길이를 모두 더한 값이 container보다 작을 때만 동작합니다.
flex-shrink
- flex-grow와 비슷한 속성입니다. flex-grow는 늘어나는데 비해 flex-shrink는 줄어드는 값을 지정해주는 속성입니다.
- 해당 라인에 있는 item들의 길이를 모두 더한 값이 container보다 클 때만 동작합니다.
- 음수를 제외한 실수 범위의 수를 속성값으로 가질 수 있습니다.
flex-basis
- item의 초기 크기(grow, shrink되지 않은 기본 크기)를 지정할 수 있는 속성입니다.
- flex-basis
flex(shorthand)
flex-grow, flex-shrink, flex-basis
align-self
- Item을 수직축으로 정렬해주는 속성입니다. align-items가 전체 아이템에 대해 수직축으로 정렬해주는 속성이라면 align-self는 해당 아이템을 수직축으로 정렬해주는 속성입니다.