Overview

예제 코드를 통해서 CSS의 속성 중 Flexbox 의 동작 방식에 대해 정리한 포스트입니다.

1. Flexbox란?

아래와 같이 Container 에 여러개의 item 을 배치를 개발자가 쉽게 컨트롤할수 있도록 도와준다.

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 2-47 screenshot

예를 들어 각 아이템의 height 를 동일하게 하거나 각 아이템의 간격을 동일하게 하는 작업을 좀 더 편하게 수행할수 있다.

flexbox 는 크게 두 가지 타입에 대해 적용하게 되는 데

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 4-22 screenshot

  • container : item 을 담고 있는 박스
  • item : container 에 포함되어 있는 요소들

container

container에 지정되어 있는 속성은 아래와 같다.

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 4-27 screenshot

item

item에 지정되어 있는 속성은 아래와 같다.

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 4-46 screenshot

axis

flexbox 는 수평 축, 수직 축을 가지고 있고 둘중 하나를 main axis으로 선택하면 남은 하나는 cross axis 가 된다.

2. container flexbox 속성 적용

아래와 같이 10개의 블록을 선언해보자

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 8-47 screenshot

위 샘플 코드는 아래와 같다.

HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="container">
    <div class="item item1">1</div>
    <div class="item item2">2</div>
    <div class="item item3">3</div>
    <div class="item item4">4</div>
    <div class="item item5">5</div>
    <div class="item item6">6</div>
    <div class="item item7">7</div>
    <div class="item item8">8</div>
    <div class="item item9">9</div>
    <div class="item item10">10</div>
  </div>
</body>
</html>

CSS

.container {
  background : beige;
  height :100vh;
}

.item {
  width : 40px;
  height :40px;
}

.item1 {
  background : #e57373;
}

.item2 {
  background : #f06292;
}

.item3 {
  background : #ba68c8;
}

.item4 {
  background : #9575cd;
}

.item5 {
  background : #7986cb;
}

.item6 {
  background : #64b5f6;
}

.item7 {
  background : #4fc3f7;
}

.item8 {
  background : #4dd0e1;
}

.item9 {
  background : #4db6ac;
}

.item10 {
  background : #81c784;
}

container 를 flexbox 로 적용하기 위해서 display:flex 를 추가하면 아래와 같이 블록이 정렬이 되는 것을 확인할 수 있다.

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 9-37 screenshot

2.1. flex-direction

블록의 방향을 변경할 때 사용하며 기본 값은 row 이다.

.container {
  background : beige;
  height : 100vh;
  display :flex;
  flex-direction: row;
}

그 외 값은 아래와 같다.

row row-reverse
image image
column column-reverse
image image

2.2. flex-wrap

한 줄에 아이템이 너무 많을 경우 아이템을 다른 줄로 줄 바꿈을 할지 아님 아이템 사이즈를 축소시켜서 한 줄에 표시할지를 결정한다.

{
  ... 
  flex-wrap : nowrap; // or `wrap`
}

기본 값은 nowrap 이며 nowrap 일 경우 아래와 같이 item 을 감싸는 container 가 작아져도 무조건 한줄로 표시됨을 볼 수있다.

111

flex-wrap 값을 wrap 으로 지정한 경우 아래와 같이 container 가 작아지면 자동으로 줄 바꿈을 하는 것을 볼수 있다.

2222

2.3. justify-content

중심 축 기준으로 item 을 어떻게 배치할지 결정한다.

{
    justify-content : start // or end, space-around, ...
}

start

디폴트 값으로 중심 축이 수평 방향이면 item 을 왼 쪽에 그리고 수직 방향이면 item 을 위 쪽에 배치를 한다.

end

중심 축이 수평 방향이면 아이템을 오른 쪽 에 그리고 수직 방향이면 아이템을 아래 쪽에 배치를 한다.

center

item 을 중앙으로 배치한다.

image

space-around

중심 축이 수평 방향이면 아이템 좌 우에 동일한 크기의 space 가 추가된다. 그리고 수직 방향이면 위, 아래에 동일한 크기의 space 가 추가된다.

image

space-between

item 과 item 사이의 space 의 사이즈는 모두 동일하고 item 과 container 의 space 사이즈는 0가 된다.

image

space-evenly

item 과 item 사이 그리고 item 과 container 의 space 사이즈는 모두 동일하다.

image

2.4. align-content

반대 축의 item 을 어떻게 배치할지 결정

center space-around space-between
image image image
{
    align-content : start // or end, space-around, ...
}

3. item flexbox 속성 적용

다음은 item 에 대해서 적용되는 여러 flexbox 의 속성을 알아보자 먼저 아래와 같이 container 애 item 이 있다고 가정할 때

Output

image

HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="container">
    <div class="item item1">1</div>
    <div class="item item2">2</div>
    <div class="item item3">3</div>
  </div>
</body>
</html>

CSS

.container {
  background : beige;
  height :100vh;
  display : flex;
}

.item {
  width : 40px;
  height :40px;
  border : 1px solid black;
}

.item1 {
  background : #e57373;
}

.item2 {
  background : #f06292;
}

.item3 {
  background : #ba68c8;
}

3.1. flex-grow

item 이 container 에 여유 공간이 있으면 사이즈를 차지하려고 할 때 사용되는 값이다.

{
  flex-grow : 1 // defalt : 0
}

item1 의 flex-grow 를 1로 지정하게 되면 아래와 같이 item1 이 남은 공간을 모두 차지하는 것을 볼수 있다.

image

그리고 모든 item 들에 대해서 flex-grow 를 1로 지정하게 되면 아래와 같이 모든 item 들이 동일한 크기로 남은 공간을 차지하게 된다.

image

위 상태에서 item1 flex-grow 를 2로 변경하게 되면 item1은 item2, item3 의 두 배의 사이즈를 차지하게 된다.

image

3.1. flex-shrink

container 에 여유 공간이 없을 때 item 의 사이즈를 결정하는 속성이다. flex-grow 의 반대 속성이다.

아래 화면은 item1의 flex-shrink 값을 2로 하고 나머지는 flex-shrink 를 1로 했을 때 어떻게 동작하는 지 보여준다.

2222

3.2. flex-basis

container 의 사이즈가 늘어나거나 줄어들때 동일한 비율을 유지할 때 사용되는 속성이다.

{
   flex-basis : 10% // default : auto, 0%~100%
}

각 item 의 속성을 아래와 같이 지정했을 때

.item1 {
  background : #e57373;
  flex-basis : 70%
}

.item2 {
  background : #f06292;
  flex-basis : 20%
}

.item3 {
  background : #ba68c8;
  flex-basis : 10%
}

결과 화면이 아래와 같이 출력되는 것을 볼수 있다.

image

3.3. align-self

하나의 item에 대해 위치를 변경하고 싶을 때 사용한다.

.item {
    align-self : center // start ,end ...
}

item1 의 align-self 값을 center 로 변경하게 item1이 container 중앙에 배치되는 것을 볼수 있다.

image

4. 참고 자료

4.1. Guide to Flexbox

좀 더 자세한 flexbox 정보는 아래 사이트 참고

image A Complete Guide to Flexbox

4.2. FLEXBOX FROGGY

flexbox 를 학습하기 위한 game 형식 사이트

CSS Flexbox 완전 정리  포트폴리오 만드는 날까지! _ 프론트엔드 개발자 입문편_ HTML, CSS, Javascript 22-35 screenshot

FLEXBOX FROGGY

5. Reference

youtube, 드림코딩 by 엘리

태그: ,

카테고리:

업데이트:

댓글남기기