【问题标题】:Advanced jQuery sticky sidebar高级 jQuery 粘性侧边栏
【发布时间】:2013-03-15 12:37:41
【问题描述】:

我正在开发一个(粘性)滚动侧边栏。问题是大多数粘性侧边栏没有考虑到侧边栏可以比视口高(例如,如果许多项目被添加到篮子(侧边栏))。这就是我要解决的问题。这些是要求:

  • 如果侧边栏的高度高于视口,它应该 滚动浏览内容和 div 的底部应该坚持 向下滚动时视口的底部。

  • 如果侧边栏的高度高于视口,则 div 仅当您位于底部时才应显示下方 页面。

  • 当用户向上滚动时,侧边栏会滚动回顶部并 粘回到视口的顶部。

  • 如果侧边栏的高度小于视口,则应该是 向下滚动时从顶部粘住。

所以总而言之,相当多的功能,而不是那么简单(我认为)。我所看到的最接近我想要实现的是这个例子:http://demo.techbrij.com/730/fix-sidebar-scrolling-jquery.php 但代码的编写方式不适合我的。

到目前为止,这是我所做的:DEMO

还有我使用的 jQuery 代码:

jQuery(document).ready(function($) {

var $sidebar   = $('.sidebar'),
    $content   = $('.content');

if ($sidebar.length > 0 && $content.length > 0) {
    var $window    = $(window),
        offset     = $sidebar.offset(),
        timer;

    $window.scroll(function() {
        clearTimeout(timer);
        timer = setTimeout(function() {
            if ($content.height() > $sidebar.height()) {
                var new_margin = $window.scrollTop() - offset.top;
                if ($window.scrollTop() > offset.top && ($sidebar.height()+new_margin) <= $content.height()) {
                    // Following the scroll...
                    $sidebar.stop().animate({ marginTop: new_margin });
                } else if (($sidebar.height()+new_margin) > $content.height()) {
                    // Reached the bottom...
                    $sidebar.stop().animate({ marginTop: $content.height()-$sidebar.height() });
                } else if ($window.scrollTop() <= offset.top) {
                    // Initial position...
                    $sidebar.stop().animate({ marginTop: 0 });
                }
            }
        }, 100); 
    });
}

});

【问题讨论】:

  • 嗯。对于我自己的粘性标题/元素库,我没有考虑到这一点。我想我有一个新问题要解决。 :-) underpull.github.com/Balloon

标签: javascript jquery html sidebar sticky


【解决方案1】:

查看 hcSticky,我只是在寻找这个。这是一种“完美”的粘性侧边栏,还可以通过选项模拟其他库。

第一个演示可能是每个人都需要的,它独立于主要内容滚动一个容器。 (您可以在到达页面底部之前浏览整个侧边栏,或者当您向上滚动条时,在到达页面顶部之前)。

查看:http://someweblog.com/demo/hcsticky/

【讨论】:

【解决方案2】:

我相信这是您正在寻找的功能:http://jsfiddle.net/JVe8T/7/

抱歉,代码混乱,但优化它应该相当容易。我还假设 sidebar2(非粘性)已定义高度,如果不是这种情况,您可以使用 jquery 检测它并使用 .css 选择器进行底部偏移。

这是我的代码:

jQuery(document).ready(function() {

    var tmpWindow = $(window),
        sidebar = $('.sidebar'),
        content = $('.content'),
        sidebar1 = $('.sidebar1'),
        sidebar2 = $('.sidebar2'),
        viewportHeight = $(window).height(),
        sidebarHeight = sidebar.height(),
        sidebar1Height = sidebar1.height(),
        sidebar2Height = sidebar2.height(),
        offsetBottom;


    tmpWindow.scroll(function(){

        offsetBottom = content.height() - sidebar2Height;

        //if sidebar height is less that viewport
        if (viewportHeight > sidebarHeight) {
            sidebar.addClass('fixed');
        } 

        //sticky sidebar1
        if ((tmpWindow.scrollTop() + viewportHeight) > sidebar1Height ) {
            sidebar1.addClass('bottom');
        } else {
            sidebar1.removeClass('bottom');
        }

        //end of content, visible sidebar2
        if ((tmpWindow.scrollTop() + viewportHeight) > offsetBottom) {
            sidebar1.removeClass('bottom');
            sidebar1.addClass('fixedBottom');
        } else {
            sidebar1.removeClass('fixedBottom');
        }

    });

});

【讨论】:

    【解决方案3】:

    您正在使用边距来移动粘性侧边栏 - 我发现这是处理您当前询问的一种棘手方式(并且可能是一种更重的方式)。

    一般来说,我喜欢简单地向侧边栏添加一个类,使其成为“位置:固定”,这样浏览器就可以完成保持锁定的繁重工作。

    对于您当前的要求,您只需根据滚动的距离以编程方式滚动该位置固定的 div(也设为 100% 高度)。看看我的例子,看看是不是你想要的效果:http://jsfiddle.net/ZHP52/1/

    这里是 jquery:

    jQuery(document).ready(function($) {
    
    var $sidebar   = $('.sidebar'),
        $content   = $('.content');
    
    //Since our CSS is going to monkey with the height as you scroll, I need to know the initial height.
    var sidebarHeight = $sidebar.height();
    
    if ($sidebar.length > 0 && $content.length > 0) {
        var $window    = $(window),
            offset     = $sidebar.offset(),
            timer;
    
        $window.scroll(function() {
    
            if ($content.height() > sidebarHeight) {
                var new_margin = $window.scrollTop() - offset.top;
                if ($window.scrollTop() > offset.top) {
                    // Fix sidebar
                    $sidebar.addClass("fixed");
                    // Scroll it the appropriate ammount
                    $sidebar.scrollTop(new_margin);            
                }else{
                    $sidebar.removeClass("fixed");
                }
            }
        });
    }
    
    });
    

    【讨论】:

    • 您好,抱歉我的回复延迟,现在才阅读。我认为您的 js fiddle 有点错误,从我从代码中可以看出它没有实现这个要求:如果侧边栏的高度高于视口,它应该滚动浏览内容和底部进一步向下滚动时,div 应该粘在视口的底部。
    • 啊,抱歉——我的快速样式取决于浏览器的大小。不过,我认为我的答案适用 - 滚动时触发类,将导航栏切换到固定位置,并根据您正在计算的滚动偏移量务实地滚动侧栏的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多