HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🐣
프론트엔드 데브코스 3기 교육생
/
😃
나영팀
/
display: flex

display: flex

발표일
Nov 21, 2022
작성자
백민종

선정 이유

  • 예전에 일을 할 때는 css를 잘 모르니 float, display: inline-block 등을 이용해 수직, 수평 정렬을 지저분(?)하게 구현함.
  • 4주차 과제를 수행하면서 display: flex를 처음으로 사용함.
  • 간단하게 수직, 수평 레이아웃을 만들 수 있어서 편리했음.

과거에 나는..

예전에 일을 할 때 회사의 CMS UI를 수정해야하는 일이 종종 있었다. block 요소를 수평 정렬할때 아래와 비슷하게 코드를 작성했었다.
<html> <head> <title>test</title> <style> .clearfix { clear: both; } .box { float: left; color: white; width: 50px; height: 50px; border: solid 1px solid; margin: 5px; } .bg-red { background-color: red; } .bg-green { background-color: green; } .bg-blue { background-color: blue; } </style> </head> <body> <main> <div class="box bg-red">1</div> <div class="box bg-green">2</div> <div class="box bg-blue">3</div> <div class="clearfix"></div> <div class="box bg-red">4</div> <div class="box bg-green">5</div> <div class="box bg-blue">6</div> <div class="clearfix"></div> </main> </body> </html>
notion image

위 코드의 문제점

  • 다음에 올 요소가 float 영향을 받지 않기 위해 clearfix 라는 className을 갖는 요소가 필요하다.
  • 마크업 구조가 한 눈에 들어오지 않는다.

사이드바 구현

notion image
문서들을 위와 같이 렌더링 하고 싶었다. 조건은 두가지 정도였다.
  • 화면에 보이는 것 처럼 4개 요소가 수평 정렬되어야 함.
  • 타이틀 부분은 남는 영역의 전체를 차지해야함.

table 태그를 사용해볼까..?

  • list 관련 태그가 조금더 시맨틱한 태그라고 생각됨.
  • 하위 문서마다 margin-left 값이 늘어나야하는데 table 태그는 적절하지 않아보임.
 

display: flex

찾아보니 쉽게 정렬할 수 있는 display:flex 속성이 있다는 걸 알게됨.
.item { display: flex; /* 교차축 중앙 위치 */ align-items: center; /* 요소를 양 끝에 두어 제일 긴 간격을 둠 */ justify-content: space-between; } .item .title { width: 100%; } .item .button-group { margin-left: auto; width: 35px; /* width 100% 인 .title 때문에 요소가 줄어들지 않도록 */ flext-shrink: 0; }
<div class="item"> <div class="title"> <span class="icon"></span>title </div> <div class="button-group"> <span class="icon"></span> <span class="icon"></span> </div> </div>

수직 정렬

notion image
사이드바를 구현했는데 문제가 있었다. 제일 아래쪽 요소에 hover 이벤트가 발생하여 숨겨진 버튼 (삭제, 추가)이 나올때 스크롤이 계속 변하는 것이었다. 이유가 뭔지 계속 찾아봤고 아래와 같은 패턴을 발견할 수 있었다.
  • 처음부터 요소가 보이는 상황이면 동일한 현상이 나타나지 않음.
  • 마지막 요소 근처에서만 동일한 현상이 발생함.
  • 마우스가 마지막 요소 바로 위에 있는 경우는 발생하지 않음
발견한 패턴을 토대로 마지막 요소에서 숨겨진 버튼이 추가되면서 컨테이너 크기를 벗어나 height 값이 바뀌는 것 같다는 결론을 내렸다.

그렇다면, 요소의 height를 고정해야하는데..

  • height: 100%;
  • 100vh;
  • height: 720px;
위와 같은 스타일링들은 유효하지 않았다. 정확하게 말하자면 저 현상이 보이지 않더라도, 컴포넌트가 화면 밖을 침범하면서 렌더링 되거나, 브라우저의 사이즈에 따라 보기 싫은 모양으로 렌더링 되었다.
 
한참을 고민 하던 중, 위에서 문서를 정렬하면서 flex를 사용했을 때 width가 꽉 차는것이 생각나서 flex로 수평정렬이 가능하다면, height를 꽉 채우지 않을까? 라는 생각이 들었다.
 
그리고 그 방법은 유효했다!
display: flex; flex-direction: column;
단 두줄로 완벽하게 문제를 해결할 수 있었다.

마무리 하면서…

  • flex를 사용하면 요소의 정렬을 쉽게 할 수 있다.
  • 속성들이 많기 때문에 한 번씩 찾아보고, 직접 과제에 적용하면서 익히면 좋을 것 같다.
CSS Flex(Flexible Box) 완벽 가이드
대부분 사이트는 전체 레이아웃이 수직 구성이며 '위-아래'로 스크롤 하여 사용합니다.레이아웃을 구성할 때 가장 많이 사용하는 요소(Elements)들이 기본적으로 블록(Block) 개념으로 표시(Display)되며 이는 뷰(View)에 수직(위에서 아래로)으로 쌓이기 때문에 수직 구성은 상대적으로 쉽게 만들 수 있습니다.하지만 수평(왼쪽에서 오른쪽으로) 구성의 경우는 상황이 조금 다릅니다.
CSS Flex(Flexible Box) 완벽 가이드
https://heropy.blog/2018/11/24/css-flexible-box/
CSS Flex(Flexible Box) 완벽 가이드