16

我在这里创建并准确解决了我的问题以进行测试:http: //jsfiddle.net/aVBUy/7/

问题是,当我单击导航栏项目时,我有一个滚动到元素 ID 的脚本。当页面处于正确位置时,我正在使用 scrollspy 突出显示导航元素。但是,滚动间谍仅在到达浏览器/设备顶部时才更改活动状态。因为我的导航栏是固定的,所以我需要将偏移量应用于 scrollspy 以偏移 51px(导航栏高度)。

我已经尝试了一切,但我无法让它工作。请检查我的小提琴,看看你是否能找到我出错的地方,这对我有很大帮助。

这是我最小化的代码...

HTML

<div class="navbar navbar-inverse navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>
            <a class="brand" href="#"><img src="img/logo.gif" alt="" /></a>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    <li><a href="#welcome" data-scroll="#welcome">Welcome</a></li>
                    <li><a href="#about" data-scroll="#about">About</a></li>
                    <li><a href="#route" data-scroll="#route">The Route</a></li>
                    <li><a href="#bike" data-scroll="#bike">The Bike</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>
<div class="container">
    <div id="welcome" class="row-fluid">
        <div class="span12">
            <h3>Welcome</h3>
            ...
        </div>
    </div>
    <hr />
    <div id="about" class="row-fluid">
        <div class="span12">
            <h3>About the ride</h3>
            ...
        </div>
    </div>
    <hr />
    <div id="route" class="row-fluid">
        <div class="span12">
            <h3>The Route</h3>
            ...
        </div>
    </div>
    <hr />
    <div id="bike" class="row-fluid">
        <div class="span12">
            <h3>The Bike</h3>
            ...
        </div>
    </div>
    <hr>
    <footer>
        <p class="muted"><small>© 2013 All rights reserved.</small></p>
    </footer>
</div>

CSS

body {
    padding: 51px 0 0;
}
/* Override Bootstrap Responsive CSS fixed navbar */
 @media (max-width: 979px) {
    .navbar-fixed-top, .navbar-fixed-bottom {
        position: fixed;
        margin-left: 0px;
        margin-right: 0px;
    }
}
body > .container {
    padding: 0 15px;
}

脚本

var offsetHeight = 51;

$('.nav-collapse').scrollspy({
    offset: offsetHeight
});

$('.navbar li a').click(function (event) {
    var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - offsetHeight;
    $('body,html').animate({
        scrollTop: scrollPos
    }, 500, function () {
        $(".btn-navbar").click();
    });
    return false;
});

小提琴

http://jsfiddle.net/aVBUy/7/

4

6 回答 6

23

您需要将偏移量应用于身体。

$('body').scrollspy({
   offset: offsetHeight
});

此外,您需要从下一行中的 offsetHeight 中减去至少一个,否则向上滚动时将不起作用。

var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - (offsetHeight - 1);
于 2013-07-26T15:23:20.060 回答
10

您也可以在不使用 javascript(通过数据属性)的情况下通过声明data-offset="51".data-target

来源:https ://getbootstrap.com/docs/3.3/javascript/#scrollspy-usage

于 2014-03-15T02:22:57.057 回答
4

仅使用 javascript 它就可以像这样简单地工作:

$( document ).ready(function() {
    //Scrollspy offset
    $("body").scrollspy({target: "#scroll-nav", offset:200});
});
于 2015-03-09T09:44:57.010 回答
2

使用您希望监视的 HTML 标记的属性有任何更简单的方法来执行此操作。

<ul class="nav nav-list affix" data-spy="affix" data-offset-top="585" data-offset-  bottom="425" id="prepare-navigation">
  <li class="nav-header">Where?</li>
  <li class="divider"></li>
  <li><a href="#at-the-museum-day-time">When?</a></li>
  <li class="divider"></li>
  <li><a href="#at-the-museum-overnight">Why?</a></li>
</ul>

data-offset-topdata-offset-bottom属性可以与您希望使用的数量结合使用。容易多了!

查看此链接以获得更好的解释:https ://stackoverflow.com/a/18326668/335567

于 2013-11-07T17:04:28.727 回答
1

bootstrap 3 的小代码更正(当非最小化版本的菜单被点击/一些闪烁/时有一个小错误)

$('.navbar li a').click(function (event) {
var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - (offsetHeight - 1);
$('body,html').animate({
    scrollTop: scrollPos
}, 500, function () {
    if ($("div.navbar-collapse").hasClass("in")) {
        $(".navbar-toggle").click();
    } else {

    }
});
return false;});
于 2013-12-10T13:36:20.723 回答
0

在 CSS 中,body标签的position属性应该有值relative

于 2017-05-10T14:07:43.027 回答