본문 바로가기
CSS

CSS flexbox: flex-item의 크기 조절

by 슥짱 2022. 1. 24.

flexbox는 레이아웃, 정렬을 위해 가장 많이 사용하는 CSS 속성이다. flexbox의 사용이 너무나 익숙해져서 이젠 모르는 것이 없다고 생각했는데... 뭔가 잘못 사용하고 있었음을 이번에 깨닳았다. 가끔 사용하던 flex-grow 속성의 사용법이 잘못 되었는데, 그동안은 잘못 작성한 코드가 우연히 내 의도와 맞아 떨어져서 알아채지 못했던 것이다. 이번 기회에 다시 공부한 flexbox의 크기 조절 속성을 정리할 겸 공유하고자 한다.


flex-basis

flex-basis는 아이템의 기본 크기를 결정하는 속성이다. 값으로 auto, content 또는 원하는 수치를 넣을 수 있다. 기본 값은 auto이다.

 

. item {
    flex-basis: auto;
    flex-basis: content;

    /* 원하는 값을 적을 수도 있다 */
    flex-basis: 10px;
    flex-basis: 100%;
    flex-basis: 1em;
}

 

  • auto: 아이템의 width가 있는지의 여부에 따라 다르게 동작한다. width가 있는 경우 그대로 width 값을 따르고, width가 없는 경우 content와 같이 동작한다.
  • content: 아이템의 내용 크기만큼 공간을 갖는다.
  • <수치 값>: 100%, 10px과 같이 width에 주던 값을 쓸 수 있다. 기본적으로 아이템의 크기가 입력한 수치만큼 차지하지만, 내용의 크기가 지정한 수치보다 크면 그만큼 늘어난다. 만약 width 속성과 같이 적용하면, width 속성이 우선적으로 적용된다.

flex-grow

flex-grow는 아이템들을 모두 배치하고 남는 컨테이너의 여백을 각 아이템들에게 어떻게 분배해줄지 결정하는 속성이다. 이해를 돕기 위해 그림으로 표현해 보았다. 모든 아이템에 flex-grow를 1로 동일한 비율로 분배하면, 아래와 같이 여백이 분배되는 것이다.

나의 경우 매번 flexbox를 다룰 때 아이템들에 같은 width를 부여한 채로, 동일한 너비를 유지할 수 있게 flex-grow: 1을 주었기 때문에 flex-grow가 flex-basis의 역할까지 한다고 오해하고 있었다. 이전의 나와 같이 엉뚱하게 이해하고 사용할 사람들이 생기지 않도록 다시 강조한다. 전체 너비를 분배하는 것이 아니라 여백을 분배하는 것이다!

flex-shrink

flex-grow와 반대되는 속성이다. 아이템들의 너비의 합이 컨테이너보다 클 때, flex-shrink에 설정된 비율만큼 축소한다. 기본 값은 1이기 때문에 기본적으로 모두 동일한 비율로 축소된다.

flex

앞서 본 세 가지를 한 줄에 적을 수 있는 축약형 속성이다. 아래 예시와 같은 형태로 작성하며, 순서는 flex-grow, flex-shrink, flex-basis이다.

 

.item {
    /* flex-grow: 1; flex-shrink: 1; flex-basis: auto; */
    flex: 1 1 auto;
}

 

initial, auto와 같이 미리 정의된 값을 사용할 수도 있다.

 

  • initial: 0 1 auto로 지정한 것과 같다. 아이템은 지정된 값보다 커지지는 않지만 공간이 부족하면 축소한다.
  • auto: 1 1 auto와 같다. 컨테이너 공간이 늘어나면 남은 부분만큼 아이템이 늘어난다.
  • none: 0 0 auto와 같다. 컨테이너 크기 변화에 영향을 받지 않는다.
  • <number>: 한 자리 숫자만 적으면 flex-grow만 지정하고 flex-shrink는 1, flex-basis는 0으로 한다. flex-basis를 0으로 하고 flex-grow만 사용하면 쉽게 아이템들의 비율을 유지할 수 있다.


참고 자료

댓글