Programming/JS

[Javascript] 탭 이동 효과 구현하기

w00se 2021. 12. 21. 22:49

https://pixabay.com/ko/photos/해바라기-꽃들-노란-꽃-꽃잎-6515860/

얼마 전에 Vanilla Javascript로 탭 메뉴와 탭 전환 기능을 구현할 일이 있었습니다.

구현을 할 때는 느끼지 못했지만, 돌이켜 생각을 해보니 비효율적으로 구현을 한 게 아닌가 생각이 들었습니다.

 

따라서 해당 기능에 대해 다시 연습을 해보았고, 

이번 글에서는 탭 메뉴와 탭 전환 기능을 구현하는 방식에 대해 정리하려 합니다.

 

연습 예시

연습 예시 화면은 아래와 같습니다.

 

연습 화면 예시

 

구현 방법

구현 설명의 위한 예시

연습 화면은 위 이미지와 같습니다.

빨간색 영역: 버튼 목록 영역으로 각 버튼을 누르면 파란색 영역에 변화가 생깁니다.

파란색 영역: 탭의 내용을 나타는 영역으로, 클릭된 버튼에 따라 '탭 1 페이지', '탭 2 페이지', '탭 3 페이지'로 변하게 됩니다.

 

전체 코드

1. 각 button 태그에 데이터 속성으로 section 태그의 id를 저장

2. click 이벤트 핸들러는 nav 태그에 등록한 후 이벤트의 타깃의 class가 'tab-button'일 때만 탭 전환 기능을 수행하도록 구현

2-1. 탭 전환 기능은 타깃의 데이터 속성과 일치하는 id를 가진 section 태그는 hidden attribute를 제거하고, 그렇지 않은 section 태그는 hidden attribute를 등록하는 방식으로 구현

 

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>탭 연습</title>
</head>
<body>
  <header>
    <h1>탭 메뉴 연습하기</h1>
    <nav id="tab-button-nav">
      <button class="tab-button" data-tab-section="tab-section-1">탭 1</button>
      <button class="tab-button" data-tab-section="tab-section-2">탭 2</button>
      <button class="tab-button" data-tab-section="tab-section-3">탭 3</button>
    </nav>
  </header>
  <main>
    <br>
    <section id="tab-section-1" class="tab-section">
      <div>탭 1 페이지</div>
    </section>
    <section id="tab-section-2" class="tab-section" hidden>
      <div>탭 2 페이지</div>
    </section>
    <section id="tab-section-3" class="tab-section" hidden>
      <div>탭 3 페이지</div>
    </section>
  </main>
  <script>
    const $nav = document.querySelector('#tab-button-nav')
    const $sections = document.querySelectorAll('.tab-section');

    $nav.addEventListener('click', (e) => {
      if (!e.target.classList.contains('tab-button')) {
        return;
      }
      
      const focusedTabId = e.target.dataset.tabSection;

      $sections.forEach(($section) => {
        if ($section.id === focusedTabId) {
          $section.removeAttribute('hidden');
        } else {
          $section.setAttribute('hidden', true);
        }
      });
    });
  </script>
</body>

 


읽어 주셔서 감사합니다 :)

잘못된 부분이 있다면 댓글로 편히 알려주세요!