【问题标题】:Position: Fixed in Sidebar - How to stop it before footer?位置:固定在侧边栏中 - 如何在页脚之前停止它?
【发布时间】:2013-07-19 00:05:53
【问题描述】:

我在边栏中使用 jQuery 作为浮动小部件 - 链接到我的帖子 http://www.product-investigation.com/fat-loss-factor-review - 如果你向下滚动,你会明白我的意思..我想在页脚之前在边栏中停止我的 adsense 小部件..谢谢帮助:)

我的 javascript

<script>
$(document).ready(function() {
        function isScrolledTo(elem) {
            var docViewTop = $(window).scrollTop(); //num of pixels hidden above current screen
            var docViewBottom = docViewTop + $(window).height();
            var elemTop = $(elem).offset().top; //num of pixels above the elem
            var elemBottom = elemTop + $(elem).height();
            return ((elemTop <= docViewTop));
        }
        var catcher = $('#catcher');
        var sticky = $('#sticky');
        $(window).scroll(function() {
            if(isScrolledTo(sticky)) {
                sticky.css('position','fixed');
                sticky.css('top','100px');
            }
            var stopHeight = catcher.offset().top + catcher.height();
            if ( stopHeight > sticky.offset().top) {
                sticky.css('position','absolute');
                sticky.css('top',stopHeight);
            }
        });
    });
    </script> 

【问题讨论】:

  • 您是否尝试过将if(isScrolledTo(sticky)) 放入else 语句中?有点像if(stopHeight &gt; sticky.offset().top){...}else{ if(isScrolledTo(sticky)){...} }..
  • 这对我不起作用:(
  • 呃...你能设置jsfiddle吗?以便我可以帮助您调试您的问题?
  • 我已经发布了答案。希望对您有所帮助。

标签: jquery


【解决方案1】:

我已更新您的jsfiddle。我改变了你的条件:

return ((elemTop <= docViewTop || elemTop >= docViewTop)); //Changed your return in isScrolledTo

解释:我在下面添加的代码会将sticky div 定位在footer 的顶部,如果我使用您原来的return 语句并向上滚动,sticky div 的位置仍将是@ 987654327@ 在footer 之上。这是因为您的return 语句只会检查元素的top 位置是否小于或等于scrollTop() 值,该值只能在scrolldown 期间使用。在我的情况下,sticky 已经在底部,isScrolledTo() 还应该检查sticky div 的top 是否大于或等于scrollTop() 值。

并在.scroll()中添加了一些东西

$(window).scroll(function() {
    if(isScrolledTo(sticky)) {
      sticky.css('position','fixed');
      sticky.css('top','2px');
    }
    var stopHeight = catcher.offset().top + catcher.height();
    var stickyFoot = sticky.offset().top + sticky.height();

    if(stickyFoot > footTop -10){ //Check if sticky's foot passes footer's top
      console.log("Top of Footer");
      sticky.css({
        position:'absolute',
        top: (footTop - 20) - sticky.height()
      });
    } else {
      if ( stopHeight > sticky.offset().top) {
        console.log("Default position");
        sticky.css('position','absolute');
        sticky.css('top',stopHeight);
      }
    }
});

希望对你有帮助。

【讨论】:

  • 这是一个很好的答案并且效果很好,我唯一的批评(而且真的很小)是你的 js fiddle 中有两个 div 具有相同的 id "catcher" 这将不是有效的 html ,在我的解决方案中,我将其更改为一个类,并且效果很好。
  • 谢谢 :) 我没注意到那个哈哈
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2020-01-19
相关资源
最近更新 更多