【问题标题】:close dropdown menu after click on link点击链接后关闭下拉菜单
【发布时间】:2021-01-13 09:25:15
【问题描述】:

我有一个几乎完整的下拉菜单,其中只有 1 个我无法弄清楚的错误/问题。我的导航链接到主页上的不同区域。因此,在主页上,用户可以单击导航链接,该链接会立即将他们带到页面上所需的位置。

我的问题出现在用户点击导航链接时,他们被带到该位置,但下拉菜单不会关闭。

除此之外,我还想为我的菜单从上到下设置动画,这样看起来更优雅。 我尝试了很多东西,但我似乎无法让它工作.. 希望你能帮帮我!

.toggle, [id^=drop] {
     display: none;
}
 nav {
     margin:0;
     padding: 0;
     float: center;
     position: absolute;
     z-index: 400;
     border: solid 0px;
}
 nav ul {
     float: center;
     position: relative;
     width: 100vw;
}
 .menu{
     background: rgb(233, 233, 233);
     background: linear-gradient(90deg, rgba(233, 233, 233,0.9) 40%, rgb(255, 101, 207) 99%);
     background: -webkit-linear-gradient(90deg, rgba(233, 233, 233,0.9) 40%, rgb(255, 101, 207) 99%);
}
 nav ul li {
     text-align: center;
     position: relative;
     margin: 0px;
     display:left;
}
 nav a {
     font-family: 'OggR';
     color: black;
     font-size:14px;
     text-decoration:none;
     position: relative;
     text-align: center;
     transition: 0.3s;
}
 .toggle + a, .menu {
     display: none;
}
 .toggle {
     position: fixed;
     display: block;
     padding:4px 20px;
     color: rgb(233, 233, 233);
     font-size:20px;
     text-decoration:none;
     width: 20px;
     height: 30px;
     z-index: 9999999999999999999;
}
<nav>
  <label for="drop" class="toggle">&#x2630;</label>
  <input type="checkbox" id="drop" />
      <ul class="menu">
          <li>
          <li><a href="#abstract">ABSTRACT</a></li>
          <li><a href="#introduction">INTRODUCTION</a></li>
          <li><a href="#chapterI">I. <br>THE MEANING OF NOSTALGIA IN CULTURAL HISTORY</a></li>
          <li><a href="#chapterII">II. <br>CONTEMPORARY NOSTALGIA</a></li>
          <li><a href="#chapterIII">III. <br>THE TWO FACES OF NOSTALGIA</a></li>
          <li><a href="#conclusion">CONCLUSION</a></li>
          <li><a href="#bibliography">BIBLIOGRAPHY</a></li>
      </ul>
</nav>

【问题讨论】:

  • 你有js文件吗?如果是请分享,如果不是让我知道我可以发布 js 代码来告诉你如何实现它
  • 打开/关闭菜单的代码在哪里?因为你的 CSS 没有
  • 不好意思打错了,我确实有js:
  • function myFunction() { document.getElementById("myDropdown").classList.toggle("show"); } window.onclick = function(event) { if (!event.target.matches('.dropbtn')) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i &lt; dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains('show')) { openDropdown.classList.remove('show'); } } } }
  • @sachava 不使用 javascript,只需 1-2 行 CSS 即可。我已经添加了答案,请查看。

标签: javascript html css


【解决方案1】:

不需要 javascript,只需将其添加到您的 css 中:

#drop:checked + .menu {
  display: block;
}

Codepen:https://codepen.io/manaskhandelwal1/pen/poExqJv

【讨论】:

  • 我同意,但是请注意,在这种情况下,您不要将切换更改为 X。我更喜欢使用 js,因为它会打开许多​​选项。但他是对的,你可以用一行来解决。
  • @Elnatanvazana,在这种情况下,不需要在 HTML 中使用input checkbox 来触发它。我们可以用任何其他元素来做到这一点。
  • @Elnatanvazana @ManasKhandelwal 谢谢你们!但是问题仍然存在,单击其中一个链接后菜单不会关闭,并且它不会从上到下进行动画处理。
  • 让我给你一个更好的方法。
  • @sachava 你想要这样的东西吗:stackoverflow-sachava.netlify.app
【解决方案2】:

html。我添加了 ID:

