Search

FLEX 레이아웃

FLEX 레이아웃

미리보기
개념
핵심요소
실습예제
Quiz

미리보기

Flex 레이아웃을 바로 사용해보면서 더 쉽게 알아볼까요?

개념

Flex Layout 은 Flexible Box Layout 을 말하며, 말 그대로 유연한 박스 레이아웃입니다.
박스(Container) 안에서 요소(item)들을 1차원으로 유연하게 배치하는 것을 쉽게 해줍니다.
Flex 레이아웃을 사용하여, 사이트의 헤더 등을 쉽게 배치할 수 있습니다.
헤더
로고
메뉴(네비게이션바)
유틸(로그인,회원가입)
이렇게 3개의 영역으로 각 요소들을, 로고와 유틸을 양쪽 끝에 배치하면서, 사이사이에 여백을 두고 배치하고 싶다면, 아래와 같이 display: flex; justify-content: space-between; 속성만 적용하면 쉽게 레이아웃이 적용됩니다.
header { display: flex; justify-content: space-between; }
CSS
복사

핵심요소

Flex Layout 을 적용하는 핵심요소는 Container 와 Item 입니다.
Flex Container
Flex Item

Flex Container

Container 는 Item 들을 담는 영역으로, 가로 또는 세로 방향 중 어떤 방향을 메인 축으로 해서, 어떤 방식으로 배치 및 정렬할 지 정의하는 영역입니다.
Flex Container 에서는 메인 축, 교차 축이 각각 가로, 세로 중 어느 방향으로 기준이 되는 지와 메인 축, 교차 축에 각각 적용하는 속성들을 이용하여 어떤 정렬 및 배치 방식을 지정할 수 있는지를 아는 것이 중요합니다.

Flex Item

Container 에 담기는 개별 요소들입니다. Item 은 개별적인 정렬 밀 배치 방식을 정의할 수 있습니다.

Flex Container 의 주요 속성

display: flex 또는 display: inline-flex 사용하여, Flex Container 로 정의합니다.
Flex Container 로 정의된 요소에 아래의 주요 속성이 활성화됩니다.
속성
설명
display
Flex Container를 정의
flex-flow
flex-direction와 flex-wrap의 단축 속성
flex-direction
Flex Items의 주 축(main-axis)을 설정
flex-wrap
Flex Items의 여러 줄 묶음(줄 바꿈) 설정
justify-content
주 축(main-axis)의 정렬 방법을 설정
align-content
교차 축(cross-axis)의 정렬 방법을 설정(2줄 이상)
align-items
교차 축(cross-axis)에서 Items의 정렬 방법을 설정(1줄)

display: flex & display: inline-flex

속성값
설명
flex
Block 특성의 Flex Container를 정의
inline-flex
Inline 특성의 Flex Container를 정의
.container { display: flex; } .container { display: inline-flex; }
CSS
복사

flex-direction

Flex Container 의 메인 축(row, column) 방향을 지정하는 속성
default: row
속성값
설명
row
Item 을 수평축(왼쪽에서 오른쪽으로)으로 표시
row-reverse
Item 을 row의 반대 축으로 표시
column
Item 을 수직축(위에서 아래로)으로 표시
column-reverse
Item 을 column의 반대 축으로 표시

flex-wrap

item 의 줄바꿈 여부를 지정하는 속성
default: nowrap
속성값
설명
nowrap
모든 item 을 여러 줄로 묶지 않음(한 줄에 표시)
wrap
Item 을 여러 줄로 묶음
wrap-reverse
Item 을 wrap의 역 방향으로 여러 줄로 묶음

flex-flow

flex-flow 은 여러 개별 속성을 한 번에 적용할 수 있는 단축 속성으로, flex-directionflex-wrap 속성을 한 번에 적용합니다.
.container { display: flex; flex-flow: <flex-direction> <flex-wrap>; }
CSS
복사
flex-direction: row, row-reverse, column, column-reverse
flex-wrap: nowrap, wrap, wrap-reverse
/* flex-direction: row, flex-wrap: nowrap */ .row-nowrap { flex-flow: row nowrap; } /* flex-direction: row, flex-wrap: wrap */ .row-wrap { flex-flow: row wrap; } /* flex-direction: row-reverse, flex-wrap: wrap */ .row-reverse-wrap { flex-flow: row-reverse wrap; } /* flex-direction: column, flex-wrap: nowrap */ .column-nowrap { flex-flow: column nowrap; } /* flex-direction: column, flex-wrap: wrap-reverse */ .column-wrap-reverse { flex-flow: column wrap-reverse; }
CSS
복사

