Sitemap

7분만에 알아보는 CSS flexbox

flexbox 이제는 끝내보자

12 min readJan 18, 2021

--

Press enter or click to view image in full size
Photo by lucas Favre on Unsplash

flexbox?

flexbox는 요소의 배치를 1차원적으로 효과적으로 할 수 있게 도와주는 css의 기능입니다. 말이 조금 어렵죠? 실전 예제를 통해서 언제 사용하는지 하나씩 보도록 하겠습니다.

flexbox를 구성하는 요소 — container, item

Press enter or click to view image in full size

flexbox에서는 크게 두 가지 개념이 사용됩니다.

첫번째는 위 그림의 점선처럼 ITEM1, ITEM2, ITEM3를 감싸는 container가 있습니다.

containerflexbox를 사용하기 위해서는 필수이며, 여러 속성을 통해서 내부 아이템의 정렬이나 속성들을 부여 할 수 있습니다. container 에는 반드시 display: flex 속성을 주어야 flexbox로 사용할 수 있습니다.

itemflexbox를 내부를 구성하는 자식 요소들을 가르킵니다. 위 코드에서는 <div class="box">ITEM1</div> <div class="box">ITEM2</div> <div class="box">ITEM3</div> 이렇게 3개의 아이템이 있습니다. flexbox 내부의 아이템에는 다양한 속성으로 통해 배치 순서, 내부 내용을 정렬할 수 있습니다.

flexbox가 엘리먼트를 쌓는 법 (주축과 교차축)

flexbox에서는 내부의 요소들을 가로, 세로 방향으로 자유롭게 배치할 수 있는데, 그 때 사용하는 것이 flex-direction 속성입니다.

주축은 flexbox 내부의 item을 쌓아 갈 방향입니다. 주축을 설정하려면 flex-direction 속성을 활용하여 가로 혹은 세로로 부여해 줄 수 있습니다.

가로로 주축 설정하기 (flex-direction: row)

하나의 행(row)을 만들고, 내부의 아이템을 순차적으로 앞에서부터 채워 나갑니다.

Press enter or click to view image in full size

세로로 주축 설정하기 (flex-direction: column)

하나의 열(column)을 만들고, 내부의 아이템을 순차적으로 위에서 아래로 채워 나갑니다.

Press enter or click to view image in full size

참고로 display: flex의 기본 flex-direction 방향은 row입니다.

그런데 두 그림을 보면 이상한게 있지 않나요? flex-direction: column의 경우 A, B, C의 행의 끝까지 끝까지 영역을 차지하고 있고, flex-direction: row의 경우 내부 content 만큼의 사이즈만 차지 하고 있습니다.

여기서 알아야 할 것이 바로 교차축입니다.

교차축 (주축의 반대방향)

교차축은 주축의 반대방향입니다. 주축이 row(가로)라면, 교차축은 column(세로), 주축이 column(세로)이면 주축은 row(가로)로 설정됩니다.

교차축이 중요한 이유는 flexbox에서 기본적으로 교차축 방향의 가장 큰 엘리먼트에 크기를 맞추도록 되어 있기 때문입니다.

flex-direction의 방향이 row(가로)라면?

Press enter or click to view image in full size

위 그림을 보면 아까와 달리 C의 높이가 커진 것을 알 수 있습니다. 그에 따라 A와 B도 마찬가지로 높이가 커졌습니다.

flex-direction의 방향이 column(세로)이라면?

Press enter or click to view image in full size

그런데 이상하지 않나요? 내용은 늘어 났는데 길이는 그대로 입니다.

<div class="container column">    
<div class="box">A</div>
<div class="box">B</div>
<div class="box">더 많은 내용을 담고 있는 C</div>
</div>

이유는 A, B, 더 많은 내용을 담고 있는 C를 div가 감싸고 있는데, div가 기본적으로 display: block 속성을 가진 태그이므로 화면 내 하나의 블록(처음부터 끝까지)를 차지하게 됩니다. 이미 flexbox 내에서 최대 크기를 가지고 있으므로 더 이상 커지지 않게 됩니다.

display: block, inline, inline-block 속성에 대해서 잘 모르신다면 이 링크를 읽어보세요.

flexbox의 가장 기본이 되는 특징들을 배웠으니, 이제는 실전 예제들을 통해서 flexbox 기능에 대해 좀 더 알아보도록 하겠습니다.

실전 예제 1. 정중앙에 아이콘 배치하기

flexbox가 없을 때는 중앙에 배치하려면 margin이나 position을 통해 어렵게 배치해야 했었는데, flexbox가 나온 이후로는 정말 쉽게 배치가 가능해 졌습니다.

Press enter or click to view image in full size
<body>   
<div class="container">★</div>
</body>

위와 같이 div 태그 안의 ★가 하나 들어가 있는 것을 알 수 있습니다. 이제 이 태그를 정 중앙에 배치해보도록 하겠습니다. 중앙에 배치하기 위해선 크게 두 가지를 알아야 합니다.

주축을 따라 아이템을 정렬하는 방법 (justify-content)

위에서 사용하던 ABC 박스로 돌아가 보겠습니다.

Press enter or click to view image in full size

정확한 비교를 위해 아까와 달리 containerbackground-color 속성을 주었습니다. 이제 flexbox container에 justify-content 속성을 줘보도록 하겠습니다.

justify-content: center;

.container {     
margin: 1em 0;
border: 3px dotted #4a4a4a;
padding: 0.5em;
background-color: #c2edc8;
display: flex;
flex-direction: row;
/* 아래 코드 추가 */
justify-content: center;
}
Press enter or click to view image in full size

