학습 목표
display: flex;
를 자식 요소가 아닌 부모 요소에 적용해야 함을 이해한다.flex-direction
을 이용하여 요소를 정렬할 방향을 결정할 수 있다.justify-content와 align-items
를 이용하여 수평-수직 정렬을 결정할 수 있다.flex-grow
를 이용하여 요소를 얼마나 늘릴 것인지 결정할 수 있다.flex-basis
를 이용하여 요소의 기본 크기를 결정할 수 있다.- VSCode의 레이아웃을 Flexbox를 이용하여 구현할 수 있다.
Flexbox 속성들을 활용하면 요소의 정렬, 요소가 차지하는 공간을 설정할 수 있다.
flexbox 속성을 사용할 때 유의해야할 점은 속성을 지정해주는 위치이다. 부모 요소에 적용해야하는 속성들, 자식 요소에 적용해야하는 속성들이 있으며, 적절한 위치에 속성을 지정해주지 않으면 요소들이 원하는대로 정렬되지 않는다.
예시)
HTML로 3개의 <div>
요소를 자식으로 가진 <main>
요소 작성
<main>
<div>box1</div>
<div>box2</div>
<div>box3</div>
</main>
각 요소가 눈에 잘 보이도록 <main>
요소에 빨간색 점선, <div>
요소에 초록색 실선, margin
과 padding
에 각각 10px 설정
main {
border: 1px dotted red;
}
div {
border: 1px solid green;
}
* {
margin: 10px;
padding: 10px;
}
<div>
요소들은 별다른 설정을 하지 않으면 위쪽에서부터 세로로 정렬되고, 가로로 넓게 공간을 차지한다.
! <main>
요소에 display: flex
속성 적용
main {
**display: flex;**
border: 1px dotted red;
}
...
<div>
요소들이 왼쪽부터 가로로 정렬되고, 내용만큼의 공간을 차지한다.
1. flex-direction : 정렬 축 정하기
main {
display: flex;
**flex-direction : row;**
}
/* 부모 요소인 main에 작성하여 자식 요소인 div들을 정렬할 축을 정합니다. */
row(기본값)
column
row-reverse
column-reverse
2. flex-wrap : 줄바꿈 설정하기
main {
display: flex;
**flex-wrap : nowrap;**
}
/* 부모 요소인 main에 작성하여 자식 요소인 div들의 줄 바꿈을 어떻게 할지 정합니다. */
nowrap(기본값)
wrap
wrap-reverse
3. justyfy-content : 축 수평 방향 정렬
자식 요소들을 축의 수평 방향으로 어떻게 정렬할 것인지 설정
주요 속성값 : flex-start
, flex-end
, center
, space-between
, space-around
flex-start
flex-end
center
space-between
space-around
space-evenly
flex-direction : row
인 경우 ↔
flex-direction : column
인 경우 ↕️
4. align-items : 축 수직 방향 정렬
자식 요소들의 축의 수직 방향으로 어떻게 정렬할 것인지 설정
가로로 정렬되어 있다면 세로 방향으로, 세로로 정렬되어 있다면 가로 방향으로 어떻게 정렬할 것인지 정하는 속성
주요 속성값 : stretch
, flex-start
, flex-end
, center
, baseline
stretch
flex-start
flex-end
center
baseline
flex-direction : row
인 경우 ↕️
flex-direction : column
인 경우 ↔
Flexbox 속성들을 활용하면 요소의 정렬, 요소가 차지하는 공간을 설정할 수 있다. 부모 요소에 적용해야 하는 속성들이 자식 요소들의 정렬과 관련이 있었다면, 자식 요소에게 적용해야 하는 속성인 flex는 요소가 차지하는 공간과 관련이 있다.
flex
속성은 세 가지 값을 지정해줄 수 있다.
flex: <grow(팽창 지수)> <shrink(수축 지수)> <basis(기본 크기)>
grow(팽창 지수)
: 요소의 크기가 늘어나야 할 때 얼마나 늘어날 것인가shrink(수축 지수)
: 요소의 크기가 줄어들어야 할 때 얼마나 줄어들 것인가basis(기본 크기)
: 늘어나고 줄어드는 것과 상관없이 요소의 기본 크기는 얼마인지를 의미속성을 따로 설정해주지 않으면 기본값이 적용되고, 왼쪽에서부터 오른쪽으로 콘텐츠 크기만큼 배치된다.
flex: 0 1 auto;
* 이 순서와 기본값은 반드시 기억!!!!! flex: grow shrink basis, flex: 0 1 auto
값을 각각 따로 지정해줄 수도 있다.
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
1. grow
즉, box가 3개일 경우
box1 : box2 : box3 = 1 : 0 : 0 이므로 box1이 모든 공간을 차지하고,
box1 : box2 : box3 = 1 : 1 : 0 이므로 box1과 box2가 1:1로 공간을 나눠 가지고,
box1 : box2 : box3 = 1 : 1 : 1 이므로 세 박스가 1:1:1로 공간을 나눠 가진다.
팽창지수는 자식 요소의 grow값
/ 자식 요소들의 grow값의 총합
의 비율로 빈 공간을 가져간다.
2. shirink
flex-grow
속성과 flex-shrink
속성을 함께 사용하는 일은 비추천flex-grow
속성 또는 flex: <grow> 1 auto
와 같이 grow
속성에 변화를 주는 방식을 권장flex-shrink
속성은 width
나 이후 설명할 flex-basis
속성에 따른 비율이므로 실제 크기를 예측하기가 어렵기 때문flex-grow
속성으로 비율을 변경하는 경우, flex-shrink
속성은 기본값인 1로 두어도 무방합니다.+) 참고
- width와 flex-basis를 동시에 적용하는 경우, flex-basis가 우선
- 콘텐츠가 많아 자식 박스가 넘치는 경우, width가 정확한 크기를 보장하지 않음
- (flex-basis를 사용하지 않는다면) 콘텐츠가 많아 자식 박스가 넘치는 경우를 대비해, width 대신 max-width를 쓸 수 있음