【问题标题】:Making a sticky header work制作粘性标题
【发布时间】:2014-03-12 19:40:45
【问题描述】:

我得到了sticky header 的以下代码,但我无法让滚动条正常工作,而且过渡也不是很顺畅。当下面的固定标题被激活时,#top-nav-wrapper 几乎不会滚动:

<script>
$(document).scroll( function() {
    var value = $(this).scrollTop();
    if ( value > 48 ) {
        $(".header").css("position", "fixed");
        $("body").css("padding-top", "90px");
    } else {
        $(".header").css("position", "relative");
        $("body").css("padding-top", "0");
    }
});
</script>

48 值是#top-nav-wrapper 的高度,加上它有一个盒子阴影。

应该保留带有搜索栏的 .header 类。

基本的html:

<div class="headerWrapper">
    <div id="top-nav-wrapper"></div>
        <div class="header"></div>
</div>

CSS:

body {
  background: #EEE;
}

#top-nav-wrapper {
  width: 100%;
  position: relative;
  box-shadow: 0px 1px 1px 0px #B8B8B8;
  z-index: 2001;
  background: #EEE;
}

.header {
  position: relative;
  left: 0;
  top: 0;
  width: 100%;
  min-height: 90px;
  z-index: 2000;
  background: #EEE;
  height: 90px;
  box-shadow: 0px 1px 2px #C4C4C4;
}

*我尝试了以下建议,但效果和之前一样:

<script>
        $(window).scroll( function() {
            var value = $(this).scrollTop();
            var $body = $('body');
            var docked = $body.hasClass('docked');    

            if ( value > 48 ) {
                if( !docked ) {
                    $body.addClass('docked');
                }
            } else {
                if( docked ) {
                    $body.removeClass('docked');
                }
            }
        });
        </script>

任何想法表示赞赏。

更新 - 我已将脚本更改为以下内容并将其放在头部 - 这解决了顶部导航不动态滚动的问题,我在标题之后和内容之前添加了一个占位符 div与固定标题相同的大小高度以将内容保持在应有的位置(因为固定标题会改变自然流),但是当固定标题启动时仍然存在滞后/跳跃。

占位符 CSS:

.headerPlaceholder {
height: 90px;
width: 100%;
display: none;
}

设置 48px 滚动高度后顶部导航不一直滚动的解决方案:

<script>
    $(document).ready(function () {
        var div = $('.header');
        var div2 = $('.headerPlaceholder');
        var start = $(div).offset().top;

        $.event.add(window, "scroll", function () {
            var p = $(window).scrollTop();
            $(div).css('position', ((p) > start) ? 'fixed' : 'static');
            $(div).css('top', ((p) > start) ? '0px' : '');
            $(div2).css('display', ((p) > start) ? 'block' : 'none');
        });

    });
</script>

为了使其平稳过渡,可能需要稍微延迟和淡入/淡出效果,如果有人可以提供帮助吗?

【问题讨论】:

  • 尝试使用$(window) 而不是$(document)。在您的 if 条件下,还要检查 &gt;=。此外,您还需要提高 .header 元素的 z-index(或者,使用占位符来防止布局折叠...尽量减少使用 padding-top
  • 你应该简单地添加一个类到body标签并使用css来改变body和.header
  • Jack 提到 zindex 是因为停靠的标头位于普通标头下方。除了它在 FF mac 上对我有用之外,你使用的是什么浏览器?
  • 啊,我知道了。顺便说一句,@Huangism 是对的——在 body 中添加一个类会更有意义——也解决了 box-shadow 问题。
  • 网站在我看来非常好(Chrome,Win7x64)

标签: javascript jquery


【解决方案1】:

你可以试试

$(window).scroll( function() {
    var value = $(this).scrollTop();
    var $body = $('body');
    var docked = $body.hasClass('docked');    

    if ( value > 48 ) {
        if( !docked ) {
            $body.addClass('docked');
        }
    } else {
        if( docked ) {
            $body.removeClass('docked');
        }
    }
});

CSS

.docked {
    padding-top: 90px;
}
.docked .header {
    position: fixed;
    z-index: 2005;
}

如果有一个可以定位的整体容器而不是主体,则效率会更高。

【讨论】:

  • 目前我们正在将 .header 类更改为修复/停靠,如果您想定位顶部导航 ID,那么您可以尝试更改该部分。我不清楚你有什么盒子阴影问题。我已经在我的 mac 和 windows 7 VM 上的不同浏览器上检查了该站点。一切看起来都很好,我没有任何滚动或类似问题。也许你的电脑太旧了?你能解释一下不正确滚动是什么意思吗?我认为一切正常且正常
  • 好的,我在新闻页面上。顶部导航的 z-index 为 2001。我不知道为什么需要这样做,如果不需要,则应将其删除。当您删除 z-index 时,当停靠菜单停靠时,标题将不会与停靠菜单重叠。所以我现在看到的是“内部指南”部分已停靠。如果这是正确的,并且您希望内容不“跳跃”,那么只需调整 padding-top
  • 顶部导航不消失没有问题。我们没有实现任何 CSS 来让顶部导航消失,我们也不需要这样做。底线是它不需要消失。我已经更新了问题,使停靠的标题 z-index 为 2005,因此停靠时不会重叠。它重叠是因为顶部导航上的 z-index 高于停靠的标题。您的顶部导航是相对位置,这就是它与您的固定定位标题重叠的原因。对您的站点进行此更新并调整填充顶部。由于内容正在跳跃,您似乎需要添加更多填充。
  • 我不明白你的意思是不向上滚动并隐藏问题。顶部导航是否应该与内部指南标题对接?
  • 哦,你的意思是因为你的标题是半透明的所以可见?为什么这是一个问题?如果你真的想让它消失,那么只需将它添加到 css 中。使用停靠类定位顶部导航,并将其设置为不显示。或者使停靠的标题不透明。这是一个简单的 css,如果你不知道该怎么做,请告诉我
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2021-04-23
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多