부모 요소에 flex 적용하기
flex
- 레이아웃 배치 방법
- 남는 공간을 어떻게 차지할 것인지에 대한 성질이 핵심 개념
- 부모 요소와 자식 요소를 이용하여 구성
- 부모요소를 flex container, 자식 요소를 flex item
속성명 | 속성값 | 설명 |
---|---|---|
display | flex | 부모요소 블록 속성을 유지 및 자식 요소에 flex 환경 설정 |
inline-flex | 부모요소 인라인 속성으로 변경 및 자식 요소에 flex 환경 설정 | |
flex-direction | row | flex의 기본축을 가로로 지정 |
column | flex의 기본축을 세로로 지정 | |
row-reverse | 자식 요소 콘텐츠를 가로 역순으로 정렬 | |
column-reverse | 자식 요소 콘텐츠를 세로 역순으로 정렬 | |
flex-wrap | nowrap | 자식 요소의 줄 바꿈을 하지 않음 |
wrap | 자식 요소의 줄 바꿈을 함 | |
flex-flow | row wrap | flex-direction과 flex-wrap속성의 축약문 |
display - 자식 요소의 배치 방법 지정하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>display: flex</title>
<link rel="css" href="./css.css">
</head>
<body>
<main>
<section>
<article></article>
<article></article>
<article></article>
<article></article>
<article></article>
</section>
</main>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
main {
width: 100%;
height: 100vh;
background: black;
}
section {
border: 10px solid yellow;
display: flex;
}
/* article 요소가 가로로 정렬(flex 기본값: 좌 > 우) */
/* 부모요소인 section에는 블록 요소 속성이므로 너빗값은 100%로 설정됨 */
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid cyan;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
main {
width: 100%;
height: 100vh;
background: black;
}
section {
border: 10px solid yellow;
display: inline-flex;
}
/* 부모요소인 section이 인라인 요소 속성으로 변경되었으므로 너빗값은 자식 요소의 전체 너빗값만큼 변경 */
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid cyan;
}
flex-wrap - 자식 요소에 줄 바꿈 적용하기
- flex에서는 flex-wrap을 설정해야 자식 요소의 저빗값을 유지하며 줄 바꿈 가능 (float 속성을 사용하여 레이아웃을 만들 때 모든 자식 요소의 총 너빗값이 부모 요소의 너빗값보다 크면 자동 줄바꿈)
- 기본값이
felx-wrap: nowrap
- wrap 설정을 안했을 경우 브라우저를 줄였을 때 줄 바꿈되지 않고 창과 같은 비율로 줄어들게됨
flex-flow — flex-direction, flex-wrap 속성을 한꺼번에 적용하기
- flew-flow 속성 사용 시 flew-direction과 flex-wrap 속성을 한번에 지정할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
main {
width: 100%;
height: 100vh;
background: black;
}
section {
border: 10px solid yellow;
display: flex;
flex-flow: row wrap;
/* direction속성과 wrap속성 차례로 입력 */
}
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid cyan;
}
자식 요소 정렬하기
- 자식 요소 정렬 : justify-content나 align-content, align-items 속성 사용
- 초기 설정 축 : 가로축
- 기본 축 변경 : flex-direction으로 변경
justify-content - 기본 축으로 정렬하기
속성명 | 속성값 | 설명 |
---|---|---|
justify-content | flex-start | 자식 요소를 시작 방향으로 정렬 |
flex-end | 자식 요소를 종료 방향으로 정렬 | |
center | 자식 요소를 가운데로 정렬 | |
space-between | 자식 요소들 좌우 사이 여백만 균일하게 배분하여 정렬 | |
space-around | 자식 요소들의 여백을 균일하게 배분하여 정렬 | |
space-evenly | 자식 요소들의 여백을 양끝까지 균일하게 배분하여 정렬 |
align-content, align-items - 반대 축으로 정렬하기
속성명 | 속성값 | 설명 |
---|---|---|
align-content 또는 align-itmes | flex-start | 자식 요소를 시작 방향으로 정렬 |
flex-end | 자식 요소를 종료 방향으로 정렬 | |
center | 자식 요소를 가운데로 정렬 | |
space-between | 자식 요소들 좌우 사이 여백만 균일하게 배분하여 정렬 | |
space-around | 자식 요소들의 여백을 균일하게 배분하여 정렬 | |
space-evenly | 자식 요소들의 여백을 양끝까지 균일하게 배분하여 정렬 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
main {
width: 100%;
height: 100vh;
background: black;
}
section {
width: 100%;
height: 100%;
border: 10px solid yellow;
/* 요소 크기 계산 기준 = 테두리 기준 */
box-sizing: border-box;
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
/* 기본 축이 row이므로 반대 축인 세로 방향에서 가운데 정렬 */
align-items: center;
}
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid cyan;
}
/* 이 경우 웹 브라우저의 너비를 줄여서 자식 요소가 줄 바꿈을 하면 가운데 정렬 미적용 : 이럴때 align-content 속성 사용 */
box-sizing
- 요소의 크기 계산 기준 지정
- context-box : 요소의 내용으로 크기 계산(= 박스 안 내용 기준 박스 크기 지정)
- border와 padding을 사용할 경우 수동으로 계산해서 명시해줘야함
- border-box : 요소의 내용 + padding + border로 크기 계산(= 테두리 기준 박스 크기 지정)
- 크기 계산 자체를 요소의 내용을 포함해서 border와 padding을 합쳐서 계산
- 명시된 가로 사이즈를 유지한 상태로 내부에 padding border 포함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
main {
width: 100%;
height: 100vh;
background: black;
}
section {
width: 100%;
height: 100%;
border: 10px solid yellow;
box-sizing: border-box;
display: flex;
/* align-content를 사용했으므로 wrap 필수 입력 */
flex-flow: row wrap;
justify-content: space-evenly;
align-content: center;
}
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid cyan;
}
/* 이 경우 줄 바꿈을 하더라도 세로로 가운데 배치 */
줄 바꿈을 해야 하는 자식 요소가 여러 개 있다면 align-content 속성, 그렇지 않다면 align-items 속성 사용
자식 요소의 순서 지정하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>order</title>
<link rel="css" href="./css.css">
</head>
<body>
<section>
<article>1</article>
<article>2</article>
<article>3</article>
</section>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
section {
width: 100%;
background: black;
display: flex;
}
section article {
width: 100px;
height: 100px;
background: white;
border: 1px solid red;
font-size: 50px;
color: black;
/* article 안쪽 숫자를 정중앙 배치할 것이므로 flex, content 및 items 속성값 center로 지정 */
display: flex;
justify-content: center; /* 가로기준 중앙 */
align-items: center; /* 세로기준 중앙 */
}
/* 자식 요소 순서 지정 : 1 = 3번째, 2 = 2번째, 3 = 1번째 */
section article:nth-of-type(1) {
order:3;
}
section article:nth-of-type(2) {
order:2;
}
section article:nth-of-type(3) {
order:1;
}
요소의 여백 비율 지정하기
flex-grow - 요소의 안쪽 여백 확대하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>flex grow</title>
<link rel="css" href="./css.css">
</head>
<body>
<section>
<article>flex-grow</article>
<article>flex-grow</article>
<article>flex-grow</article>
</section>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
section {
width: 100%;
background: black;
display: flex;
}
section article {
background: white;
border: 1px solid cyan;
/* border-box 지정 후 너빗값과 높잇값 따로 지정 x */
box-sizing: border-box;
font-size: 50px;
color: white;
display: flex;
}
/* 부모 요소에만 flex 지정 후 자식 요소 크기를 따로 입력하지 않으면 자식 요소는 inline-block으로 설정되어 입력한 텍스트 크기만큼만 설정됨 */
section article:nth-of-type(1) {
flex-grow: 1;
}
section article:nth-of-type(2) {
flex-grow: 1;
}
section article:nth-of-type(3) {
flex-grow: 1;
}
/* 'flex-grow: 2;' 일 경우 여백 2배. 3일 경우 3배(1 기준) */
/* flex-grow 속성값 0 지정 시 원래 크기 */
/* 남은 부모 영역의 크기를 똑같이 배분 + 안쪽 여백 설정으로 인한 article 요소 크기 확대 */
flex-grow는 전체 영역의 크기를 조절하는 것이 아닌 요소의 안쪽 여백만 비율로 조절
flex-shirink - 요소의 안쪽 여백 축소하기
- 요소의 크기를 줄였을 때 안쪽 여백의 감소 비율을 지정할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>flex shirink</title>
<link rel="css" href="./css.css">
</head>
<body>
<section>
<article>flex-shirink</article>
<article>flex-shirink</article>
<article>flex-shirink</article>
</section>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
section {
width: 100%;
background: black;
display: flex;
}
section article {
/* 브라우저 화면이 기본 너빗값보다 줄어들었을 때 감소한 비율 확인을 위해 width: 400px 지정(100%가 아니도록)*/
width: 400px;
background: white;
border: 1px solid red;
box-sizing: border-box;
font-size: 50px;
color: black;
display: flex;
}
/* flex-shrink 속성값이 클수록 크게 감소 */
section article:nth-of-type(1) {
flex-shrink: 1;
}
section article:nth-of-type(2) {
flex-shrink: 2;
}
section article:nth-of-type(3) {
flex-shrink: 3;
}
/* 속성값을 1로 지정한 첫번째 박스 감소 비율이 가장 작아 실제 여백은 첫번째 박스가 가장 큼 */
flex - 전체 너빗값의 비율 조절하기
- 요소의 전체 너빗값 비율 조절
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@charset "utf-8";
* {
margin: 0px;
padding: 0px;
}
section {
width: 100%;
background: black;
display: flex;
}
section article {
width: 400px;
background: white;
border: 1px solid red;
box-sizing: border-box;
font-size: 50px;
color: black;
display: flex;
}
section article:nth-of-type(1) {
flex: 1;
}
section article:nth-of-type(2) {
flex: 2;
}
section article:nth-of-type(3) {
flex: 3;
}
/* 속성값 1인 첫번째 박스 기준 두번째, 세번째 박스의 전체 너비가 1 : 2: 3 비율로 변경 */