【问题标题】:Add active class to navbar element when clicked单击时将活动类添加到导航栏元素
【发布时间】:2022-12-14 07:58:20
【问题描述】:

我是用导航栏创建的,我没有做过太多的网络开发。

<nav class="navbar navbar-custom navbar-light navbar-expand-md justify-content-center">
  <button class="navbar-toggler ml-1" type="button" data-toggle="collapse" data-target="#collapsingNavbar2"> <span class="navbar-toggler-icon"></span> </button>
  <div class="navbar-collapse collapse justify-content-between align-items-center w-100" id="collapsingNavbar2">
    <ul class="navbar-nav mx-auto text-center">
      <li class="nav-item"><a class="nav-link" href="index.html"><strong style="text-transform:uppercase">home</strong></a></li>
      <li class="nav-item"><a class="nav-link" href="about.html"><strong style="text-transform:uppercase">about</strong></a></li>
      <li class="nav-item"><a class="nav-link" href="flights.html"><strong>FLIGHTS</strong></a></li>
      <li class="nav-item"><a class="nav-link" href="hotels.html"><strong>HOTELS</strong></a></li>
      <li class="nav-item"><a class="nav-link" href="holidays.html"><strong>HOLIDAYS</strong></a></li>
      <li class="nav-item "><a class="nav-link" href="property.html"><strong>PROPERTY</strong></a></li>
      <li class="nav-item active"><a class="nav-link" href="car_hire.html"><strong>CAR HIRE</strong></a></li>
    </ul>
  </div>
</nav>

此导航栏链接到所有其他页面的顶部,以减少代码重复。有人可以帮我写代码吗,所以当菜单项单击“活动”类时,会将其添加到 li 元素中。然后这会触发 css。

CSS:

.nav-link.active {
  color: white;
}

谢谢

【问题讨论】:

  • 您可以使用 JavaScript/jQuery 向该元素添加类
  • 还有一个名为“active”的伪类(参见::active选择器)。虽然伪类名称以 : 开头,而不是 .,但您可能需要考虑将其命名为其他名称以防止混淆。

标签: javascript html css html-lists navbar


【解决方案1】:

这是纯 JavaScript 中满足您要求的确切完整代码。希望它会有所帮助

const links = document.querySelectorAll('.nav-link');
    
if (links.length) {
  links.forEach((link) => {
    link.addEventListener('click', (e) => {
      links.forEach((link) => {
          link.classList.remove('active');
      });
      e.preventDefault();
      link.classList.add('active');
    });
  });
}
.nav-link.active {
  color: white;
}
<nav class="navbar navbar-custom navbar-light navbar-expand-md justify-content-center">
  <button
      class="navbar-toggler ml-1"
      type="button"
      data-toggle="collapse"
      data-target="#collapsingNavbar2"
  >
    <span class="navbar-toggler-icon"></span>
  </button>
  <div
    class="navbar-collapse collapse justify-content-between align-items-center w-100"
    id="collapsingNavbar2"
  >
    <ul class="navbar-nav mx-auto text-center">
      <li class="nav-item">
        <a class="nav-link" href="index.html">
          <strong style="text-transform: uppercase">home</strong>
        </a>
      </li>
      <li class="nav-item">
          <a class="nav-link" href="about.html">
            <strong style="text-transform: uppercase">about</strong>
          </a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="flights.html">
          <strong>FLIGHTS</strong>
        </a>
      </li>
      <li class="nav-item">
          <a class="nav-link" href="hotels.html">
            <strong>HOTELS</strong>
          </a>
      </li>
      <li class="nav-item">
          <a class="nav-link" href="holidays.html">
            <strong>HOLIDAYS</strong>
          </a>
      </li>
      <li class="nav-item">
          <a class="nav-link" href="property.html">
            <strong>PROPERTY</strong>
          </a>
      </li>
      <li class="nav-item active">
          <a class="nav-link" href="car_hire.html">
            <strong>CAR HIRE</strong>
          </a>
      </li>
    </ul>
  </div>
</nav>

【讨论】:

  • 这实际上不起作用...请解释您添加的内容,以便 OP 可以更好地理解问题所在。
  • @Lissy93 它正在工作。没有问题。他只是添加了 JS 代码来添加/删除类
  • 感谢您的回复,此解决方案显示动画但页面未更改。
  • 如果您使用.forEach(),您实际上不需要检查links.length。这隐含在.forEach() 的工作方式中
  • @MatrixMC 你不能让 javascript 在 html 页面之间改变东西。如果你想改变“页面”,你必须在 javascript 中实现它,这是一个更大的任务 - 除非它已经在你使用的任何框架中实现,在这种情况下你可以删除 e.preventDefault();
【解决方案2】:

使用classListtoggle

document.querySelectorAll(".nav-item").forEach((ele) =>
  ele.addEventListener("click", function (event) {
    event.preventDefault();
    document
      .querySelectorAll(".nav-item")
      .forEach((ele) => ele.classList.remove("active"));
    this.classList.add("active")
  })
);
.active {
  color: green;
}
    <ul class="navbar-nav mx-auto text-center">
      <li class="nav-item"><a class="nav-link" ><strong style="text-transform:uppercase">home</strong></a></li>
      <li class="nav-item"><a class="nav-link" ><strong style="text-transform:uppercase">about</strong></a></li>
      <li class="nav-item"><a class="nav-link" ><strong>FLIGHTS</strong></a></li>
      <li class="nav-item"><a class="nav-link" ><strong>HOTELS</strong></a></li>
      <li class="nav-item"><a class="nav-link" ><strong>HOLIDAYS</strong></a></li>
      <li class="nav-item "><a class="nav-link" ><strong>PROPERTY</strong></a></li>
      <li class="nav-item active"><a class="nav-link" ><strong>CAR HIRE</strong></a></li>
    </ul>

【讨论】:

  • 不工作。它为所有 <li> 添加了 active 类。我认为用户可能只需要在点击的 <li> 中添加。
  • 感谢您的回复,我似乎无法使用此解决方案..?
  • @MatrixMC,啊,我已经用修复程序更新了 sn-p。谢谢。
【解决方案3】:

您所要做的就是遍历链接,检查当前点击的链接是否与当前页面相同,然后将活动类和 aria-current 设置为该项目。 将此代码添加到您的 javascript

document.querySelectorAll(".nav-link").forEach((link) => {
    if (link.href === window.location.href) {
        link.classList.add("active");
        link.setAttribute("aria-current", "page");
    }
});

【讨论】:

    【解决方案4】:

    在您的 JS 中添加以下代码:

     $(".nav-item").click(function() {  
        $(".nav-item").removeClass("active"); // This will remove active classes from all <li> tags
        $(this).addClass("active"); // This will add active class in clicked <li>   
      });
    

    【讨论】:

    • OP 没有使用 jQuery,为什么要把它引入这么简单的东西?
    • Bootstrap 不久前在version 5 中删除了 jQuery。 jQuery 现在通常被认为已经过时了,因为它的大部分功能都可以用 ES5 原生完成。
    • @Lissy93 明白了。我还没有意识到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多