본문 바로가기
HTML+CSS

float를 이용한 탭 메뉴 버튼 만들기 - Part 1

by 즐코딩 2023. 2. 12.
반응형

float를 이용한 탭 메뉴 버튼 만들기 - Part 1



HTML/CSS를 이용해서 Tab Menu 버튼을 만들어 봅시다. 바로 이런 거요.

탭을-클릭하면-설명-내용이-바뀌는-탭메뉴를-만들어봅시다
탭을 클릭하면 설명 내용이 바뀌는 탭메뉴를 만들어봅시다


쇼핑몰 상품설명 상세페이지에서 흔히 볼수 있는 형태입니다.

저의 입장에서라면 사실 flex를 이용하는 게, 익숙치 않은 float를 사용하는 것보다 훨씬 더 직관적이고 쉬울듯 하지 않을까라는 생각이 들기도 하지만, 다른 사람이 만들어 놓은 결과물을 수정해야 하는 경우도 있으니, 이 참에 먼저 float를 이용하여 만든 탭 메뉴에 익숙해질 수 있도록 포스팅을 통해 정리를 합니다.

html 뼈대 구성


뼈대가 되는 html은 다음과 같이 ul, li를 이용해서 메뉴 형식으로 구성했습니다. 하단 각각의 div는 각 탭을 눌렀을 경우에 보여주거나 숨길 설명 내용입니다.

물론 부트스트랩을 사용했습니다. bootstrap을 사용하기 위한 코드를 html 상단 하단에 넣어주세요.(모르면 이전에 다른 포스팅에서 많이 다뤘으니 참고해주세요!)

<body>
    <div class="container mt-5">
        <ul class="list">
          <li class="tab-button selected">Tab Menu01</li>
          <li class="tab-button">Tab Menu02</li>
          <li class="tab-button">Tab Menu03</li>
        </ul>
        <div class="tab-content show">
          <p>Menu01 설명내용</p>
        </div>
        <div class="tab-content">
          <p>Menu02 설명내용</p>
        </div>
        <div class="tab-content">
          <p>Menu03 설명내용</p>
        </div>
      </div>
</body>


CSS - float: left;로 구성


이번 포스팅에서 가장 중요한 내용은 CSS입니다. 아주 기가 막히는 실무 꿀팁이 들어 있습니다.

<style>
    ul.list {
      list-style-type: none;
      margin: 0;
      padding: 0;
      border-bottom: 1px solid gray;
    }
    ul.list::after {   //바로 이 부분이 실무 꿀팁입니다! 이런 방법이!!
      content: '';
      display: block;
      clear: both;
    }
    .tab-button {
      display: block;
      padding: 10px 30px 10px 30px;
      float: left;
      margin-right: -1px;
      margin-bottom: -1px;   //이 부분도 약간의 팁. 하단 라인과 관련있습니다.
      color: grey;
      text-decoration: none;
      cursor: pointer;
    }
    .selected {
      border-top: 2px solid dodgerblue;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid white;
      border-left: 1px solid #ccc;
      color: black;
      margin-top: -2px;
    }
    .tab-content {
      display: none;
      padding: 10px;
    }
    .show {
      display: block;
    }
  </style>


남이 짜 놓은 CSS를 공부하는 가장 좋은 방법은 주석처리를 이용해서 동작결과를 샅샅히 살펴보는 것입니다. 그리고 각 엘리먼트가 차지하는 영역을 확실하게 보면서 이해를 돕기 위해서는, background-color 속성을 이용해서 배경색상을 정해주고 살펴보면 더욱 도움이 됩니다.(직접 해보세요!!)

.tab-button은 float: left; 를 이용해서 붕~ 띄워서 정리한 형태입니다.
(사실 저는 컨트롤이 어려워서 float 보다는 flex를 선호하는 편입니다만...)

<li> 태그들에 버튼처럼 스타일을 준 후 float로 띄워서 가로로 배치를 한 것입니다.

