【问题标题】:Prevent elements from moving when changing position to fixed dynamically动态更改位置为固定时防止元素移动
【发布时间】:2015-09-20 01:34:51
【问题描述】:

我正在使用以下代码将菜单的位置更改为固定滚动:

var $stickyEl = $('#sticky-menu');
var elementBeforeHeight = $('.startHandle').height();
$window.on('scroll', function(){
    if($(window).scrollTop() >= elementBeforeHeight){
        $stickyEl.addClass('navbar-fixed-top');
        $stickyEl.removeClass('navbar-static-top');
    }
    else{
        $stickyEl.addClass('navbar-static-top');
        $stickyEl.removeClass('navbar-fixed-top');
    }
});

它可以工作,但它有一个小错误。更改的时刻会导致菜单后的内容跳到更靠近菜单的位置。我想这是某种默认行为。知道如何防止这种情况吗?

我想我应该设置与导航栏之前的 div 相关的填充。有没有办法做到这一点?我的目标是有图片然后滚动它并查看网站的其余部分。然后我希望我的导航栏固定并保持在顶部。

编辑:
这是我的html:

<header>
    <a href="#sticky-menu" class="page-scroll">
        <div name="startSection" class="content startHandle" id="startPhoto" data-stellar-background-ratio="0">
            <img id="startHeader" class="col-md-8 col-xs-12" src="images/home_title.png">
        </div>
    </a>
</header>
<?php include 'include/fixed_menu.php' ?>
<div class="content container newAlbumSection" id="startContent">
further content...
</div>

fixed_menu.php:

<div id="sticky-menu">
    <nav class="navbar navbar-static-top navbar-default" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
            </div>

            <div class="collapse navbar-collapse navbar-ex1-collapse">
                <ul class="nav navbar-nav margins-navbar">
                    <!-- Hidden li included to remove active class from about link when scrolled up past about section -->
                    <li class="hidden">
                        <a href="#"></a>
                    </li>
                    <li>
                        <a href="/bg/lc/">HOME</a>
                    </li>
                    <li>
                        <a href="/bg/lc/bio/">BIO</a>
                    </li>
                    <li>
                        <a href="/bg/lc/discography/">DISCOGRAPHY</a>
                    </li>
                    <li>
                        <a href="/bg/lc/press/">PRESS</a>
                    </li>
                    <li>
                        <a href="/bg/lc/video">VIDEO</a>
                    </li>
                    <li>
                        <a href="/bg/lc/photo">PHOTO</a>
                    </li>
                    <li>
                        <a href="/bg/lc/contact">CONTACT</a>
                    </li>
                </ul>
            </div>
            <!-- /.navbar-collapse -->
        </div>
        <!-- /.container -->
    </nav>

</div>

css:

body {
    width: 100%;
    height: 100%;
    font-size: 14px;
}

.content {
  background-attachment: fixed;
}
#startPhoto {
      background: url("../images/home_photo.png") no-repeat;
      background-size: 100% 100%;
      height: 57em;
}

#startHeader{
      position: absolute;
      padding-top: 0;
      left: 0.5em;
      bottom: 0;
}

结果: http://bez-granic.eu/lc/

【问题讨论】:

  • 如果它是实时的,你能创建一个演示或提供一个链接吗?
  • 好的,我马上编辑我的帖子
  • 我刚刚添加了 html css 并链接到我的帖子
  • 看起来你可以欣赏一下 jQuery 的 .toggleClass() api.jquery.com/toggleclass
  • 我知道 .toggleClass(),我只是没有看到任何使用它的方法。我使用了@Shikkediel 解决方案,其中包括使用.toggleClass()。感谢您的反馈:)

标签: jquery html css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

您最初的问题并不难解决,只需在下面的内容上切换一些边距(或填充),使其与菜单的高度相同。正如 cmets 中所建议的那样:

.topspace {
margin-top: 50px;
}

$(function() {

var gate = $(window),
sticky = $('#sticky-menu'),
size = $('.startHandle').height(),
content = $('#startContent'),
fixed;

gate.on('load', function() {

// Timeout is for cached scroll position with Opera

    setTimeout(function() {

        if (gate.scrollTop() <= size) {
        sticky.addClass('navbar-static-top');
        fixed = false;
        }
        else {
        sticky.addClass('navbar-fixed-top');
        fixed = true;
        }
    }, 50);
})
.scroll(function() {

    if (gate.scrollTop() > size) {
    if (!fixed) {
    switchMenu();
    content.addClass('topspace');
    }
    }
    else {
    if (fixed) {
    switchMenu();
    content.removeClass('topspace');
    }
    }
});

function switchMenu() {

    sticky.toggleClass('navbar-fixed-top navbar-static-top');
    fixed = !fixed;
}
});

添加检查是否已进行切换也会更好,否则它将继续尝试在每个滚动事件上切换类。顺便说一句,不要介意我使用我自己的编码约定...

但是在我的 (Windows 7) 机器上还有另一个错误。到达粘性菜单切换的位置,我被阻止进一步滚动。可以说,页面“卡在”那里。在你的帖子中没有看到。更奇怪的是,当我打开开发人员工具(并且它停靠在窗口中)或调整为更小的屏幕尺寸时,问题就消失了。

我可以调查一下。

【讨论】:

  • 哇,多么棒的社区!您的解决方案有效 - 谢谢!关于那个错误......我无法重现它......我已经在 firefox、chrome 和默认浏览器(ubuntu)上尝试过。我还在 firefox 和 chrome (windows 8) 上检查了它,但仍然没有错误......知道发生了什么吗?
  • 很高兴代码在实时环境中完成了这项工作。我描述的问题很奇怪,但我怀疑当您设置页脚样式时它可能会自行消失。不知何故,这似乎是相关的——当我给它一个固定的高度时,问题突然消失了。奇怪的是,它显然依赖于以某种方式使用的机器。不过,考虑到简单的解决方法,这似乎没什么好担心的。
  • 是的,我会处理页脚。起初我认为这是文件传输的问题(我在本地服务器上开发 - 快得多)。问题很奇怪,但我想最后会好起来的。 Hopefuly :) 再次感谢您的帮助。
  • 没问题。如果网站完成了,您可以随时在这里给我留言(可能包括我的名字和前面的 @ 否则我可能会错过它),我可以检查一切是否按预期工作。干杯。
猜你喜欢
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2013-08-13
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多