display: flex;
를 자식 요소가 아닌 부모 요소에 적용해야 함을 이해한다.flex-direction
을 이용하여 요소를 정렬할 방향을 결정할 수 있다.justify-content
와 align-items
를 이용하여 수평-수직 정렬을 결정할 수 있다.flex-grow
를 이용하여 요소를 얼마나 늘릴 것인지 결정할 수 있다.flex-basis
를 이용하여 요소의 기본 크기를 결정할 수 있다.부모
박스 요소에 적용해 자식
박스의 방향과 크기를 결정하는 레이아웃 구성 방법요소의 정렬
(=부모 요소에 적용하는 Flexbox 속성), 요소가 차지하는 공간
(=자식 요소에 적용하는 Flexbox 속성)을 설정해줄 수 있습니다.row, column, row-reverse, column-reverse
nowrap, wrap, wrap-reverse
flex-start, flex-end, center, space-between, space-around
stretch, flex-start, flex-end, center, center, baseline
실습과 연습을 통해서 직접 여러 속성들을 다뤄보면서 어떤 방식으로 정렬되는지 파악하는 것이 제일 좋습니다.
flex: <grow(팽창 지수)> <shrink(수축 지수)> <basis(기본 크기)>
// 한 줄에 작성
flex: 0 1 auto;
// 여러 줄에 작성
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
grow(팽창 지수)
: 요소의 크기가 늘어나야 할 때 얼마나 늘어날 것인지 의미합니다.shrink(수축 지수)
: 요소의 크기가 줄어들어야 할 때 얼마나 줄어들 것인지 의미합니다.grow
속성과 함께 사용하지 않는 게 좋기 때문에 보통은 shrink
속성은 기본값으로 둔 채 grow
속성에 변화를 주는 방식을 사용합니다.basis(팽창 지수)
: 요소의 기본 크기는 얼마인지 의미합니다.auto
입니다.flex-grow
나 flex-shrink
에 의해 늘어나거나 줄어들기 전에 가지는 기본 크기입니다. flex-grow
가 0일 때, basis
크기를 지정하면 그 크기는 유지됩니다. (중요, 유일한 basis 속성 값 유지 조건, grow 의 값이 양수일 경우 같은 비율이더라도 basis 값이 적용되지 않을 수 있음)flex-basis : 50px
설정하면 box1 은 50픽셀을 유지합니다.width
와 flex-basis
를 동시에 적용하는 경우, flex-basis
우선 적용width
가 정확한 크기를 보장하지 않습니다.flex-basis
를 사용하지 않는다면) 콘텐츠가 많아 자식박스가 넘치는 경우를 대비해, width
대신 max-width
를 쓸 수 있습니다.// html
<!DOCTYPE html>
<html>
<head>
<title>Document</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="layout layout1">
<div class="icon"></div>
<div class="icon"></div>
<div class="icon"></div>
</div>
<div class="layout layout2">
<div class="area area-in-layout2 area1"></div>
<div class="area area-in-layout2 area2"></div>
<div class="area area-in-layout2 area3"></div>
</div>
<div class="layout layout3">
<div class="area area-in-layout3 area4"></div>
<div class="area area-in-layout3 area5"></div>
</div>
</body>
</html>
// css
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
display: flex;
}
.layout {
border: 2px solid red;
height: 99vh;
display: flex;
padding: 15px;
margin: 5px;
flex-direction: column;
align-items: center;
}
.icon {
border: 2px dotted tomato;
width: 5vw;
height: 5vw;
margin: 5px;
}
.area {
border: 2px dotted blue;
margin: 5px;
}
.layout1 {
width: 10vw;
}
.layout2 {
width: 25vw;
}
.layout3 {
width: 60vw;
}
.area-in-layout2 {
width: 20vw;
height: 100vh;
}
.area1 .area2 {
flex-grow: 1;
}
.area3 {
flex-basis: 40vh;
}
.area-in-layout3 {
width: 55vw;
height: 100vh;
}
.area4 {
flex-grow: 1;
}
.area5 {
flex-basis: 20vh;
}