float에 대한 개념이 아직 제대로 정립되지 않았다면, 아래 영상을 꼭 참고해주세요. 아주 쉽게 이해됩니다.

https://youtu.be/xara4Z1b18I



float 이후에는 잊지말고 clear: both;


만약에 clear: both;를 주지 않으면 이번 예제는 float: left;에 계속 영향을 받기 때문에 아래와 같은 모습이 될 것입니다.

div-박스들이-float:left;의-영향을-받고-있습니다
div 박스들이 float:left;의 영향을 받고 있습니다


따라서, 탭 메뉴 부분에 대한 배치를 끝내고 나면, div 영역이 영향을 받지 않도록 clear를 해줘야 하는 것이 중요합니다.

정확하게는 float: left; 이후에는 clear: left;를 써주고, float: right; 이후에는 clear: right;를 사용하라고 만든 것이긴 하지만, 실무에서는 앞에 뭐가 있든 상관없이 혹은 고민없이 clear: both;를 주로 사용합니다. 편하니까요.

이번 레이아웃 예제의 꿀팁은 가상 엘리먼트 선택자를 사용한 바로 이 부분입니다.

ul.list::after {
content: "";
display: block;
clear: both;
}


<ul> 태그의 자식들인 <li>들을 float: left;를 이용해서 띄웠기 때문에, 이후의 엘리먼트들이 float에 대해 영향을 받지 않게 하려면, 각 엘리먼트들 마다 clear를 적용해주어야 합니다.

그런데 말입니다... ul.list::after를 이용해서 가상의 엘리먼트를 설정한 후 display: block으로 영역을 차지하는 block 속성으로 만들고 이 녀석에게 clear: both;를 준 것입니다.

즉, 가상의 ul.list::after 이 녀석은 clear: both;를 위해서 존재하는 엘리먼트가 된 것입니다. 태어나서 죽을 때까지 ul을 따라다니게 되며, 이후에 나오는 엘리먼트들에 대해서는 clear를 생각하지 않아도 될 수 있게 해주는 것입니다.

누가 최초에 이런 생각을 했는 지 모르겠지만, 정말 smart한 결과물이 아닐 수 없다는 생각이 듭니다. 저는 혼자서 저런 생각까지 이르게 되려면, 아주~ 더 많은 내공이 필요할 것입니다.


class를 붙였다 떼었다 하는 방식


클릭을 통해 선택된, 혹은 열려 있는 탭 메뉴를 표현하는 UI는 어떻게 구현하면 되는 것일까요?
대부분의 실무에서는 미리 class로 정의를 해둔 후 JS를 이용해서 붙였다 떼었다 하는 방식을 사용합니다.

첫번째 <li> 태그의 class에 .selected가 붙어 있고, 첫번째 설명 <div>에 .show 클래스가 붙어 있는 모습에서

첫번째 요소들에만 .selected와 .show가 적용된 상태


두번째 <li> 태그의 class에 .selected가 붙어 있고, 두번째 설명 <div>에 .show 클래스가 붙어 있는 모습이 됩니다.

두번째-요소들에만-.selected와-.show가-적용된-상태
두번째 요소들에만 .selected와 .show가 적용된 상태


이런 동작방식은 Javascript로 구현하면 되는 것이겠죠? 앞으로 어떻게 코딩을 하게 될 것인지, 가닥이 좀 잡히죠?
다음 포스팅에서 동적 구현을 다뤄보도록 하겠습니다.


마치며


동작을 위한 코딩도 중요하지만, 이번 포스팅에서는 float: left;와 clear:both;를 이해하는 게 정말 중요하기 때문에 자세하게 설명을 하고자 했습니다. 코드 자체도 실무에서 빈번하게 사용되었던 형태기도 하구요.

예제로 제공된 CSS를 주석처리하고, background-color를 주면서 CSS의 각 코드 라인들이 어떤 결과물 형태로 영향을 주는지 꼭 확인을 해보세요. 아주 좋은 공부가 될 것입니다.

즐거운 코딩 생활, 즐코딩.
KINcoding.com

반응형

댓글