【问题标题】:JQuery sticky bar flickering on page resizeJQuery粘条在页面调整大小时闪烁
【发布时间】:2015-07-22 00:18:00
【问题描述】:

我在我的网站上添加了一个粘性“号召性用语”栏,它的工作方式类似于粘性导航,但是它被固定在窗口底部,它在页面中的原始位置被滚动过去,然后又跳回到文档的流程。

它使用 CSS 类 '.sticky' 在滚动位置小于 bar 原始位置的垂直位置时添加固定位置。

问题是,当我调整页面大小时,我得到了令人讨厌的闪烁,并且该栏经常从视图中消失。

我正在使用的代码如下...

(function() {

    $(window).on('resize', function() {  

        var stickyNavTop = $('#wrap-bar').offset().top; 

        var stickyNav = function(){

            var scrollBottom = $(window).scrollTop() + $(window).height() - $('.cta-bar').height();

            if (scrollBottom < stickyNavTop) {   
                $('#wrap-bar').addClass('sticky');
                $('#wrap-bar-dummy').show();
            } else {  
                $('#wrap-bar').removeClass('sticky');
                $('#wrap-bar-dummy').hide();
            }   

        };  

        stickyNav();  

        $(window).scroll(function() {  
            stickyNav();
        });

    });

    $(document).ready(function() {
        $(window).trigger('resize');
    });

})(jQuery);

谁能指出我需要更改哪些内容才能让栏在调整大小时停止闪烁的正确方向?

谢谢。

【问题讨论】:

  • 这可能是个奇怪的想法,但你能用 CSS 将 #wrap-bar 位置设置为绝对位置,然后设置底部:0 吗?那么就不需要 jQuery 了吗?
  • 我需要 jQuery,因为我希望栏在页面变为不同部分时跳回页面流程。例如,当表单或页脚在视图中时,号召性用语是不相关的。
  • 我认为您可以使用 CSS 来做到这一点。然后,如果栏到达某个锚点,您可以使用 jQuery 将栏保持在锚点位置。

标签: javascript jquery html css


【解决方案1】:

您报告的闪烁很可能是因为 Javascript 不会像您滚动一样快速呈现您的 DOM 更改。正如@Switching Brains 所提到的,尝试使用 CSS 将您的页脚绝对定位在距窗口底部 0px 处。然后,您只需要 Javascript 在您到达页面底部时进行定位,然后应用您的类将其保持在固定位置。

【讨论】:

  • 滚动时不闪烁,仅在调整大小时闪烁。我不需要栏显示在页面底部,并且只有在父元素没有位置值时,绝对定位才能实现这一点。使用 css 的“固定”位置会将其锁定在页面底部,这就是“粘性”类的作用。直到 div 的原始位置被滚动过去然后被移除。
【解决方案2】:

这是一个非常肮脏的例子,但你会明白的:

HTML

<div id="body">
    <div id="bar">Bar at the bottom</div>
</div>

CSS

 html, body {
    height:100%;
    widht:100%;
}

#body {
    position:relative;
    height:100%;
    border:1px solid #000000;
}

#bar {
    position:absolute;
    bottom:20px;
    width:300px;
    left:50%;
    margin-left:-150px;
    background-color:#cccccc;
}

http://jsfiddle.net/Auc6n/

【讨论】:

【解决方案3】:

我在 Mozilla 中发现 .resize() 会导致很多页面闪烁,因为它被驱动得太猛了。

我用过:

 $window.resize(throttle(500,function(){

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多