【问题标题】:Bootstrap 4 navbar - collapse on nav-link click in vanilla JSBootstrap 4 导航栏 - 在香草 JS 中单击导航链接时折叠
【发布时间】:2020-07-18 00:44:00
【问题描述】:

我正在尝试让 Bootstrap 4 导航栏只使用 vanilla js 而不是任何 jQuery。到目前为止,我已经能够让切换器触发导航在移动设备上折叠和关闭。我现在想弄清楚的是如何在单击“导航链接”时使导航栏折叠

这是我的导航 HTML:

  <nav class="navbar navbar-expand-lg navbar-light bg-light shadow-lg p-3 mb-5 bg-white fixed-top">
<div class="container">
  <a class="navbar-brand" href="#">Start Bootstrap</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive"
    aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarResponsive">
    <ul class="navbar-nav ml-auto">
      <li class="nav-item" >
        <a class="nav-link" href="#about">About Us</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Browse Menu</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#visit">Contact</a>
      </li>
    </ul>
  </div>
</div>

还有我的 JS 用于崩溃

(function () {
    "use strict";
    document.querySelectorAll("button.navbar-toggler")[0].addEventListener("click", function (event) {
      var target = this.getAttribute("data-target");
      var subbar = document.querySelectorAll(target)[0];
      subbar.className = (subbar.className + " show").replace(/ show show/, "");
    });
  })();

但是我该如何做到这一点,当用户点击 &lt;a class="nav-link" href="#"&gt;&lt;/a&gt; 时它也会折叠导航栏?

谢谢!

【问题讨论】:

    标签: javascript html twitter-bootstrap


    【解决方案1】:

    由于您使用的是自定义代码,因此没有必要在 html 中包含目标 (data-target="#navbarResponsive")。所以我们可以重写click 处理程序来处理两个元素,切换器和链接。要切换一个类,只需在classList 上使用toggle 方法。

    document.addEventListener("click", function(event) {
      if (event.target.classList.contains("navbar-toggler-icon")) {
        document.getElementById("navbarResponsive").classList.toggle("show");
      } else if (event.target.classList.contains("nav-link")) {
        document.getElementById("navbarResponsive").classList.remove("show");
      }
    });
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    
    <nav class="navbar navbar-expand-lg navbar-light bg-light shadow-lg p-3 mb-5 bg-white fixed-top">
      <div class="container">
        <a class="navbar-brand" href="#">Start Bootstrap</a>
        <button class="navbar-toggler" type="button" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarResponsive">
          <ul class="navbar-nav ml-auto">
            <li class="nav-item"><a class="nav-link" href="#about">About Us</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Browse Menu</a> </li>
            <li class="nav-item"> <a class="nav-link" href="#visit">Contact</a> </li>
          </ul>
        </div>
      </div>
    </nav>

    【讨论】:

    • 谢谢你的回答,这个截图对我不起作用,但我仍然很感激!
    • 现已修复。应该是 navbar-toggler-icon 而不是 navbar-toggler
    • 快速跟进问题:如果有人第二次点击切换器,如何让导航再次折叠?
    【解决方案2】:

    您的问题的一个可能解决方案是找到所有 .nav-links 并添加一个点击侦听器以从类列表中删除 show 类。

    另外,您可以使用Element.classList.toggle() 简化您的代码,例如:

    (function() {
      let subbar = document.getElementById("navbarResponsive");
      document
        .querySelectorAll("button.navbar-toggler")[0]
        .addEventListener("click", function(event) {
          subbar.classList.toggle("show");
        });
      for (let navItem of document.querySelectorAll("a.nav-link")) {
        navItem.addEventListener("click", function(event) {
          subbar.classList.remove("show");
        });
      }
    })();
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    
    <nav class="navbar navbar-expand-lg navbar-light bg-light shadow-lg p-3 mb-5 bg-white fixed-top">
      <div class="container">
        <a class="navbar-brand" href="#">Start Bootstrap</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
    				<span class="navbar-toggler-icon"></span>
    			</button>
        <div class="collapse navbar-collapse" id="navbarResponsive">
          <ul class="navbar-nav ml-auto">
            <li class="nav-item">
              <a class="nav-link" href="#about">About Us</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Browse Menu</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#visit">Contact</a>
            </li>
          </ul>
        </div>
      </div>
    </nav>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2020-04-12
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多