Bootstrap CSS主动导航

use*_*779 44 html css jquery twitter-bootstrap

在Bootstrap网站上,subnav与各部分匹配并更改背景颜色或滚动到该部分.我想创建自己的菜单,没有所有背景颜色和所有内容,但是,我将CSS更改为类似但是当我向下滚动或单击菜单项时,活动类不会切换.不知道我做错了什么.

HTML:

<ul class="menu">
    <li class="active"><a href="#">Home</a></li>
    <li><a href="#about">About Us</a></li>
    <li><a href="#contact">Contact</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

CSS:

.menu {list-style:none;}
.menu > li {float: left;}
.menu > li > a {color:#555;float: none;padding: 10px 16px 11px;display: block;}
.menu > li > a:hover {color: #F95700;}
.menu .active > a, .menu .active > a:hover {color:#F95700;}
Run Code Online (Sandbox Code Playgroud)

我查了一下文件; jQuery,bootstrap.js和bootstrap.css都正确链接.我是否必须添加一些额外的jQuery,或者我是否缺少一些CSS以使主动切换像他们网站上的subnav菜单一样?

小智 49

这就是我最终的结果,因为你必须清除其他人.

$('.navbar li').click(function(e) {
    $('.navbar li.active').removeClass('active');
    var $this = $(this);
    if (!$this.hasClass('active')) {
        $this.addClass('active');
    }
    e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

  • @David我的问题是这个.我看到单词`active`在点击后应用于`li`但链接没有改变.但是,如果我删除`e.preventDefault();`当我点击它时,将`active`应用于`li`但是在一秒钟内``active`类移动到默认值,在这种情况下,`<li class = "活性">主页</ LI>.任何的想法?谢谢. (3认同)

Nic*_*nek 35

要切换类,您需要执行一些JavaScript.

在jQuery中:

$('.menu li a').click(function(e) {
  var $this = $(this);
  if (!$this.hasClass('active')) {
    $this.addClass('active');
  }
  e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

在JavaScript中:

var menu = document.querySelector('.menu');
var anchors = menu.getElementsByTagName('a');

for (var i = 0; i < anchors.length; i += 1) {
  anchors[i].addEventListener('click', function() { clickHandler(anchors[i]) }, false);
}

function clickHandler(anchor) {
  var hasClass = anchor.getAttribute('class');
  if (hasClass !== 'active') {
    anchor.setAttribute('class', 'active');
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


hbi*_*uni 20

这是我处理twitter bootstrap导航列表的代码:

$(document).ready(function () {
        $('ul.nav > li').click(function (e) {
            e.preventDefault();
            $('ul.nav > li').removeClass('active');
            $(this).addClass('active');                
        });            
    });
Run Code Online (Sandbox Code Playgroud)

  • e.preventDefault()将阻止链接打开. (10认同)

kon*_*mer 17

我使用2个1-liners,具体取决于我的导航结构

只需确保您的所有链接都没有活动类即可启动.

实际链接

如果导航链接位于单独的HTML文件中(如express.js中包含菜单的布局模板),则可以执行以下操作:

$('ul.nav > li > a[href="' + document.location.pathname + '"]').parent().addClass('active');
Run Code Online (Sandbox Code Playgroud)

哈希链接

如果它们是哈希值,请执行以下操作:

$('ul.nav > li > a[href="' + document.location.hash + '"]').click(function(){  $('ul.nav > li').removeClass('active'); $(this).parent().addClass('active'); });
Run Code Online (Sandbox Code Playgroud)

如果您不想滚动哈希点击,则返回false:

 $('ul.nav > li > a[href="' + document.location.hash + '"]').click(function(){  $('ul.nav > li').removeClass('active'); $(this).parent().addClass('active'); return false; });
Run Code Online (Sandbox Code Playgroud)


Mau*_*ord 8

查看其他一些答案,如果您希望在单击侧边菜单时向下滚动到该部分,则您不希望这样做preventDefault.

此外,您只需要删除当前活动类并添加一个新类,而不是搜索所有li.当您选择的列表项已经激活时,您还希望代码不执行任何操作 - 不必无需添加和删除相同的活动类.最后,你应该把你的事件监听器放在一个元素而不是li上,因为它更容易在iPhone和平板电脑上触发点击事件等.也可以使用,.delegate所以你不必等待DOM ready事件.所以最后我会做这样的事情(我假设你已经预装了jQuery):

$('body').delegate('.menu li a', 'click', function(){
    var $thisLi = $(this).parents('li:first');
    var $ul = $thisLi.parents('ul:first');
    if (!$thisLi.hasClass('active')){
        $ul.find('li.active').removeClass('active');
        $thisLi.addClass('active');
    }
});
Run Code Online (Sandbox Code Playgroud)


Ali*_*odi 5

我建议这段代码:

 <script>
      var curentFile = window.location.pathname.split("/").pop();
      if (curentFile == "") curentFile = "Default.aspx";
      $('ul.nav > li > a[href="' + curentFile + '"]').parent().addClass('active');
 </script>
Run Code Online (Sandbox Code Playgroud)

它的工作就像一个魅力.