【问题标题】:Closing mobile nav toggle on click单击时关闭移动导航切换
【发布时间】:2019-12-20 01:49:43
【问题描述】:

我有一个带有汉堡包切换的移动导航菜单,可以在点击时成功打开菜单。我还在单击时向切换按钮添加动画。我正在使用背景来关闭导航菜单,但我也希望能够在单击切换时关闭菜单,并且如果单击背景,则在菜单关闭时切换动画。以下是我目前的代码,任何帮助将不胜感激。

var backdrop = document.querySelector(".backdrop");
var toggleButton = document.querySelector(".toggle-container");
var mobileNav = document.querySelector(".mobile-nav");

backdrop.addEventListener("click", function() {
  mobileNav.classList.remove("open");
  closeMenu();
});

function closeMenu() {

  if (toggleButton) {
    mobileNav.classList.remove("open");
  }
  backdrop.classList.remove("open");
  toggleButton.classList.remove("active");

}

toggleButton.addEventListener("click", function() {
  mobileNav.classList.add("open");
  toggleButton.classList.add("active");
  backdrop.classList.add("open");
});

function toggleNav(x) {
  x.classList.toggle("change");
}
.backdrop {
  position: fixed;
  display: none;
  top: 197px;
  left: 0;
  z-index: 100;
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.5);
}

.toggle-container {
  display: inline-block;
  cursor: pointer;
  margin: 10px;
  z-index: 105;
}

.bar1,
.bar2,
.bar3 {
  width: 2rem;
  height: 5px;
  background-color: black;
  margin: 6px 0;
  transition: 0.4s;
}

.change .bar1 {
  -webkit-transform: rotate(-45deg) translate(-9px, 6px);
  transform: rotate(-45deg) translate(-9px, 6px);
}

.change .bar2 {
  opacity: 0;
}

.change .bar3 {
  -webkit-transform: rotate(45deg) translate(-8px, -8px);
  transform: rotate(45deg) translate(-8px, -8px);
}

.mobile-nav {
  display: none;
  position: fixed;
  z-index: 101;
  top: 60px;
  left: 0;
  background: white;
  width: 30%;
  height: 100vh;
}

.mobile-nav__items {
  width: 90%;
  height: 100%;
  list-style: none;
  margin: 10% auto;
  padding: 0;
  font-family: 'Quantico', sans-serif;
}

.mobile-nav__item {
  margin: 1rem 0;
}

.mobile-nav__item a {
  font-size: 1.5rem;
  text-decoration: none !important;
  color: #15396c;
}

@media (min-width: 60rem) {
  .toggle-container {
    display: none;
  }
}

.open {
  display: block !important;
}
<div class="backdrop"></div>

<div class="toggle-container" onclick="toggleNav(this)">
  <div class="bar1">
  </div>
  <div class="bar2">
  </div>
  <div class="bar3">
  </div>
</div>
<nav class="mobile-nav">
  <ul class="mobile-nav__items">
    <li class="mobile-nav__item">
      <a href="#">Home
                        </a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 1
                        </a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 2
                        </a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 3
                        </a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 4
                        </a>
    </li>
  </ul>
</nav>

【问题讨论】:

  • 欢迎迈克!我试图运行您的代码,但它似乎没有正常工作。我已经更新了问题以将其变成一个工作示例,但似乎我们缺少一些样式/元素/等。您能否编辑问题以使其正常工作,以便我们提供帮助?
  • 谢谢布雷特!我添加了一些缺少的 css。
  • 背景元素在哪里?
  • 您可以创建一个 sn-p 来添加必要的 HTML、CSS 和 JS 以便我们可以看到结果 - meta.stackoverflow.com/questions/358992/…
  • 对不起,我以为我忘记了什么,我在 HTML 中添加了背景元素

标签: javascript css css-transforms


【解决方案1】:

我已经清理了 JS 并进行了一些更改以使其正常工作。即,我将内联 onClick 移动到事件侦听器,并合并了一些其他函数以使其更易于理解(但如果需要,请随意将它们分开)。

主要更改是在打开时将activechange 类添加到toggleButton,然后在单击背景时删除activechange 类。

var backdrop = document.querySelector(".backdrop");
var toggleButton = document.querySelector(".toggle-container");
var mobileNav = document.querySelector(".mobile-nav");

backdrop.addEventListener("click", function() {
  mobileNav.classList.remove("open");
  backdrop.classList.remove("open");
  toggleButton.classList.remove("active", "change");
});

toggleButton.addEventListener("click", function() {
  mobileNav.classList.add("open");
  toggleButton.classList.add("active", "change");
  backdrop.classList.add("open");
});
.backdrop {
  position: fixed;
  display: none;
  left: 0;
  z-index: 100;
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.5);
}

.toggle-container {
  display: inline-block;
  cursor: pointer;
  margin: 10px;
  z-index: 105;
}

.bar1,
.bar2,
.bar3 {
  width: 2rem;
  height: 5px;
  background-color: black;
  margin: 6px 0;
  transition: 0.4s;
}

.change .bar1 {
  -webkit-transform: rotate(-45deg) translate(-9px, 6px);
  transform: rotate(-45deg) translate(-9px, 6px);
}

.change .bar2 {
  opacity: 0;
}

.change .bar3 {
  -webkit-transform: rotate(45deg) translate(-8px, -8px);
  transform: rotate(45deg) translate(-8px, -8px);
}

.mobile-nav {
  display: none;
  position: fixed;
  z-index: 101;
  top: 60px;
  left: 0;
  background: white;
  width: 30%;
  height: 100vh;
}

.mobile-nav__items {
  width: 90%;
  height: 100%;
  list-style: none;
  margin: 10% auto;
  padding: 0;
  font-family: 'Quantico', sans-serif;
}

.mobile-nav__item {
  margin: 1rem 0;
}

.mobile-nav__item a {
  font-size: 1.5rem;
  text-decoration: none !important;
  color: #15396c;
}

@media (min-width: 60rem) {
  .toggle-container {
    display: none;
  }
}

.open {
  display: block !important;
}
<div class="backdrop"></div>

<div class="toggle-container">
  <div class="bar1">
  </div>
  <div class="bar2">
  </div>
  <div class="bar3">
  </div>
</div>

<nav class="mobile-nav">
  <ul class="mobile-nav__items">
    <li class="mobile-nav__item">
      <a href="#">Home</a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 1</a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 2</a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 3</a>
    </li>
    <li class="mobile-nav__item">
      <a href="#">Link 4</a>
    </li>
  </ul>
</nav>

【讨论】:

  • 非常感谢您的帮助!很抱歉css的格式问题
  • 出于好奇,如果我想移除背景,我怎么能只在打开后点击切换来关闭菜单?
  • 您需要检查菜单是否打开,如果是,则删除所有打开/活动的类。也许有一个变量来保持打开/关闭状态,并使用它来添加或删除类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2015-12-30
相关资源
最近更新 更多