<nav>
      <label for="drop" class="toggle" id="toggle">&#x2630;</label>
      <input type="checkbox" id="drop" />
          <ul class="menu" id="menu">
              <li>
              <li><a class="navLink" href="#abstract">ABSTRACT</a></li>
              <li><a class="navLink" href="#introduction">INTRODUCTION</a></li>
              <li><a class="navLink" href="#chapterI">I. <br>THE MEANING OF NOSTALGIA IN CULTURAL HISTORY</a></li>
              <li><a class="navLink" href="#chapterII">II. <br>CONTEMPORARY NOSTALGIA</a></li>
              <li><a class="navLink" href="#chapterIII">III. <br>THE TWO FACES OF NOSTALGIA</a></li>
              <li><a class="navLink" href="#conclusion">CONCLUSION</a></li>
              <li><a class="navLink" href="#bibliography">BIBLIOGRAPHY</a></li>
          </ul>
    </nav>

css:我给了绝对菜单位置,我添加了 top:-100% 使其“消失”,我删除了导航的位置,我添加了类 .menu.open 来处理打开,我添加了到 .menu 的过渡用于动画。

.toggle,
[id^=drop] {
    display: none;
}

nav {
    margin:0;
    padding: 0;
  float: center;
  z-index: 400;
  border: solid 0px;
}

nav ul {
float: center;
    position: relative;
  width: 100vw;
    }
.menu{
  position:absolute;
  top:-100%;
  background: rgb(233, 233, 233);
  background: linear-gradient(90deg, rgba(233, 233, 233,0.9) 40%, rgb(255, 101, 207) 99%);
  background: -webkit-linear-gradient(90deg, rgba(233, 233, 233,0.9) 40%, rgb(255, 101, 207) 99%);
  transition: 0.3s ease-in;
}
.menu.open{
  top:30px;
}
nav ul li {
  text-align: center;
  position: relative;
    margin: 0px;
    display:left;
    }

nav a {
  font-family: 'OggR';
    color: black;
    font-size:14px;
    text-decoration:none;
  position: relative;
  text-align: center;
  transition: 0.3s;
}

    

    .toggle {
      cursor:pointer;
    position: fixed;
        display: block;
        padding:4px 20px;
        color:black;
        font-size:20px;
        text-decoration:none;
    width: 20px;
    height: 30px;
    z-index: 9999999999999999999;
    }

这是js:

//adding the click event to the toggle
let menu = document.getElementById('menu')
let toggle = document.getElementById('toggle')
let links = document.getElementsByClassName('link')

for(let i = 0; i < links.length; i++){
  links[i].addEventListener('click', () => {
    menu.classList.remove('open')
    toggle.innerHTML = '&#x2630'
  })
}


document.getElementById('toggle').addEventListener('click', () => {
  
  if(menu.classList.contains('open')){
    menu.classList.remove('open')
    toggle.innerHTML = '&#x2630'
  } else {
    menu.classList.add('open')
    toggle.innerHTML = 'X'
  }
})


编辑: 我在其中添加了类,然后循环遍历它们并在单击每个链接时提供事件,因此当您单击它时将关闭导航。

现在检查代码笔 https://codepen.io/Elnatan/pen/PoGyXwx 你可以在这里看到它


为了能够在您的页面中实现它:

  1. 添加到每个&lt;a class="navLink"&gt;(检查上面的HTML)
  2. 将 id 添加到 manu 元素和切换元素 &lt;ul class="menu" id="menu"&gt;&lt;label for="drop" class="toggle" id="toggle"&gt;&amp;#x2630;&lt;/label&gt;
  3. 添加到您的 CSS .menu.open {display:block}
  4. 创建 navHandler.js 文件并将其添加到您的 HTML ``` 5.复制此代码并将其粘贴到您的 navHandler.js 文件中:
let menu = document.getElementById('menu')
let toggle = document.getElementById('toggle')
let links = document.getElementsByClassName('navLink')

for(let i = 0; i < links.length; i++){
  links[i].addEventListener('click', () => {
    menu.classList.remove('open')
  })
}

如果您按照正确的步骤操作,它应该可以工作

【讨论】:

  • 只要 1-2 行代码,就不需要添加这么多行代码。
  • 感谢您的回答!但不幸的是,它在我的代码中仍然不起作用。当我单击其中一个链接时,菜单不会关闭
  • @Elnatanvazana 在您的示例中效果很好!我认为我现在的问题是它不适用于我的代码中的其他部分......但我不知道它可能是什么。但是我想把我的完整代码发给你有点太多了哈哈。这是我的 GitHub 页面的链接kabk.github.io/go-theses-21-sacha-van-alfen/LandingPage.html
  • @sachava 我编辑了答案检查我答案的最后一部分
  • @Elnatanvazana 我遵循了所有步骤,但它仍然无法正常工作。我不知道问题出在哪里。
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多