위 그림을 보면, 초록색의 container의 공간 중에서 정중앙에 flexbox item들을 배치한 것을 볼 수 있습니다.

이외에도 주로 많이 쓰는 것들이 몇 가지 있는데, 살펴보고 가도록 하겠습니다.

justify-content: flex-start;

Press enter or click to view image in full size

flex-startflexbox의 기본 설정으로 flexbox가 시작하는 점 기준으로 item을 정렬 시킵니다.

justify-content: flex-end;

Press enter or click to view image in full size

flex-endflexbox가 끝나는 점에 맞추어 item을 정렬 시킵니다.

justify-content: space-between;

Press enter or click to view image in full size

space-betweenflexbox 내에 빈 공간을 균일하게 나누어 item 들 사이에 위치 시킵니다. 이외에도 space-around , space-evenly 등이 있으니 시간이 되시면 직접 해보시는 것을 추천드립니다.

교차축을 따라 아이템을 정렬하는 방법 (align-items)

위에서 사용하던 높이가 커진 ABC 박스로 돌아가 보겠습니다.

Press enter or click to view image in full size
align-items

위 코드를 실행하면 위와 같은 화면이 브라우저에 그려집니다.

align-items: center;

현재 flex-directionrow(가로)이기 때문에, 교차축은 y축 방향입니다. 그럼 이 상황에서 교차축으로 정렬하는 align-itemscenter로 바꿔보도록 하겠습니다.

.container {     
margin: 1em 0;
border: 3px dotted #4a4a4a;
padding: 0.5em;
background-color: #c2edc8;
display: flex;
flex-direction: row;
/* 아래 코드 추가 */
align-items: center;
}
Press enter or click to view image in full size
align-items: center;

container의 세로 방향의 정중앙을 기준으로 flexbox item들이 배열된 것을 알 수 있습니다.

align-items: flex-start, align-items: flex-end

align-itemsjustify-content와 마찬가지로 flex-startflex-end가 있습니다.

교차축인 y축이 시작하는 점에서 부터 정렬을 맞추거나 y축이 끝나는 지점에 아이템을 정렬 시킬 때 사용합니다.

Press enter or click to view image in full size
Press enter or click to view image in full size
align-items: flex-start, align-items: flex-end

align-items: stretch

align-items 의 기본 설정이기도 한 stretch 는 교차축 기준 내부 item들 중 가장 높이가 큰 item 기준으로 높이가 설정됩니다.

아래 그림에서 보면 높이가 가장 큰 C 기준으로 A와 B의 높이가 늘어난 것을 알 수 있습니다.

Press enter or click to view image in full size
align-items: stretch

아이콘 중앙 배치 마무리하기

주축과 교차축 방향으로 정렬하는 것을 배웠으니, 이제 아이콘을 중앙 배열해 보도록 하겠습니다.

Press enter or click to view image in full size
<body>   
<div class="container">★</div>
</body>

위와 같이 ★을 div로 감쌌으니, divdisplay: flex를 주어 flex container로 만들고, 주축으로 중앙 정렬, 교차축으로 중앙 정렬을 하면 될 것 같습니다. 그럼 해보도록 하겠습니다.

<style> 
.container {
background-color: #3f29ef;
width: 200px;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
<body>
<div class="container">★</div>
</body>
Press enter or click to view image in full size

위와 같이 코드를 바꿨더니 어렵지 않게 중앙 배치를 할 수 있게 되었습니다👏👏

실전 예제 2. 네비게이션 바 만들기

Press enter or click to view image in full size
navigation-bar

기본 시작 코드는 위와 같습니다.

위 코드를 실행해보면, 아래와 같이 flexbox 기본 설정에 따라 flexbox가 시작하는 왼쪽에 flexbox item들이 붙어 있는 것을 알 수 있습니다.

Press enter or click to view image in full size

flexbox 내에 하나의 아이템 배치 다루기

맨 처음 우리가 의도한 화면을 만드려면 Home 버튼을 기준으로 왼쪽에 빈 공간이 위치하여야 합니다. 이 때 쉽게 할 수 있는 방법이 있는데 marginauto 속성을 사용하는 것입니다.

코드를 아래와 같이 바꿔보도록 하겠습니다.

Press enter or click to view image in full size

Home 영역에 margin-left: auto 속성을 줌에 따라 남은 공간을 손쉽게 Home 영역 왼쪽으로 배치하게 되었습니다.

한가지 아쉬운 점은 Home 말고도 다른 메뉴가 추가될 수 있으니, classhome인 요소에 margin-left를 주기보단 아래와 같이 flexbox container 내부의 두번째 요소에 margin-left: auto를 주는 것이 좋을 것 같습니다.

Press enter or click to view image in full size

실행했을 때 기존과 동일하게 나오는 것을 알 수 있습니다.

Wrap-Up

요즘에는 웹 페이지 내의 대부분의 배치를 flexbox로 할 정도로 flexbox의 용도는 무궁무진합니다. 여기서 다루지 않은 내용들도 많으니, flexbox에 대해서 좀 더 자세히 알고 싶다면 아래 링크를 통해서 추가적으로 공부해보시는 것을 추천 드립니다.

flexbox로 배울 수 있는 10가지 레이아웃

이번에야말로 CSS Flex를 익혀보자

위 예제에서 사용했던 모든 코드는 아래 github에 올라가 있습니다.

Reference

https://medium.com/free-code-camp/learn-css-flexbox-in-5-minutes-b941f0affc34

https://developer.mozilla.org/ko/docs/Web/CSS/margin

--

--

toy-crane
toy-crane

Written by toy-crane

누구나 쉽게 개발을 공부할 수 있도록 고민합니다.

No responses yet