justify-content

메인 축의 정렬 및 배치 방법을 지정하는 속성
default: flex-start
속성값
설명
flex-start
item 을 시작점(flex-start)으로 정렬
flex-end
item 을 끝점(flex-end)으로 정렬
center
item 을 가운데 정렬
space-between
시작 Item은 시작점에, 마지막 Item은 끝점에 정렬되고 나머지 Items는 사이에 고르게 정렬됨
space-around
Item 시작점과 끝점의 좌우 여백만 작게 지정되고, item 사이의 여백은 균등하게 정렬됨
space-evenly
item 을 균등한 여백을 포함하여 정렬

align-content

교차 축의 정렬 및 배치 방법을 지정하는 속성
default: strech
적용 범위: 여러 줄의 Flex Item이 있을 때, 각 줄 사이의 간격을 조정합니다.
사용 시기: Flex Container가 여러 줄로 아이템을 배치할 때, 줄 사이 간격을 정렬하고 조정하는 데 사용됩니다. 아이템이 단일 줄이면 이 속성은 적용되지 않습니다.
속성값
설명
stretch
Container의 교차 축을 채우기 위해 item 을 늘림
flex-start
Item 을 시작점(flex-start)으로 정렬
flex-end
Item 을 끝점(flex-end)으로 정렬
center
Item 을 가운데 정렬
space-between
시작 Item 은 시작점에, 마지막 Item 은 끝점에 정렬되고 나머지 Items 는 사이에 고르게 정렬됨
space-around
Item 시작점과 끝점의 좌우 여백만 작게 지정되고, item 사이의 여백은 균등하게 정렬됨

align-items

교차 축의 item 들의 정렬 방법 지정하는 속성
default: strech
적용 범위: Flex Container의 한 줄에 있는 모든 Flex Item에 적용됩니다.
사용 시기: 단일 줄의 아이템들이 교차 축에서 어떻게 정렬될지 설정할 때 사용합니다.
속성값
설명
stretch
Container의 교차 축을 채우기 위해 item 을 늘림
flex-start
item 을 각 줄의 시작점(flex-start)으로 정렬
flex-end
item 을 각 줄의 끝점(flex-end)으로 정렬
center
item 을 가운데 정렬
baseline
item 을 문자 기준선에 정렬

Flex Item 의 주요 속성

Flex Container 내부에 담긴 요소들의 개별적인 정렬 및 배치 방법을 지정하는 속성
속성
설명
order
Flex Item 의 순서를 설정
flex
flex-grow, flex-shrink, flex-basis의 단축 속성
flex-grow
Flex Item 의 증가 너비 비율을 설정
flex-shrink
Flex Item 의 감소 너비 비율을 설정
flex-basis
Flex Item 의 (공간 배분 전) 기본 너비 설정
align-self
교차 축(cross-axis)에서 Item 의 정렬 방법을 설정

order

아이템의 순서를 지정하는 속성
default: 0
.item1 { order: 2; } .item2 { order: 1; } .item3 { order: 3; }
CSS
복사

flex-grow

Flex 컨테이너가 확대될 때Flex 아이템이 남은 공간을 얼마나 차지할지를 설정하는 속성
default: 0
값이 클수록 더 많이 차지합니다.
.item1 { flex-grow: 1; } .item2 { flex-grow: 2; }
CSS
복사
item2item1보다 두 배의 공간을 차지합니다.

flex-shrink

Flex 컨테이너가 좁아졌을 때, 아이템이 얼마나 축소될지를 설정하는 속성
default: 1
값이 클수록 더 많이 축소됩니다.
.item1 { flex-shrink: 1; } .item2 { flex-shrink: 2; }
CSS
복사
item2item1보다 두 배 더 많이 축소됩니다.

flex-basis

아이템의 기본 크기를 설정하는 속성
default: auto
.item { flex-basis: 150px; }
CSS
복사
이 경우, 아이템의 기본 크기는 150px로 설정됩니다.

flex

