선정 이유
- 예전에 일을 할 때는 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>

위 코드의 문제점
- 다음에 올 요소가 float 영향을 받지 않기 위해 clearfix 라는 className을 갖는 요소가 필요하다.
- 마크업 구조가 한 눈에 들어오지 않는다.
사이드바 구현

문서들을 위와 같이 렌더링 하고 싶었다. 조건은 두가지 정도였다.
- 화면에 보이는 것 처럼 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>
수직 정렬

사이드바를 구현했는데 문제가 있었다. 제일 아래쪽 요소에 hover 이벤트가 발생하여 숨겨진 버튼 (삭제, 추가)이 나올때 스크롤이 계속 변하는 것이었다. 이유가 뭔지 계속 찾아봤고 아래와 같은 패턴을 발견할 수 있었다.
- 처음부터 요소가 보이는 상황이면 동일한 현상이 나타나지 않음.
- 마지막 요소 근처에서만 동일한 현상이 발생함.
- 마우스가 마지막 요소 바로 위에 있는 경우는 발생하지 않음
발견한 패턴을 토대로 마지막 요소에서 숨겨진 버튼이 추가되면서 컨테이너 크기를 벗어나 height 값이 바뀌는 것 같다는 결론을 내렸다.
그렇다면, 요소의 height를 고정해야하는데..
- height: 100%;
- 100vh;
- height: 720px;
위와 같은 스타일링들은 유효하지 않았다. 정확하게 말하자면 저 현상이 보이지 않더라도, 컴포넌트가 화면 밖을 침범하면서 렌더링 되거나, 브라우저의 사이즈에 따라 보기 싫은 모양으로 렌더링 되었다.
한참을 고민 하던 중, 위에서 문서를 정렬하면서 flex를 사용했을 때 width가 꽉 차는것이 생각나서 flex로 수평정렬이 가능하다면, height를 꽉 채우지 않을까? 라는 생각이 들었다.
그리고 그 방법은 유효했다!
display: flex; flex-direction: column;
단 두줄로 완벽하게 문제를 해결할 수 있었다.
마무리 하면서…
- flex를 사용하면 요소의 정렬을 쉽게 할 수 있다.
- 속성들이 많기 때문에 한 번씩 찾아보고, 직접 과제에 적용하면서 익히면 좋을 것 같다.