Flexbox 속성 중 자식 요소
에 적용해야하는 것은 flex
속성이다. flex는 요소가 차지하는 공간과 관련이 있다.
flex 속성은 3가지 값을 지정할 수 있다. 팽창 지수인 grow
, 수축 지수인 shrink
, 기본 크기인 basis
순서대로 값을 줘야 한다.
flex: grow shrink basis;
자식 요소에 flex
속성을 따로 설정하지 않으면 기본값이 적용되고, 왼쪽에서 오른쪽으로 콘텐츠의 크기만큼 배치된다. 기본값은 다음과 같이 grow=0, shrink=1, basis=auto
이다.
flex: 0 1 auto;
이때, 이 세 가지 값을 한 번에 설정하지 않고 flex-grow
, flex-shrink
, flex-basis
속성으로 각각 설정해줄 수도 있다.
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
grow
는 요소의 크기가 늘어나야할 때 얼마나 늘어날 것인지를 의미한다. 정렬축 방향으로 빈 공간이 있을 때, 각 자식 요소들이 그 빈 공간을 차지할 비율을 정하는 것이다. 팽창지수의 절대적 크기가 아닌 총합에서의 비율로 공간을 차지한다. 즉, 남은 영역을 어떻게 나누는 지에 대한 속성이다.
grow
를 1로 주고, 나머지는 기본값을 주면 다음과 같이 빈 공간을 box1 요소가 모두 차지하게 된다.grow
를 각각 5, 3, 1로 설정하면 빈 공간을 5:3:1의 비율로 차지하게 된다. shrink
는 얼마나 줄어들지를 의미한다. grow
와 반대로 설정한 비율만큼 요소의 크기가 작아진다. 이때 grow
와 shrink
를 같이 사용하면 예측한 크기와 달라질 수 있어 grow
를 사용하는 경우 shrink
는 기본값으로 두어도 괜찮다.
자식 요소가 부모 요소보다 커야하므로 자식 요소의 width를 300px로 주고 shrink 값을 조절하였다.
basis
는 늘어나고 줄어드는 것과 상관없이 요소의 기본 크기 값을 의미한다. 즉, grow와 shrink의 영향을 받기 전의 기본 크기 값을 의미한다.
기본값 auto
는 자동으로 콘텐츠의 크기에 따라 사이즈를 결정한다. 만약, auto
값을 가지지 않은 basis
와 width
가 동시에 적용된 경우 **basis
가 우선**된다.
basis
는 flex-direction
속성 값에 따라 다르며, row인 경우에는 너비를 의미하고 column인 경우에는 높이를 의미한다.
flex-grow가 1일 때,
flex-basis: 0
과flex-basis: auto
의 차이
기본값인auto
를 적용한 경우, 각 자식 요소 자체 콘텐츠의 크기에서 빈 공간을 3등분한 크기(자식 요소 3개의 flex-grow가 1이기 때문)만큼 더한 공간을 차지하기 때문에 각 박스가 서로 다른 너비를 가지게 된다.
반면0
을 적용한 경우, 각 자식 요소 콘텐츠의 크기와 상관없이 모든 자식 요소가 같은 너비 값을 가지게 된다.
.box { margin: 10px; height: 70px; border: 2px solid seagreen; background-color: seagreen; color: white; font-weight: 700; flex-grow: 1; /* flex-basis: auto; 기본값 */ } .basis0 { flex-basis: 0; }
<body> flex-basis: auto <div class="box-container"> <div class="box">box1</div> <div class="box">b_o_x_2</div> <div class="box">b_____o_____x_____3</div> </div> <br /> flex-basis: 0 <div class="box-container"> <div class="box basis0">box1</div> <div class="box basis0">b_o_x_2</div> <div class="box basis0">b_____o_____x_____3</div> </div> </body>