flex-grow, flex-shrink, flex-basis를 한 번에 지정하는 단축 속성
flex-grow 이외의 개별속성 생략가능 flex-basis 를 생략하면, auto 가 아니라 0 이 된다.
속성
설명
기본값
flex-grow
Item 의 증가 너비 비율을 설정
0
flex-shrink
Item 의 감소 너비 비율을 설정
1
flex-basis
Item 의 (공간 배분 전) 기본 너비 설정
auto

align-self

개별 Flex 아이템의 정렬 방식을 지정하는 속성
align-items 속성은 모든 아이템에 적용되지만, align-self는 특정 아이템에만 적용됩니다.
속성값
설명
auto
Container의 align-items 속성을 상속받음
stretch
Container의 교차 축을 채우기 위해 Item을 늘림
flex-start
Item 을 각 줄의 시작점(flex-start)으로 정렬
flex-end
Item 을 각 줄의 끝점(flex-end)으로 정렬
center
Item 을 가운데 정렬
baseline
Item 을 문자 기준선에 정렬

실습예제

1.
Flex Conrainer
2.
Flex Item

Flex Conrainer

HTML
CSS
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>flex</title> <link rel="stylesheet" href="css/flex.css"> </head> <body> <div class="container"> <!-- flex-direction --> <h2>flex default</h2> <div class="flex-container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>flex-direction: row;</h2> <div class="flex-container row"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>flex-direction: column;</h2> <div class="flex-container column"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>flex-direction: row-reverse;</h2> <div class="flex-container row-reverse"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>flex-direction: column-reverse;</h2> <div class="flex-container column-reverse"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <!-- flex-wrap --> <h2>flex-wrap: nowrap;</h2> <div class="flex-container nowrap"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">11</div> <div class="item">12</div> </div> <h2>flex-wrap: wrap;</h2> <div class="flex-container wrap"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">11</div> <div class="item">12</div> </div> <h2>flex-wrap: wrap-reverse;</h2> <div class="flex-container wrap-reverse"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">11</div> <div class="item">12</div> </div> <!-- flex-flow --> <!-- : flex-direction 과 flex-wrap 을 동시에 적용하는 속성 --> <h2>flex-flow: row wrap;</h2> <div class="flex-container row-wrap"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> <div class="item">11</div> <div class="item">12</div> </div> <!-- justify-content --> <h2>justify-content: center;</h2> <div class="flex-container center"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>justify-content: flex-start;</h2> <div class="flex-container start"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>justify-content: flex-end;</h2> <div class="flex-container end"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>justify-content: space-between;</h2> <div class="flex-container between"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>justify-content: space-around;</h2> <div class="flex-container around"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <h2>justify-content: space-evenly;</h2> <div class="flex-container evenly"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <!-- align-content --> <h2>align-content: stretch;</h2> <div class="flex-container cross wrap content-stretch"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-content: flex-start;</h2> <div class="flex-container cross wrap content-start"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-content: flex-end;</h2> <div class="flex-container cross wrap content-end"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-content: center;</h2> <div class="flex-container cross wrap content-center"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-content: space-between;</h2> <div class="flex-container cross wrap content-between"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-content: space-around;</h2> <div class="flex-container cross wrap content-around"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <!-- align-items --> <h2>align-items: center;</h2> <div class="flex-container cross cross-center"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <h2>align-items: flex-start;</h2> <div class="flex-container cross wrap cross-start"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <h2>align-items: flex-end;</h2> <div class="flex-container cross cross-end"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <h2>align-items: stretch;</h2> <div class="flex-container cross cross-stretch"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <h2>align-items: baseline;</h2> <div class="flex-container cross cross-baseline"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <!-- 정가운데 (수평 가운데, 수직 가운데) --> <h2>정가운데</h2> <div class="flex-container center-center"> <div class="item">CENTER</div> </div> </div> </body> </html>
HTML
복사
CSS
.container { width: 1200px; margin: 0 auto; border: 3px dashed orange; } /* flex container */ .flex-container { display: flex; border: 1px solid lightcoral; } .item { width: 100px; height: 100px; margin: 20px; padding: 20px; font-size: 30px; line-height: 60px; text-align: center; background-color: cornflowerblue; color: white; box-sizing: border-box; } /* flex-direction */ .row { flex-direction: row; } .column { flex-direction: column; } .row-reverse { flex-direction: row-reverse; } .column-reverse { flex-direction: column-reverse; } /* flex-wrap */ .nowrap { flex-wrap: nowrap; } .wrap { flex-wrap: wrap; } .wrap-reverse { flex-wrap: wrap-reverse; } /* flex-flow */ .row-wrap { flex-flow: row wrap; /* flex-direction: row; */ /* flex-wrap: wrap; */ } /* justify-content */ /* : 주축의 정렬방식을 지정하는 속성 */ .center { justify-content: center; } .start { justify-content: flex-start; } .end { justify-content: flex-end; } .between { justify-content: space-between; } .around { justify-content: space-around; } .evenly { justify-content: space-evenly; } /* 교차축 */ .cross { height: 600px; } /* align-content */ .content-stretch { align-content: stretch; } /* stretch - 적용될 item 의 width/height 가 auto 이어야 적용된다. */ .content-stretch .item { height: auto; } .content-center { align-content: center; } .content-start { align-content: flex-start; } .content-end { align-content: flex-end; } .content-between { align-content: space-between; } .content-around { align-content: space-around; } /* align-items */ .cross-center { align-items: center; } .cross-start { align-items: start; } .cross-end { align-items: end;} .cross-stretch { align-items: stretch; } .cross-stretch .item { height: auto; line-height: 100px; } .cross-baseline { align-items: baseline; } /* 정가운데 (수평 가운데/수직 가운데) */ .center-center { height: 600px; justify-content: center; align-items: center; } .center-center .item { font-size: 14px; }
CSS
복사

