【问题标题】:scroll multiple sidebar divs down the screen like 9gag.com does像 9gag.com 一样在屏幕上滚动多个侧边栏 div
【发布时间】:2012-06-11 20:59:21
【问题描述】:

堆栈,

基本上,我想要一个主页,其中包含多个堆叠在一起的帖子,例如 techcrunch 或基本上任何博客。对于每个帖子,我希望有一个侧边栏框,当您滚动时,它会在帖子旁边的页面下方浮动,以便用户可以通过类似 facebook 的按钮或其他任何方式轻松分享帖子,而无需滚动回顶部帖子。

当人物到达每个帖子的底部时,侧边栏停止在屏幕上向下浮动,当人物继续滚动到下一个帖子时,下一个帖子的侧边栏开始向下浮动,依此类推。

9gag.com 主页就是一个很好的例子。请注意帖子标题、收藏按钮和社交按钮如何浮动在每个帖子/图片旁边。

我正在尝试使用 jquery 的 scrolltofixed 插件来完成此操作,但我被卡住了。我可以让侧边栏 div 开始正确地向下滚动页面,但是当您到达每个帖子的底部时,我无法让它们停止滚动,因此它们只是开始相互重叠。

通常,您可以使用内置于 scrolltofixed 的“limit”属性来阻止它们滚动,如下所示:

$('.class-of-sidebar-box-div').scrollToFixed({
limit: 3000
});

一旦您向下滚动 3000 像素,这将阻止边栏框随屏幕滚动。

我试图做的是动态设置每个随附帖子的高度限制 + 随附帖子的顶部偏移量 - 侧边栏框的高度,以便在每个侧边栏框到达时停止滚动随附帖子的底部。

示例代码:

$('.class-of-sidebar-box-div').scrollToFixed({
limit: function(){
    var postoffset = $(this).siblings('.accompanying-post-class').offset().top;
    var postheight = $(this).siblings('.accompanying-post-class').height();
    var sidbardivheight = $(this).height();
    var scrolllimit = postoffset + postheight - sidbardivheight ;
    return scrolllimit;
    }
});

这是失败的。侧边栏框开始正确浮动,但未正确设置“限制”。

任何想法我哪里出错了?

更新:修复了 Billiand 建议的示例代码。但是,仍然没有设置限制。另外,我尝试了一个更简单的功能,如下所示,即使它不起作用。

同样失败的更简单的例子:

$('.class-of-sidebar-box-div').scrollToFixed({
limit: function(){
    var scrolllimit = 1000;
    return scrolllimit;
    }
});

想法?

【问题讨论】:

    标签: javascript jquery css jquery-plugins


    【解决方案1】:

    请看一下这个小提琴:http://jsfiddle.net/y3qV5/760/

    它使用了你上面提到的scrolltofixed插件:https://github.com/bigspotteddog/ScrollToFixed

    很遗憾,limit 选项此时没有发挥作用。好主意,下一个版本应该有。

    编辑:最新版本的插件现在支持“limit”作为函数和值。

    为了获得与您上面描述的类似的效果,我所做的是将限制设置为下一部分的 offset().top 减去侧边栏高度加上一些填充,就像您上面描述的那样。知道 limit 选项不接受函数将有助于解决混淆:

    $(document).ready(function() {
        $('#cart1').scrollToFixed({
            marginTop: 10,
            limit: $('#p2').offset().top - $('#cart1').height() - 10
        });
        $('#cart2').scrollToFixed({
            marginTop: 10,
            limit: $('#p3').offset().top - $('#cart2').height()
        });
    });
    

    而且,正如您在下面的评论中提到的那样,这是一种遍历购物车以将它们设置在各自的 div 旁边的方法:

    $(document).ready(function() {
        for (i = 1; i <= $('.cart').length; i++) {
            $('#cart' + i).scrollToFixed({
                marginTop: 10,
                limit: $('#p' + (i + 1)).offset().top - $('#cart' + i).height() - 10
            });
        }
    });
    

    【讨论】:

    • 确保你也注意css。在 CSS 的最底部是使用浮动将推车放置在其各自部分旁边的位置。
    • 聪明的解决方法,它会添加很多代码,因为我有 20 个需要应用它的 div,但在您决定将功能特性添加到 scrolltofixed 之前,它可能是一个很好的解决方案。我还想非常感谢您花时间做出回应(甚至包括一个解决方案,而不是仅仅说 scrolltofixed 不支持我正在寻找的功能)。我将您的答案设置为已接受的答案,因为它完全解决了这个问题。再次感谢 bigspotteddog!
    • @billmalarky 这是更新的小提琴,它消除了您提到的 20 个 div 的重复代码。它遍历 $('.carts') 并设置它们的 marginTops 和限制:jsfiddle.net/y3qV5/768
    • @billmalarky 我对 for 循环有一点小问题。这是更新的小提琴:jsfiddle.net/y3qV5/769
    【解决方案2】:

    .scrollTop() 是错误的函数 - 它会随着用户向下滚动而增加,从而阻止实际达到限制。查看scrollToTop文档,我想你想要的是$(this).siblings('.accompanying-post-class').offset().top

    【讨论】:

    • 你说得对。但是,我根本无法让这个插件处理选项中的功能。我已经尝试过$('.class-of-sidebar-box-div').scrollToFixed({limit: function(){var scrolllimit = 1000;return scrolllimit;}});,但我什至无法得到这么简单的东西。我不明白,因为在此处找到的文档中:github.com/bigspotteddog/ScrollToFixed,“非常完整的示例”表明这应该可以工作。
    • 我没有看到任何暗示limit 参数接受函数的信息。但是你可能不需要它——post div 的底部很少移动,如果有的话。您可能只需计算一次该值,然后直接将该值作为limit 参数提供。
    • 我对 jquery/javascript 有点菜鸟,所以我假设所有插件参数都可以接受函数。在插件示例中,他们设置了这样的限制limit: $('.footer').offset().top - $('#summary').outerHeight() - 10。我试过这样的事情无济于事$('.class-of-sidebar-box-div').scrollToFixed({limit:$(this).siblings('.accompanying-post-class').offset().top+$(this).siblings('.accompanying-post-class').height()-$(this).height()});。想法?
    • "post div 的底部很少会移动,如果有的话。你可以只计算一次值,然后直接提供该值作为限制参数。"我相信这会奏效。但是我如何为每个帖子动态计算呢?
    • 您需要在循环中对每个元素使用 each() 并调用 scrollToFixed(),而不是同时在所有元素上调用它。这样您就可以为每个参数对象提供一个稍微不同的参数对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2017-07-31
    相关资源
    最近更新 更多