【问题标题】:How do I make Bootstrap navbar change active state?如何使 Bootstrap 导航栏更改活动状态?
【发布时间】:2018-09-06 21:39:03
【问题描述】:

我是 HTML 和 JavaScript 的新手,现在我面临一个问题,我想你们中的许多人都在处理自己的问题。

我有一个导航栏,默认情况下,当我单击不同的页面引用时,它不会更改活动状态。

“主页”导航项默认处于活动状态,我想在单击其他导航项时更改活动状态。但我不知道该怎么做?据我所知,这不是太多的代码行,但我很想在这里得到一些帮助。

这是我的代码:

<head>
    <meta charset="UTF-8">
    <title>MaU Movie database</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://bootswatch.com/4/cyborg/bootstrap.min.css">
    <link rel="stylesheet" href="style.css">
    <link rel="icon" href="mumdblogo.png">
</head>

<body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <a class="navbar-brand" href="index.html" id="movielogo"><img src="moviefylogo.png"></a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02"
            aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarColor02">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <a class="nav-link" href="index.html">Home
                        <span class="sr-only">(current)</span>
                    </a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="library.html">Library</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="uploads.html">Uploads</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="about.html">About</a>
                </li>
            </ul>
        </div>
    </nav>

    <div class="container">
        <div class="jumbotron">
            <h3 class="text-center">Search Movie!</h3>
            <form id="searchForm">
                <input type="text" class="form-control" id="searchText" placeholder="Search for any movie...">
            </form>
        </div>
    </div>

    <div class="container">
        <div id="movies" class="row">
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
    <script src="main.js"></script>

</body>
</html>

【问题讨论】:

标签: javascript html navbar


【解决方案1】:

您可以在代码结束时执行此操作。正下方&lt;script src="main.js"&gt;&lt;/script&gt;

<script>
$(document).ready(function() {
    $( ".mr-auto .nav-item" ).bind( "click", function(event) {
        event.preventDefault();
        var clickedItem = $( this );
        $( ".mr-auto .nav-item" ).each( function() {
            $( this ).removeClass( "active" );
        });
        clickedItem.addClass( "active" );
    });
});
</script>

他们而不是链接(event.preventDefault()),例如。 about.html 或 uploads.html 这段代码更改点击项目的活动类。


编辑 1:

对于静态页面(或通过 php 提供服务),您不需要任何额外的 js 代码,但是您应该将 nav 调整为如下示例所示(查看“活动”类在哪里,sr-only span current 是可选,但很好地放在示例中)。

index.html(您的基本代码)

<ul class="navbar-nav mr-auto">
    <li class="nav-item active">
        <a class="nav-link" href="index.html">Home<span class="sr-only">(current)</span></a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="library.html">Library</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="uploads.html">Uploads</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="about.html">About</a>
    </li>
</ul>

library.html

<ul class="navbar-nav mr-auto">
    <li class="nav-item">
        <a class="nav-link" href="index.html">Home</a>
    </li>
    <li class="nav-item active">
        <a class="nav-link" href="library.html">Library<span class="sr-only">(current)</span></a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="uploads.html">Uploads</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="about.html">About</a>
    </li>
</ul>

uploads.html

<ul class="navbar-nav mr-auto">
    <li class="nav-item">
        <a class="nav-link" href="index.html">Home</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="library.html">Library</a>
    </li>
    <li class="nav-item active">
        <a class="nav-link" href="uploads.html">Uploads<span class="sr-only">(current)</span></a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="about.html">About</a>
    </li>
</ul>

about.html

<ul class="navbar-nav mr-auto">
    <li class="nav-item">
        <a class="nav-link" href="index.html">Home</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="library.html">Library</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="uploads.html">Uploads</a>
    </li>
    <li class="nav-item active">
        <a class="nav-link" href="about.html">About<span class="sr-only">(current)</span></a>
    </li>
</ul>

【讨论】:

  • 这确实有效,但是当我单击导航项时,每个导航项的 HTML 不显示?!是什么原因造成的?
  • 我将 event.preventDefault() 用于动态演示。在正确位置的静态 .html 页面中更改位置 active 类。例如。 library.html 中的导航应该如下所示:&lt;li class="nav-item"&gt;&lt;a class="nav-link" href="index.html"&gt;Home&lt;/a&gt;&lt;/li&gt;&lt;li class="nav-item active"&gt;&lt;a class="nav-link" href="library.html"&gt;Library&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
  • 你有 4 个文件 index,html, librrary.html, uploads.html, about.html 吗?或者你如何为 about.html url 提供内容?
  • 仔细查看我编辑的答案。检查每个文件中的导航(最终删除之前的脚本代码),您不需要另外 JS 只为每个文件在 NAV 中正确的 html。
  • 非常感谢,现在我意识到自己的错误,我感到很愚蠢。如果感觉很明显,绝对不需要 JS och JQ :)
【解决方案2】:

我认为最简单的解决方案是检查窗口的location对象中的pathname,并相应地更改nabber状态。

这样的事情会起作用:

var pathname = window.location.pathname,
pages = ['home', 'library', 'uploads','about'];

$('.nav-item').each(function(i) {
 if (pathname.includes(pages[i])) this.addClass('active');
 else if (this.className.includes('active')) this.removeClass('active');
});

【讨论】:

  • 我在试用时得到了这个:未捕获的 TypeError: this.removeClass is not a function
  • 这意味着this 不是一个JQuery 元素。尝试替换 this.removeClass('active') with console.log(this)` 并检查它在控制台中打印的内容。也试试加个$(document).ready(function() { [..code in the post..] }),可能是js运行时没有加载的窗口。
  • 这对 swup.js 非常有用,swup.js 不会在页面更改时更新标题样式,使用您的代码手动更新它 sn-p 效果很好!谢谢!
  • 没问题@分号:)
  • 很棒的答案!我对“this”也有一些问题,在某些地方我将“this”更改为“$(this)”,这为我解决了这个问题。我不得不使用浏览器控制台并使用 console.log() 测试一堆运行,直到我能够让它适用于我的用例,但最终它工作得很好!伟大的代码库工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多