Bootstrap:锚和身体上边距/填充

时间:2013-01-25 16:42:57

标签: twitter-bootstrap anchor margin navbar

我正在使用Bootstrap,其全局导航栏固定在页面主体的顶部。

    <div class="navbar navbar-fixed-top navbar-inverse">
        <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="/">MyBrand</a>
                <div class="nav-collapse collapse">
                    <ul class="nav">
                        <li><a href="#>Page 1</li>
                        <li><a href="#>Page 2</li>
                        <li><a href="#>Page 3</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

我在正文顶部添加了40px的边距,以便页面内容的顶部不会被导航栏覆盖。

body {
    background-color: #f5f5f5;
    position: relative;
    margin-top: 40px;
}

到那里,一切正常。我还使用内部锚点来简化页面内部的导航,使用Twitter与Bootstrap文档中的词缀组件一起使用的相同机制,使用户能够跳转到页面中的不同部分(参见{{3}) })

<a href="#section1">Section 1</a>
<a href="#section2">Section 2</a>
<a href="#section3">Section 3</a>

[...]

<section id="section1">
    [...]
    [...]
    [...]
</section
<section id="section2">
    [...]
    [...]
    [...]
</section
<section id="section3">
    [...]
    [...]
    [...]
</section>

我的问题是当用户点击时,浏览器将目标粘贴到屏幕的最顶部,内容在导航栏下消失。我注意到Twitter使用了一个技巧,目标<section>标签包含“填充顶部:30px;”,最接近的<h1>包括“margin-top:10px;” CSS指令,以便将文本显示在屏幕顶部正下方40px处。

我不能让我在每个部分之间“丢失”40px,我的显示器必须保持紧凑。我的问题是:有没有办法让内部锚点不要粘在屏幕顶部的顶部,而是要保持远离屏幕顶部的任意长度?

3 个答案:

答案 0 :(得分:15)

最后,我想出了如何轻松解决这个问题:

body {
    background-color: #f5f5f5;
    position: relative;
    margin-top: 40px;
}

section {
    padding-top:40px;
    margin-top:-40px;
}

这意味着在主体顶部添加了40px的边距,在截面的顶部添加了40px的填充,还添加了负40px的边距以便向上移动各自的预期位置,引入了无形的边距。当浏览器在单击锚点后将显示绘制到某个部分时的帐户。

希望得到这个帮助。

答案 1 :(得分:5)

要让它滚动到正确的位置并在滚动页面时让所选菜单项正确,您需要在锚点上设置padding-top: 40px;,并在之前的兄弟上设置margin-bottom: -40px;锚。

您可以使用JS片段实现此目的,该片段将从导航菜单中找到元素并应用样式更改。

$("header .nav a[href!=#]").each(function(){
    $($(this).attr("href")).css("padding-top", "40px").prev().css("margin-bottom", "-40px");
});

答案 2 :(得分:2)

如果您的应用程序可以应用javascript,则以下javascript也可以正常运行:

function maybeScrollToHash() {
    if (window.location.hash && $(window.location.hash).length) {
        var newTop = $(window.location.hash).offset().top - $('.navbar-fixed-top').height() + parseInt($('body').css('padding-top'),10);
        $(window).scrollTop(newTop);
    }
}

$(window).bind('hashchange', function() {
maybeScrollToHash();
});

maybeScrollToHash(); 

这是对此处的答案的略微修改:https://github.com/twbs/bootstrap/issues/193

唯一的区别是上面的代码适用于 navbar-fixed-top 类。