【问题标题】:Open/Close Animated Hamburger Menu when Clicking Button单击按钮时打开/关闭动画汉堡菜单
【发布时间】:2018-09-16 17:15:29
【问题描述】:

我正在使用动画汉堡菜单 (https://jonsuh.com/hamburgers/) 打开全屏菜单。这一切都按预期工作,我不知道如何在点击时关闭菜单(当然还有反转动画)。

我能够使用 JS 添加“is-active”类,并且添加“onclick="openNav()" 效果很好,但似乎创建 onclick="toggleNav()" 可能更合适,我只是似乎无法弄清楚如何在 JS 中编写它。

function openNav() {
  document.getElementById("popUpNav").style.height = "100%";
}

function closeNav() {
  document.getElementById("popUpNav").style.height = "0%";
}

// Hamburger Menu Spin
var hamburger = document.querySelector(".hamburger");
hamburger.addEventListener("click", function() {

  hamburger.classList.toggle("is-active");

});
<link href="https://cdnjs.cloudflare.com/ajax/libs/hamburgers/0.9.3/hamburgers.css" rel="stylesheet"/>
<!-- Full Screen Navigation -->
  <div id="primaryNav">	
    <nav>
      <!-- Spinning Hamburger Button -->	
      <button class="hamburger hamburger--spin" type="button"   aria-label="Menu" aria-controls="navigation" aria-expanded="false" onclick="openNav()">
        <span class="hamburger-box">
          <span class="hamburger-inner"></span>
        </span>
      </button>

      <div id="popUpNav" class="overlay" onclick="closeNav()">

        <div class="overlay-content">
          <a href="#problemSolution" data-scroll onclick="closeNav()">Link 1</a>
          <a href="#" data-scroll onclick="closeNav()">Link 2</a>
          <a href="#" data-scroll onclick="closeNav()">Link 3</a>
          <a href="#" data-scroll onclick="closeNav()">Link 4</a>
        </div>										
      </div>
    </nav>
  </div><!--  End Primary Nav -->

【问题讨论】:

    标签: javascript css-animations hamburger-menu


    【解决方案1】:

    我做了什么:

    每当点击汉堡包时,我们都会检查它是否已经有is-active 类。如果是,则表示菜单当前处于活动状态,在这种情况下我们应该调用closeNav。如果它没有is-active 类,那么这意味着我们应该调用openNav

    closeNavopenNav 将:

    • 在汉堡包中添加/删除类 is-active
    • 添加/删除菜单样式。

    PS:

    • 由于您没有提供完整代码,因此我们无法真正查看当前菜单是0% height 还是100% height。所以我把它改成了display block/none 只是为了告诉你它有效。
    • 我从menu 中删除了onclick 属性,因为您已经有一个事件监听器。
    • 确保您没有包含我在示例中提供的link

    function openNav() {
      hamburger.classList.add("is-active");
      document.getElementById("popUpNav").style.display = "block";
    }
    
    function closeNav() {
      hamburger.classList.remove("is-active");
      document.getElementById("popUpNav").style.display = "none";
    }
    
    // Hamburger Menu Spin
    var hamburger = document.querySelector(".hamburger");
    
    hamburger.addEventListener('click', () => hamburger.classList.contains('is-active') ? closeNav() : openNav());
    
    closeNav();
    <link href="https://cdnjs.cloudflare.com/ajax/libs/hamburgers/0.9.3/hamburgers.css" rel="stylesheet"/>
    <!-- Full Screen Navigation -->
    <div id="primaryNav">
      <nav>
        <!-- Spinning Hamburger Button -->
        <button class="hamburger hamburger--spin" type="button" aria-label="Menu" aria-controls="navigation"
                aria-expanded="false">
            <span class="hamburger-box">
              <span class="hamburger-inner"></span>
            </span>
        </button>
    
        <div id="popUpNav" class="overlay" onclick="closeNav()">
    
          <div class="overlay-content">
            <a href="#problemSolution" data-scroll onclick="closeNav()">Link 1</a>
            <a href="#" data-scroll onclick="closeNav()">Link 2</a>
            <a href="#" data-scroll onclick="closeNav()">Link 3</a>
            <a href="#" data-scroll onclick="closeNav()">Link 4</a>
          </div>
        </div>
      </nav>
    </div><!--  End Primary Nav -->

    【讨论】:

    • 工作就像一个魅力!事实上,我的 CSS 中有几个相互冲突的元素需要清理。我肯定把事情复杂化了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多