본문 바로가기
웹 개발/UI

HTML, CSS로 사이드바 만들기

by 주식 키우는 개발자 2020. 6. 6.
반응형

 

버튼을 누르면 왼쪽에서 나오고 다시 누르면 왼쪽으로 사라지는 사이드바를 만들어보겠습니다.

기본적으로 javascript혹은 jquery를 이용해 이벤트 처리를 해서 작업하는 경우가 많은데 HTML/CSS만 사용해서 열리고 닫히는 사이드바를 제작해보겠습니다.

디자인은 신경쓰지 않고 작성하는 점 양해바랍니다.

설계

Html/css만 사용해서 열리고 닫히는 기능을 구현하기 위해서는 input태그를 사용해야합니다.

체크박스와 라벨을 연결해놓으면 라벨을 클릭했을 때 체크박스가 선택되는 점을 이용하는 것입니다.

체크박스가 선택되었을 경우 사이드바를 보여주고 숨기는 css코드를 작성해주겠습니다.

label버튼 만들기

.side_toggle_btn::before {
  content: ">";
  display: inline-block;
  width: 50px;
  line-height: 50px;
  font-size: 24px;
  text-align: center;
  border-right: 1px solid #000;
}
.side_input:checked + .side_toggle_btn::before {
  content: "<";
}
 <header>
      <input type="checkbox" id="side_btn" class="side_input" />
      <label for="side_btn" class="side_toggle_btn"></label>
</header>

위와 같이 작성하면 라벨을 클릭했을 경우에 체크박스가 선택되는 구조를 만들 수 있습니다.

 

side bar toggle

위 성질을 이용해서 체크박스가 체크되어있을 경우 .side_listleft값을 변경해주면 자바스크립트 없이도 자연스러운 사이드 바를 제작할 수 있습니다.

.side_input:checked ~ .side_list {
  left: 0;
}

.side_list {
  position: absolute;
  left: -200px;
  top: 50px;
  bottom: 0;
  border-right: 1px solid #000;
  width: 200px;
  font-size: 24px;
  transition: 0.3s ease-in;
}

.side_link {
  display: block;
  text-align: center;
  padding: 40px 0;
  border-bottom: 1px solid #000;
}
 <header>
      <input type="checkbox" id="side_btn" class="side_input" />
      <label for="side_btn" class="side_toggle_btn"></label>
      <div class="side_list">
        <a href="#" class="side_link">menu1</a>
        <a href="#" class="side_link">menu2</a>
        <a href="#" class="side_link">menu3</a>
        <a href="#" class="side_link">menu4</a>
        <a href="#" class="side_link">menu5</a>
      </div>
    </header>

checkbox 숨기기

위와 같이 동작은 잘 하지만 checkbox를 숨겨야 하기 때문에 checkbox에 blind 클래스를 추가해줍니다.

최종 코드

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      html,
      body {
        margin: 0;
        padding: 0;
      }
      .blind {
        position: absolute;
        top: 0;
        left: 0;
        width: 1px;
        height: 1px;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
      }

      header {
        border-bottom: 1px solid #000;
      }
      a {
        text-decoration: none;
      }
      .side_toggle_btn::before {
        content: ">";
        display: inline-block;
        width: 50px;
        line-height: 50px;
        font-size: 24px;
        text-align: center;
        border-right: 1px solid #000;
      }

      .side_input:checked + .side_toggle_btn::before {
        content: "<";
      }

      .side_input:checked ~ .side_list {
        left: 0;
      }

      .side_list {
        position: absolute;
        left: -200px;
        top: 50px;
        bottom: 0;
        border-right: 1px solid #000;
        width: 200px;
        font-size: 24px;
        transition: 0.3s ease-in;
      }

      .side_link {
        display: block;
        text-align: center;
        padding: 40px 0;
        border-bottom: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <header>
      <input type="checkbox" id="side_btn" class="side_input blind" />
      <label for="side_btn" class="side_toggle_btn"></label>
      <div class="side_list">
        <a href="#" class="side_link">menu1</a>
        <a href="#" class="side_link">menu2</a>
        <a href="#" class="side_link">menu3</a>
        <a href="#" class="side_link">menu4</a>
        <a href="#" class="side_link">menu5</a>
      </div>
    </header>
  </body>
</html>


이처럼 input의 check상태를 통해서 자바스크립트 없이도 동적으로 동작하는 메뉴바를 만들어보았습니다. 이런 개념과 더불에 animation과 transition, transform을 적용시킨다면 순수 html/css만으로도 많은 부분을 해결할 수 있습니다. 실제로 JavaScript와 Jquery를 무조건 사용해서 개발하는 것보다 CSS로 처리할 수 있는 부분은 처리를 하는 것이 성능상에도 좀 더 좋습니다.

댓글