정의 및 사용 방법
flex는 플렉스 아이템의 '주축 방향의 크기'를 결정하는 다음의 구성 속성들을 한 번에 지정할 수 있는 단축 속성(shorthand property)입니다.
주축 방향의 크기란
플렉스 컨테이너(부모)의 flex-direction 속성으로 지정된 플렉스 아이템의 배치 방향이 '가로 축'일 때는 '너비'를, '세로 축'일 때는 '높이'를 말합니다.
꼭 알아두세요!
플렉스 레이아웃의 큰 특징 중 하나는 플렉스 아이템의 크기를 유연하게 조정할 수 있다는 점입니다.
플렉스 아이템의 주축 방향의 크기는 flex-basis, flex-grow, flex-shrink 속성이 함께 작동하여 최종 크기를 결정한다는 것을 알아야 합니다.
- 브라우저는 먼저 플렉스 아이템들의
flex-basis값을 합산하여 플렉스 컨테이너(부모) 내의 남는 공간을 파악합니다. - 남는 공간이 있다면, 플렉스 아이템들은 각각
flex-grow속성의 설정 값에 따라 비율대로 나누어 크기를 키우거나 그대로 둘지를 결정하며, - 남는 공간이 없이 부족하다면, 플렉스 아이템들은 각각
flex-shrink속성의 설정 값에 따라 비율대로 나누어 크기를 축소하거나 그대로 둘지를 결정합니다.
플렉스 아이템의 크기를 제어할 때는 각 속성을 따로 사용하는 것보다는
flex 단축 속성을 사용하여 유연한 크기 조정에 필요한 모든 구성 속성을 한 번에 제어하는 것이 좋습니다.
flex 단축 속성은 생략된 구성 속성의 값을 함께 재설정(reset)하므로, 예상하지 못한 크기 계산 결과를 줄이는 데 도움이 됩니다.
특징
기본 예제
<div class="flex-container">
<div class="item item-1">item-1</div>
<div class="item item-2">item-2</div>
<div class="item item-3">item-3</div>
</div>
.flex-container { /* 플렉스 컨테이너 */
display: flex;
border: 4px dashed silver;
padding: 5px;
flex-direction: row; /* 플렉스 아이템의 배치 방향이 '가로 축'이므로
플렉스 아이템의 주축 방향의 크기는 '너비'가 됨 */
}
.item { /* 플렉스 아이템 */
padding: 1em;
border: 4px solid blue;
background-color: yellow;
}
.item-1 {
/* flex-grow=0, flex-shrink=0, flex-basis=100px */
flex: 0 0 100px;
}
.item-2 {
/* flex-grow=0, flex-shrink=1, flex-basis=10px */
flex: 0 1 10px;
}
.item-3 {
/* flex-grow=1, flex-shrink=1, flex-basis=auto */
flex: 1 1 auto;
}
형식 구문
selector {
flex: <'flex-grow'> <'flex-shrink'>? || <'flex-basis'>
}
/* 또는 */
selector {
flex: none
}
기호 읽는 법:
?: 이 속성은 생략할 수 있습니다.||: 앞뒤 순서가 바뀌어도 괜찮습니다.
값
<'flex-grow'> |
flex-grow 속성의 값에 해당합니다.
|
|---|---|
<'flex-shrink'> |
flex-shrink 속성의 값에 해당합니다.
|
<'flex-basis'> |
flex-basis 속성의 값에 해당합니다.
주의하세요!
0을 지정하려면 <'flex-grow'> 또는 <'flex-shrink'>로 읽히지 않도록 단위(예: 0%, 0px)를 명시하는 것이 좋습니다.
|
none |
flex: 0 0 auto와 동일하게 설정됩니다. |
값 지정하기
flex 속성은 세 개, 두 개, 한 개의 값으로 지정할 수 있습니다.
세 개 값
띄어쓰기로 구분하여 반드시 <'flex-grow'> <'flex-shrink'> <'flex-basis'> 순서대로 값을 지정해야 합니다.
/* flex-grow=0, flex-shrink=0, flex-basis=100px */
flex: 0 0 100px;
/* flex-grow=0, flex-shrink=1, flex-basis=10px */
flex: 0 1 10px;
/* flex-grow=1, flex-shrink=1, flex-basis=auto */
flex: 1 1 auto;
두 개 값
띄어쓰기로 구분하여 첫 번째 값은 반드시 <'flex-grow'>를 지정하고, 두 번째 값은 <'flex-shrink'> 또는 <'flex-basis'>를 지정해야 합니다.
지정하는 두 번째 값에 따라 고려해야 할 점이 있습니다.
<'flex-shrink'>가 두 번째 값이면, 생략한<'flex-basis'>는0%로 설정됩니다.<'flex-basis'>가 두 번째 값이면, 생략한<'flex-shrink'>는1로 설정됩니다.-
이때,
<'flex-basis'>값을0으로 지정하려면,<'flex-shrink'>의 값으로 읽히지 않도록 반드시 단위(예:0%,0px)를 명시해야 합니다.
-
이때,
/* flex-grow=1, flex-shrink=2, flex-basis=0% */
flex: 1 2;
/* flex-grow=1, flex-shrink=1, flex-basis=0px */
flex: 1 0px;
한 개 값
한 개의 값만을 지정할 수 있습니다. 그 의미는 다음과 같습니다.
0이상의 실수(정수와 소수점 가능)를 사용해서 지정하면 그 값은<'flex-grow'>입니다.-
생략한
<'flex-shrink'>는1로 설정됩니다. -
생략한
<'flex-basis'>는0%로 설정됩니다.
-
생략한
width속성에서 사용하는 값의 종류들(<길이>|<백분율(%)>|<키워드>)를 사용해서 지정하면 그 값은<'flex-basis'>입니다.-
이때,
<'flex-basis'>값을0으로 지정하려면,<'flex-grow'>의 값으로 읽히지 않도록 반드시 단위(예:0%,0px)를 명시해야 합니다. -
생략한
<'flex-grow'>는0으로 설정됩니다. -
생략한
<'flex-shrink'>는1로 설정됩니다.
-
이때,
none값을 지정할 수 있습니다.-
flex: 0 0 auto와 동일하게 설정됩니다.
-
- CSS의 모든 속성에서 사용할 수 있는 글로벌 값들(
inherit,initial,revert,revert-layer,unset)을 지정할 수 있습니다.
/* flex-grow=1, flex-shrink=1, flex-basis=0% */
flex: 1;
/* flex-grow=0, flex-shrink=1, flex-basis=100px */
flex: 100px;
/* flex-grow=0, flex-shrink=1, flex-basis=auto */
flex: auto;
/* flex-grow=0, flex-shrink=0, flex-basis=auto */
flex: none;
/* 글로벌 값 */
flex: inherit;
flex: initial; /* 0 1 auto */
flex: revert;
flex: revert-layer;
flex: unset;
유연하지 않은 플렉스 아이템 만들기
플렉스 레이아웃의 큰 특징 중 하나는 플렉스 아이템의 크기를 유연하게 조정할 수 있다는 점이지만, 때때로 이 유연함을 없애야 할 때가 있습니다.
- 플렉스 아이템에
flex-grow: 0을 설정하는 것은,
해당 플렉스 아이템의 크기를 계산할 때 플렉스 아이템들의flex-basis값을 합산하여 플렉스 컨테이너(부모) 내의 남는 공간을 플렉스 아이템들과 나누어 키울 때, 해당 플렉스 아이템이 차지할 비율 값을0으로 설정한다는 것입니다. 즉, 해당 플렉스 아이템은 크기를 키우는 비율에 포함시키지 않는다는 의미로, 남는 공간이 있더라도 크기를 키우지 않고 그대로 둔다는 의미와 동일합니다. - 플렉스 아이템에
flex-shrink: 0을 설정하는 것은,
해당 플렉스 아이템의 크기를 계산할 때 플렉스 아이템들의flex-basis값을 합산하여 플렉스 컨테이너(부모) 내의 부족한 공간을 플렉스 아이템들과 나누어 축소시킬 때 해당 플렉스 아이템이 차지할 비율 값을0으로 설정한다는 것입니다. 즉, 해당 플렉스 아이템은 크기를 축소시는 비율에 포함시키지 않는다는 의미로, 부족한 공간이 있더라도 크기를 축소시키지 않고 그대로 둔다는 의미와 동일합니다.
예제
다음은 플렉스 아이템의 크기를 완전히 비유연적으로 만드는 예제입니다.
플렉스 레이아웃의 장점을 활용하면서도 플렉스 아이템의 너비나 크기를 상황에 맞게 명시적으로 지정해야 할 때 유용합니다.
<div class="flex-container">
<div class="item item-1">item-1</div>
<div class="item item-2">item-2</div>
<div class="item item-3">item-3</div>
</div>
.flex-container { /* 플렉스 컨테이너 */
display: flex;
border: 4px dashed silver;
padding: 5px;
flex-direction: row; /* 플렉스 아이템의 배치 방향이 '가로 축'이므로
플렉스 아이템의 주축 방향의 크기는 '너비'가 됨 */
}
.item { /* 플렉스 아이템 */
padding: 1em;
border: 4px solid blue;
background-color: yellow;
/* 유연성을 제거하여 폭을 고정함 (flex: 0 0 auto) */
flex: none;
}
/* flex-basis: auto는 주축 방향이 '가로 축'이면 width 값을 너비의 크기로 사용 */
.item-1 {
width: 50px;
}
.item-2 {
width: 100px;
}
.item-3 {
width: 150px;
}
flex 속성 값에 대한 제약 조건
- 주축 방향이 '가로 축'이면
- 주축 방향이 '세로 축'이면
-
min-height가 설정되어 있는 경우 -
max-height가 설정되어 있는 경우
-
flex-basis값이auto로 설정되어 있고aspect-ratio가 설정되어 있는 경우
형식 정의
| 초깃값 | 0 1 auto |
|---|---|
| 적용 요소 | 플렉스 아이템 |
| 상속 | 아니오 |
| 애니메이션 |
|
브라우저 호환성
| 속성과 값 |
데스크탑 Chrome
|
데스크탑 Edge
|
데스크탑 Firefox
|
Safari
|
|---|---|---|---|---|
flex
|
29 | 12 | 20 | 9 |
content
|
94 | 94 | 61 | 15.4 |
fit-content
|
94 | 94 | 94 | 16 |
max-content
|
94 | 94 | 66 | 16 |
min-content
|
94 | 94 | 66 | 16 |
명세서
| 명세서 사양 | |
|---|---|
flex
|
CSS Flexible Box Layout Module Level 1 #flex-property |