레이아웃을 위해서 한가지만 사용할 필요는 없다.
flex와 grid는 상황에 맞게 섞어서 쓰는게 좋다.
웹 혹은 앱의 레이아웃은 보통 위에서 아래 방향 즉, 수직으로 구성되어 있다.
기본적인 흐름으로 요소(element | 정확히는 레이아웃에 많이 사용하는 block 요소)들을 배치하면 자동으로 수직 방향으로 배치되기 때문에 수평(문서의 흐름 상 왼쪽에서 오른쪽으로)으로 구성하고자 한다면 flex 혹은 grid를 사용해야한다.
flex 레이아웃의 시작 아이템을 담고 있는 컨테이너에 display: flex
속성, 값 지정
즉, 아이템들을 담고 있는 컨테이너에 부여할 수 있는 속성
div 태그는 diplay: block 속성이기 때문에 자동으로 수직으로 박스가 쌓이게 된다.
물론 레이아웃을 div 태그 말고 header와 같은 semantic 태그를 이용해도 되며 이 방법이 더 옳은 방법이라 생각한다.
<div class="container">
<div class="item">box1 <p>Lorem, ipsum dolor.</p></div>
<div class="item">box2<p>Lorem ipsum dolor sit amet.</p></div>
<div class="item">box3<p>Lorem ipsum dolor sit amet consectetur adipisicing.</p></div>
</div>
위 박스들의 정렬을 수평으로 하고 싶다면 flex를 이용한다.
.container {
display: flex;
}
이때 flex 속성만으로 아이템들의 크기에 맞춰서 자동으로 가로 방향으로 정렬되고 높이 또한 컨테이너의 높이만큼 자동으로 늘어난다. 즉, flex 속성만으로 아이템들에게 기본값을 설정하고 있다는 뜻
해당 속성은 아래와 같다.
flex-direction: row
flex-basis: auto
flex-wrap: nowrap
<div class="container">
<div class="item">
여기서 flex는 부모(container)에 설정하고 자식들(item)에게 어떤 배치를 할것인가를 정한다. 즉, 부모와 자식에게 부여할 수 있는 속성이 따로 있다.
container | item |
---|---|
display | order |
flex-direciton | flex-grow |
flex-wrap | flex-shrink |
flex-flow | flex-basis |
justify-content | flex |
align-items | align-self |
align-content |
flex에서 가장 중요한 부분으로 아이템들의 배치 방향(컨테이너의 메인축을 설정)을 결정한다.
flex-direction
아이템의 정렬 방향을 지정flex-direction: row
로 메인 축의 가로 즉, 수평 방향으로 설정row-reverse
메인 축의 방향을 수평으로 하지만 아이템들의 배치를 반대로 한다.column
으로 메인 축의 방향을 수직 방향으로 설정column-reverse
메인 축의 방향을 수직으로 하지만 아이템들의 배치를 반대로 한다.중요한 것은 아이템이 어떻게 배치되느냐 보다 "컨테이너의 메인축을 가로 방향으로 할 것인가, 혹은 세로 방향으로 할 것인가 하는 메인 축을 결정"
한다라고 생각해야한다.
flex-wrap: nowrap
으로 창이 줄어들게 되면 아이템들이 자동으로 같이 줄어들며 같은 줄에 붙어있지만 아이템들의 크기가 더이상 줄어들 수 없다면 아이템들이 컨테이너 밖으로 나가게 된다.wrap
창이 줄어들게 되면 아이템이 줄어들지 않고 자동으로 줄 바꿈이 적용wrap-reverse
위와 동일하지만 아이템을 역순으로 줄바꿈 배치 flex-flow: row nowrap;
justify-content
는 메인축의 방향으로 아이템들을 정렬justify-content: flex-start
로 아이템들을 메인축의 시작지점부터 정렬center
아이템들을 메인축에서 가운데로 정렬space-between
첫 아이템과 마지막 아이템을 메인축의 각 양 끝에 정렬하고 나머지 아이템들을 그 사이에 동일한 여백을 주고 정렬space-around
위와 비슷하지만 시작과 마지막의 아이템들의 양쪽에도 동일한 여백을 줌space-evenly
위 두개와 비슷하지만 시작과 마지막의 아이템들을 포함해 모든 아이템들의 여백이 동일하게 주어짐align-content
는 메인축이 아닌 교차축에서의 방향을 정렬하며 flex-wrap
속성으로 아이템들이 2줄 이상, 여백이 있을 때 사용할 수 있는 속성
align-content: stretch
로 컨테이너의 높이만큼 아이템들의 높이를 자동으로 늘려준다.flex-start
아이템들을 교차축의 시작지점부터 정렬center
아이템들을 교차축의 가운데로 정렬flex-end
아이템들을 교차축의 끝지점부터 정렬space-between
첫 아이템과 마지막 아이템을 메인축의 각 양 끝에 정렬하고 나머지 아이템들을 그 사이에 동일한 여백을 주고 정렬space-around
위와 비슷하지만 시작과 마지막의 아이템들의 양쪽에도 동일한 여백을 줌align-items
는 메인축이 아닌 교차축에서의 방향을 정렬하며 아이템들이 한 줄일 경우 사용
아이템들에게 순서를 지정한다.
flexbox의 자식 아이템들의 기본 크기를 설정하며 메인축 row, cloumn에 따라 각각 너비, 높이를 설정한다.
기본값은flex-basis: auto
로 원래 아이템의 너비 혹은 높이 값을 적용한다.
기본 값은
flex-grow: 0
로 아이템들 크기의 합이 컨테이너의 공간보다 작아도 늘어나지 않는다.
flex-basis
를 제외한 여백 부분을 해당 숫자의 비율로 나눈다.기본 값은
flex-shrink: 1
로 따로 설정이 없어도 아이템들의 크기가flex-basis
보다 작아질 수 있다.
flex-basis
보다 작아지지 않는다.아이템 설정 2, 3, 4번의 단축 설정 | 사용 방법에 따라 순서가 바뀔 수 있음에 주의*
flex: 증가, 감소, 기본 너비;
flex: 1; /* 증가 (이 경우 나머지 속성은 기본 값이 적용 ex: shrink: 1, basis: auto)*/
flex: 1 1 20px; /* 증가, 감소, 기본 너비 */
flex: 1 1; /* 증가, 감소 */
flex: 1 20px; /* 증가, 기본 너비 */
위 3번과 4번의 경우 단위를 넣을 경우 grow, basis 아닐 경우 grow, shrink로 적용
원하는 아이템을 따로 지정해서 align-items (교차축) 값을 재정의
part5에서 계속