Next.js+BULMA로 애니메이션 햄버거 메뉴 만들기

하고 싶은 일



  • BULMA은 매우 가볍고 다루기 쉽고 확장 가능한 CSS 프레임 워크입니다.


  • 이번에는 Next.js로 만든 사이트에 BULMA를 도입하고 햄버거 메뉴를 만들고 거기에 애니메이션을 붙이는 것을 시도했습니다
  • 완성된 것은 이쪽👇



  • BULMA 도입


  • 이번은, CDN으로부터 참조해 사용하고 있습니다.
  • html의 <Head> 태그내에, BULMA를 사용하기 위한 링크를 추가합니다.
  • fontawesome을 사용하고 있으므로 링크도 추가했습니다.

  • components/layout.tsx
    <Head>
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css" />
      <link rel="stylesheet" href="https://bulma.io/vendor/fontawesome-free-5.15.2-web/css/all.min.css" />
    </Head>
    

    NavBar 구성 요소 만들기



  • components/NavBar.tsx를 만들고 components/layout.tsx에서 호출합니다.

  • Navbar | BULMA 의 문서로부터 copipe 해 만들었습니다.

  • components/NavBar.tsx
    import React, { useState } from 'react'
    
    export default function NavBar() {
      const [openMenu, setOpenMenu] = useState('')
      const toggleMenu = () => openMenu === 'is-active' ? setOpenMenu('') : setOpenMenu('is-active')
    
      return (
        <nav className="navbar" role="navigation" aria-label="main navigation">
          <div className="container">
            <div className="navbar-brand">
              <a role="button" className={`navbar-burger ${openMenu}`}aria-label="menu" aria-expanded="false" data-target="navbarBasicExample" onClick={toggleMenu}>
                <span aria-hidden="true"></span>
                <span aria-hidden="true"></span>
                <span aria-hidden="true"></span>
              </a>
            </div>
            <div id="navbarBasicExample" className={`navbar-menu ${openMenu}`}>
              // 省略(ここにメニューを配置する)
            </div>
          </div>
        </nav>
      )
    }
    

    🌟 포인트


  • const [openMenu, setOpenMenu] = useState('')에서 toggleMenu의 초기 값 설정
  • toggleMenu 는 햄버거 메뉴의 개폐를 toggle한다function
  • className={`navbar-burger ${openMenu}`}에서 햄버거 메뉴의 개폐시 CSS를 설정하는 요소 판별을위한 클래스를 openMenu라는 변수에 저장하고 부여합니다.
  • className={`navbar-menu ${openMenu}`}도 마찬가지입니다.
  • 여기까지 하면, 햄버거 메뉴의 개폐는 가능하게 됩니다.
  • 개폐시의 애니메이션을 붙이고 싶은 경우는, 이하의 CSS를 더할 필요가 있습니다.

  • 메뉴 개폐에 애니메이션 추가



  • styles/global.css에 다음 소스를 더하십시오

  • styles/global.css
    .navbar {
      position: sticky;
      top: 0;
      min-height: 3.5rem;
    }
    .navbar-brand {
      min-height: 3.5rem;
    }
    
    @media screen and (max-width:1023px) {
      html,
      body {
        font-size: 82.5%;
      }
      .navbar-menu {
        width: 3.5rem;
        top: 0rem;
        opacity: 0;
        transition: all 0.3s;
        display: block;
        z-index: -1;
        position: absolute;
        width: 100%
        pointer-events: none;
      }
      .navbar-menu.is-active {
        transform:translateY(3.5rem);
        opacity: 1;
        z-index: 10;
        pointer-events: auto;
      }
      .navbar-burger {
        height: 3.5rem;
        width: 3.5rem
      }
    }
    
    

    🌟 포인트


  • z-index: -1; 에서 숨기기, z-index: 10; 로 표시합니다.
  • opacity: 0;opacity: 1;는 푹신한 표시/숨기기 위해 지정됩니다
  • transform:translateY(3.5rem);는 위에서 내려 오도록 지정
  • opacity: 0; 의 경우, 링크는 사라지지 않기 때문에 밀어 버린다. 따라서 pointer-events: auto;pointer-events: none; 에서 메뉴가 숨겨진 경우 메뉴 링크를 클릭할 수 없습니다.
  • .navbar position: sticky;top: 0;는 Navbar를 고정하기 위해 지정되었으므로 필요하지 않으면 삭제합니다.
  • 그 외는 배치를 정돈하기 위해서 지정하고 있습니다

  • 감상


  • BULMA는 클래스를 지정하는 것만으로 페이지를 꽤 예쁘게 정돈할 수 있습니다. 불필요한 것이 붙어 있지 않기 때문에, 애니메이션 등 스스로 좋아하는 것처럼 붙일 수 있는 것이 좋다고 느꼈습니다.
  • 참고로 페이지 전환에는 Framer motion에서 애니메이션을 붙이고 있습니다. 하지만, 조금 복잡하고 아직 전혀 이해가 따라잡지 않았기 때문에, BULMA 정도 심플한 것은 정말로 도움이 됩니다.

  •  미리보기는 이 사이트에서 가능합니다


  • 포트폴리오 사이트로하고 싶지만 단지 실험장에서 밖에없는 페이지입니다 😂
  • 좋은 웹페이지 즐겨찾기