프로그래밍/HTML&CSS

[CSS]css 레이아웃(3)- flexbox

혬코 2021. 12. 27. 08:11

아래 포스팅에 이어서 이번에는 flexbox의 아이템 속성에 대해 알아보고자 한다.


3. 아이템 속성

flex-grow, flex-shrink, flex-basis, flex, order, align-self

아이템 속성은 아이템이 속한 컨테이너의 사용가능 공간을 어떻게 분배받을지 그리고 아이템을 어떻게 배치할지에 대한 설정에 관한 속성이다.

1) flex-grow

남은 사용 가능 공간들이 있을 때 아이템의 사이즈를 늘리는 비율을 정의한다.

아래 예시를 보면 아이템의 width=40px 전체 컨테이너 크기는 300px이므로 남은 사용 공간 180px이 생긴다.

.item { 
   width: 40px;
   height: 40px; 
} 

.item1 { 
   flex-grow: 1; 
} 

.item2 { 
   flex-grow: 1; 
}

이 때, "flex-grow: 1"을 각각 설정하면, item1과 item2가 180px의 반인 90px을 각각 가져가 총 130px(40+90)을 차지하고 item3은 다른 설정이 없기 때문에 기본 설정대로 40px의 너비를 가진다.

2) flex-shrink

사용 가능 공간이 부족할 때 아이템의 사이즈를 줄이는 비율을 정의하는 속성이다.

예를 들어 모든 아이템이 width=150px일 때, flex-shrink의 설정이 없다면 모두 같은 비율로 컨네이너 크기에 맞에 줄어든다.

부족한 공간 : 150px / 한 item이 줄인 크기 : 150px/3 = 50px


item1에만 "flex-shrink: 3"을 설정하면,
부족한 공간 150px을 3:1:1 씩 부담해 item1은 90px, item2,3은 30px을 줄여 item1은 60px(150-90), item2,3은 120px(150-30)씩 차지한다.

.item {
   width: 150px; 
   height: 40px; 
} 

.item1 { 
   flex-shrink: 3; 
}

3) flex-basis

아이템의 크기를 지정해주는 속성이다.

아이템에 width, height 설정이 없을 경우에는 중심 축 방향은 컨텐츠 크기만큼, 반대 축 방향은 반대 축 전체를 차지한다.


만약, 
width=90px, height=40px 경우에는지정한 크기 그대로 아이템 크기가 설정된다.

.item { 
   width: 90px; 
   height: 40px;
}


반면에 
flex-basis를 설정한 경우에는 itme width, height 지정과 상관 없이 중심축 방향은 flex-basis를 설정한 비율만큼 아이템 크기가 결정된다. 따라서 아래 코드의 같은 경우 itme1,2,3 모두 height은 설정한대로 40px이지만, item1,2는 300px의 20%인 60px로 각각 설정되고, item3은 300px의 60%인 180px로 설정된다.

.item {
   width: 90px; 
   height: 40px; 
} 

.item1 { 
   flex-basis: 20%; 
} 

.item2 { 
   flex-basis: 20%; 
} 

.item3 { 
   flex-basis: 60%; 
}

4) flex

[flex-grow, flex-shrink, flex-basis]를 한 번에 쓰는 축약형 속성이다. 

flex: (flex-grow) (flex-shrink) (flex-basis); 순서대로 한 줄에 아이템 속성 설정이 가능하다.

꼭 기억할 필요는 없지만, 자주 사용되는 값의 조합은 따로 이름이 정해져있기도 해서 아래에 적어 놓았으니 참고하면 좋겠다.

① flex: 0 1 auto; = flex: initial;

flex-grow: 0 - 지정한 크기보다 커지지 않음
flex-shrink: 1 - 공간 부족시 크기 줄어듦
flex-basis: auto - 컨텐츠 크기만큼 차지

② flex: 1 1 auto; = flex: auto;

flex-grow: 1 - 남은 공간 만큼 차지
flex-shrink: 1 - 공간 부족시 크기 줄어듦
flex-basis: auto - 컨텐츠 크기만큼 차지

③ flex: 0 0 auto; = flex: none;

컨터이너 크기가 변해도 아이템 크기 불변

④ flex: n n n;

⑤ flex: n; = flex: n 1 0;

flex-grow만 지정


5)
order

아이템간의 순서를 설정하는 속성이다.   ... -2 -1 0(현재위치) 1 2 ...

아래와 같은 상황에서 item1을 제일 오른쪽에 배치하고 싶다면, 오른쪽으로 2칸 이동을 뜻하는 "order: 2;"를 지정해주면 된다.

.item1 {
   order: 2; 
}


이 상황에서
item3을 제일 왼쪽에 배치하고 싶으면, 왼쪽으로 한 칸 이동을 뜻하는 "order: -1;"을 지정해준다.

.item3 {
   order: -1; 
}
 }

6) align-self

반대 축 기준으로 아이템의 정렬을 지정해주는 속성이다. (컨테이너 속성과 달리 지정된 아이템 하나만 정렬된다.)

auto 기본값, 부모 컨테이너의 속성 상속
flex-start 부모 컨테이너 시작선에 위치
flex-end 부모 컨테이너 끝선에 위치
center 부모 컨테이너 중심에 위치
stretch 부모 컨테이너에 맞게 늘어남
baseline 부모 컨테이너 기본선에 위치

.item1 {
   align-self: center; 
} 

.item2 {
   align-self: flex-start; 
} 

.item3 { 
   align-self: flex-end;
 }

 

 

요약

1) flex-grow

남은 사용 공간에 아이템을 얼마나 늘릴 것인지에 대한 속성  ex) 0 1 2 ...

2) flex-shrink

공간이 부족할 때 아이템을 얼마나 줄일 것인지에 대한 속성  ex) 0 1 2 ...

3) flex-basis

아이템 크기 지정에 대한 속성  ex) auto, n%

4) flex

flex-grow flex-shrink flex-basis 축약형

5) order

아이템간 순서 지정에 대한 속성  ex) ... -2 -1 0(현재위치) 1 2 ... 

6) align-self

반대 축 기준으로 하나의 아이템에대한 정렬에 관한 속성
ex) auto, flex-start, flex-end, center, stretch, baseline


전체 소스코드

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
  <style>
    .container {
      background: white;
      height: 100vh;
      display: flex;
    }

    .item {
      width: 90px;
      height: 40px;
    }

    .item1 {
      background: #ce93d8;
      flex-grow: 0; /* 1 2 ... */
      flex-shrink: 0; /* 1 2 ... */
      flex-basis: auto; /*20% ...*/
      flex: 1 1 auto
      order: 2 /* -2 -1 1 2 ... */
      align-self: center; /* flex-start, flex-end, stretch, baseline*/
    }
      
    .item2 {
      background: #f48fb1;
      align-self: flex-start;
    }

    .item3 {
      background: #b39a71;
      align-self: flex-end;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="item item1">aaaa</div>
    <div class="item item2">bbbb</div>
    <div class="item item3">cccc</div>
  </div>
</body>
</html>