【问题标题】:jQuery scrollTo but slow down inbetweenjQuery scrollTo 但在两者之间减慢
【发布时间】:2013-02-20 11:18:19
【问题描述】:

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

我有我的 HTML 结构,所以它是 post > image > post > image 等。

我想知道如果您单击下一个/上一个按钮,它是否有可能像往常一样滚动到下一个帖子,但它会挂起/悬停在中间的图像/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
    })
});

【问题讨论】:

  • 你能用你现有的代码添加一个小提琴吗?
  • jsFiddle: jsfiddle.net/hfg2v - 尽管本教程使用 jsFiddle 不支持的 jQuery 1.4.1。这也是我的工作示例的链接:goo.gl/INbvG
  • 您是否考虑过在滚动视图传递图片时将图片动画化到 slidedown() 以提供类似的效果?如果它们都向下移动,图像将能够显示同样长的时间?

标签: javascript jquery scrollto


【解决方案1】:

假设您的结构将保持静态:post -> image -> post -> image 等。您可以通过找到您将滚动到的帖子的上一张/下一张图像并首先滚动到它,然后使用来完成此操作来自$.scrollTo 插件的onAfter 回调/设置在预定义的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/

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是因为您使用了视差滚动库 (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找到更多缓动函数

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

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

    【讨论】:

    • 请在您的回答中包含代码 .. 甚至一些努力!欢迎来到 StackOverFlow
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多