Flex Item

HTML
CSS
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>flex-item</title> <link rel="stylesheet" href="css/flex-item.css"> </head> <body> <div class="container"> <h2>order</h2> <div class="flex-container"> <div class="item order4">1</div> <div class="item order1">2</div> <div class="item order2">3</div> <div class="item order3">4</div> <div class="item order-1">5</div> </div> <h2>flex-grow</h2> <div class="flex-container"> <div class="item grow2">1</div> <div class="item grow1">2</div> <div class="item grow2">3</div> </div> <h2>flex-shrink</h2> <div class="flex-container"> <div class="item shrink2">1</div> <div class="item shrink1">2</div> <div class="item shrink2">3</div> </div> <h2>flex-basis</h2> <div class="flex-container"> <div class="item basis100">1</div> <div class="item basis200">2</div> <div class="item basis300">3</div> </div> <h2>flex</h2> <div class="flex-container"> <div class="item flex1">1</div> <div class="item flex2">2</div> <div class="item flex1">3</div> </div> <h2>align-self</h2> <div class="flex-container align-self"> <div class="item self-start">1</div> <div class="item self-center">2</div> <div class="item self-end">3</div> <div class="item self-stretch">4</div> <div class="item self-base">5</div> </div> <div style="height:500px;"></div> </div> </body> </html>
HTML
복사
CSS
.container { width: 100%; margin: 0 auto; border: 3px dashed orange; } /* container * item */ .flex-container { display: flex; border: 1px solid lightcoral; } .item { width: 100px; height: 100px; margin: 20px; padding: 20px; font-size: 40px; line-height: 60px; text-align: center; background-color: cornflowerblue; color: white; box-sizing: border-box; } /* order */ .order-1 { order: -1; } .order1 { order: 1; } .order2 { order: 2; } .order3 { order: 3; } .order4 { order: 4; } /* flex-grow */ .grow1 { flex-grow: 1; } .grow2 { flex-grow: 2; } /* flex-shrink */ .shrink1 { flex-shrink: 1; width: 800px; } .shrink2 { flex-shrink: 2; width: 800px; } /* flex-basis */ .basis100 { flex-basis: 100px; } .basis200 { flex-basis: 200px; } .basis300 { flex-basis: 300px; } /* flex */ /* [flex-grow] [flex-shrink] [flex-basis] */ .flex1 { flex: 1 1 200px; } .flex2 { flex: 2 2 300px; } /* align-self */ .align-self { height: 600px; } .self-start { align-self: flex-start; } .self-center { align-self: center; } .self-end { align-self: flex-end; } .self-stretch { align-self: stretch; height: auto; } .self-base { align-self: baseline; }
CSS
복사

Quiz

간단 퀴즈 10제

Flexbox Froggy

불쌍한 개구리가 연못에 빠졌습니다. 귀찮아 죽겠지만 개구리를 연못에서 건져서 수련 잎에 올려서 구조해봅시다.

간단 퀴즈 10제

Flex 레이아웃에 대하여 이해하였는지 간단한 퀴즈를 통해 점검해봅시다.