jQuery scrollTo但在中间减速

时间:2013-02-20 11:18:20

标签: javascript jquery scrollto

我正在使用一小段代码(基于'ScrollTo Posts with jQuery',它允许您点击下一个/上一个链接,它会跳到每个帖子的顶部。

我有我的HTML结构,所以它发布>图像>发布>图像等。

我想知道如果你点击下一个/上一个按钮,它是否可能正常滚动到下一个帖子,但它会挂起/悬停在images / div之间?所以它最终完成了它的滚动,但减慢了它们之间的div。

这是我的jQuery代码:

$(function () {
    function a(f) {
        var b, e, c = [],
            d = $(window).scrollTop(),
            g = $('.section-slide');
        g.each(function () {
            c.push(parseInt($(this).offset()['top'], 10))
        });
        for (e = 0; e < c.length; e++) {
            if (f == 'next' && c[e] > d) {
                b = g.get(e);
                break
            }
            if (f == 'prev' && e > 0 && c[e] >= d) {
                b = g.get(e - 1);
                break
            }
        }
        if (b) {
            $.scrollTo(b, {
                duration: 1400
            })
        }
        return false
    }
    $('#next,#prev').click(function () {
        return a($(this).attr('id'))
    });
    $('.scrolltoanchor').click(function () {
        $.scrollTo($($(this).attr('href')), {
            duration: 1400
        });
        return false
    })
});

2 个答案:

答案 0 :(得分:1)

假设您的结构将保持静态:post - &gt;图像 - &gt;发布 - &gt;图像等你可以通过找到你要滚动到的帖子的上一个/下一个图像,然后先滚动到它,然后使用onAfter插件中的$.scrollTo回调/设置来解决这个问题。预定义setTimeout之后的辅助滚动,如下所示:

$(function () {
    function scroll(direction) {
        var scroll, scrollImage, i,
            positions = [],
            here = $(window).scrollTop(),
            collection = $('.post');

        collection.each(function () {
            positions.push(parseInt($(this).offset()['top'], 10));
        });

        for (i = 0; i < positions.length; i++) {
            if (direction == 'next' && positions[i] > here) {
                scroll = collection.get(i);

                // Find Image Before Post
                scrollImage = $(scroll).prev('.image').get(0);

                break;
            }
            if (direction == 'prev' && i > 0 && positions[i] >= here) {
                scroll = collection.get(i - 1);

                // Find Image After Post
                scrollImage = $(scroll).next('.image').get(0);

                break;
            }
        }

        if (scroll) {
            // Check if Scroll Image Exists
            if (scrollImage){
                // Scroll with Image Delay
                $.scrollTo(scrollImage, {
                    duration: 750,
                    onAfter: function(){
                        setTimeout(function(){
                            $.scrollTo(scroll, {
                                duration: 750
                            });
                        }, 1000); // Change the Delay to Increase / Decrease the Hover
                    }
                });                
            } else {
                $.scrollTo(scroll, {
                    duration: 750
                });
            }
        }

        return false;
    }

    $("#next,#prev").click(function () {
        return scroll($(this).attr('id'));
    });

    $(".scrolltoanchor").click(function () {
        $.scrollTo($($(this).attr("href")), {
            duration: 750
        });
        return false;
    });
});

您可以在此处找到更新的小提琴:http://jsfiddle.net/hfg2v/2/

我希望这会有所帮助。

答案 1 :(得分:1)

这种情况正在发生,因为您正在使用视差滚动库(Stellar.js),它使不同的元素以不同的速度滚动。

可能的解决方法是在当前视口中没有元素时以更高的速度滚动,直到下一个元素的边缘刚刚离开屏幕,然后立即以原始滚动速度滚动,直到没有元素再次视口,并继续重复此操作,直到达到所需的滚动偏移。

编辑:

抱歉,在我写答案时出现了一些问题,我没有时间完成代码。

但是,经过一段时间的努力,我开始认为我提出的解决方案不起作用。我正在思考这些问题:

$(window).scrollTo(640, {onAfter: function () {
    var scrollRatio = 3;
    var distance = 855 - 640;

    $(window).scrollTo(855, {
        easing: 'linear',
        duration: distance * scrollRatio / speed,
        onAfter: function () {
            var scrollRatio = 1;
            var distance = 1200 - 855;
            $(window).scrollTo(1200, {
                easing: 'linear',
                duration: distance * scrollRatio / speed,
                onAfter: function () {
                    var scrollRatio = 3;
                    var distance = 1280 - 1200;
                    $(window).scrollTo(1280, {
                        easing: 'linear',
                        duration: distance * scrollRatio / speed
                    });
                }
            });
        }
    });
}});

如果您将以前的代码粘贴到问题(http://dev.du.st/field-station/)中提供的网站中,您将被带到第一个元素,它将尝试使用我描述的方法滚动您到下一个元素。我硬编码了偏移值,因为我还在试验它。但是,我不认为这种方法会起作用,因为它仍然感觉不舒服。这是因为在动画中间瞬间改变速度总是很明显。

现在,我认为可以减轻视差滚动导致的慢滚动感觉的最佳方法是使用不同的缓动功能。毕竟,使背景图片更慢,正是你正在使用视差滚动。

以下代码在您的网站上运行时,默认情况下会使所有动画使用'easeOutCirc'作为缓动功能,经过一些实验后,我发现它是使滚动感觉最不奇怪的一个:

// Add the jQuery-easing plugin, needed for the more sophisticated easing functions.
$.getScript('//cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js');

// Set easeOutCirc as the default easing.
jQuery.easing.def = 'easeOutCirc';

您可以在this website

找到更多缓动功能

一旦你完成了实验,如果你决定使用缓动(你可以使用不同的上下滚动),那么你应该按原样保持默认缓动,只需更改滚动中的缓动通过将{easing: EASING_NAME}添加到scrollTo函数中的选项哈希来动画。所以你的代码看起来像这样:

$.scrollTo($($(this).attr("href")), {
    duration: 750,
    easing: 'easeOutCirc'
});