본문 바로가기

개발/javascript

[JS] 반응형 네비게이션바

이번 예제는 반응형 네비게이션 바입니다. 

 

먼저 html 파일입니다. 

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Navbar</title>
    <!-- font-awesome -->
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"
    />

    <!-- styles -->
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <nav>
      <div class="nav-center">
        <!-- nav header -->
        <div class="nav-header">
          <img src="./logo.svg" class="logo" alt="logo" />
          <button class="nav-toggle">
            <i class="fas fa-bars"></i>
          </button>
        </div>
        <!-- links -->
        <ul class="links">
          <li>
            <a href="index.html">home</a>
          </li>
          <li>
            <a href="about.html">about</a>
          </li>
          <li>
            <a href="projects.html">projects</a>
          </li>
          <li>
            <a href="contact.html">contact</a>
          </li>
        </ul>
        <!-- social media -->
        <ul class="social-icons">
          <li>
            <a href="https://www.twitter.com">
              <i class="fab fa-facebook"></i>
            </a>
          </li>
          <li>
            <a href="https://www.twitter.com">
              <i class="fab fa-twitter"></i>
            </a>
          </li>
          <li>
            <a href="https://www.twitter.com">
              <i class="fab fa-behance"></i>
            </a>
          </li>
          <li>
            <a href="https://www.twitter.com">
              <i class="fab fa-linkedin"></i>
            </a>
          </li>
          <li>
            <a href="https://www.twitter.com">
              <i class="fab fa-sketch"></i>
            </a>
          </li>
        </ul>
      </div>
    </nav>
    <!-- javascript -->
    <script src="app.js"></script>
  </body>
</html>

 

반응형 웹이란? 

반응형 웹은 다양한 디바이스와 화면 크기에 따라 웹 페이지의 레이아웃과 콘텐츠가 자동으로 최적화 되는 웹 디자인 접근 방식이다. 이를 통해 데스크톱, 테블릿, 스마트폰 등 다양한 환경에서 사용자가 일관된 사용자 경험을 누릴 수 있다.

 

그래서 위의 코드로 완성된 전체 화면은 이런 모습을 가지고 있다. 

 

 

 

 

페이지의 사이즈가 작아짐에 따라서 화면을 구성하는 레이아웃들이 변동된다. 

또한 이에 따라 기존의 메뉴들이 navbar로 변동되었다. 

 

이 네브바를 펼치는 버튼을 햄버거 버튼이라고하는데 

이 버튼을 눌렀을 때 내부에서는 코드가 다음처럼 변하게 된다.

<ul class="links">...</ul>

 

 

<ul class="links">...</ul>

 

<ul class="links">...</ul>

<ul class="show-links">...</ul>

 

CSS파일에서 댜음 코드들을 확인해보자 

 

.links와 .show-links

.links {
  height: 0;
  overflow: hidden;
  transition: var(--transition);
}
.show-links {
  height: 10rem;
}

 

- .links에서는 높이를 0으로 설정하여 화면에 보이지 않도록 하였고 overflow를 hidden으로 하여 요소내부의 콘텐츠가 넘칠 경우에 이를 숨기도록 하였다. 이 hidden설정은 높이가 0일때 콘텐츠가 보이지 않도록 하는데 중요한 역할을 한다. transition: var(--transition);는 css변수를 사용하여 트랜지션효과를 설정한다. --transition변수는 일반적으로 트랜지션 지속 시간과 속성을 정의하는데에 사용된다.

 

- .show-links클래스가 추가되면 높이가 10rem으로 확장된다. 1rem은 루트 요소의 폰트크기를 의미하므로 10rem은 루트요소 폰트 크기의 10배 높이를 의미한다. 

 


그럼 이러한 화면의 동작을 구현하기 위한 javascript이다.

const navToggle = document.querySelector(".nav-toggle");
const links = document.querySelector(".links");

navToggle.addEventListener("click", function () {
  links.classList.toggle("show-links");
});

 

1.선택자 정의

navToggle에는 .nav-toggle을 links에는 .llinks를 querySelector를 이용해서 할당해준다. 

nav-toggle은 navbar를 화면에 표시해주는 햄버거 버튼이다. 

 

2. 이벤트리스너 추가 

navToggle에 이벤트리스너를 추가해서 "click"해주면 함수가 발생하도록 한다. 

 

3. 클래스 토글링

함수에서 link.classList.toggle메서드는 show-links가 요소에 존재하면 제거하고 존재하지 않으면 추가한다. 

이를 통해 사용자가 버튼을 클릭할 때마다 링크 목록의 가시성이 전환된다. 

 

 

 

 

 

 

'개발 > javascript' 카테고리의 다른 글

[JS]modal만들기  (0) 2024.06.23
[JS] 사이드 바 만들기  (0) 2024.06.16
[JS] Review Carousel 리뷰캐러셀  (1) 2024.06.08
[JS] Counter 만들기  (1) 2024.06.08
[JS]Color Flipper 만들기2  (2) 2024.06.07