你如何动画FB.Canvas.scrollTo?

时间:2011-08-25 15:52:27

标签: facebook facebook-javascript-sdk scrollto

我创建了一个设置尺寸(大约2,000像素高)的应用程序,并且有一个调用FB.Canvas.scrollTo的菜单,以帮助用户浏览长页面。

有没有办法添加平滑的滚动效果? Facebook在其开发者博客上没有提供任何解决方案。

4 个答案:

答案 0 :(得分:47)

使用@ Jonny的方法,您可以使用

更简单地完成此操作
function scrollTo(y){
    FB.Canvas.getPageInfo(function(pageInfo){
            $({y: pageInfo.scrollTop}).animate(
                {y: y},
                {duration: 1000, step: function(offset){
                    FB.Canvas.scrollTo(0, offset);
                }
            });
    });
}

答案 1 :(得分:5)

今天遇到了同样的问题 - 我想出了一些javascript,它利用jQuery的animate方法提供了一些缓和 - 滚动仍然是一个触摸生涩(我猜这是因为FB.Canvas.scrollTo代理)。无论如何,这是片段:

function scrollToTop() {
    // We must call getPageInfo() async otherwise we will get stale data.
    FB.Canvas.getPageInfo(function (pageInfo) { 

        // The scroll position of your app's iFrame.
        var iFrameScrollY = pageInfo.scrollTop;

        // The y position of the div you want to scroll up to.
        var targetDivY = $('#targetDiv').position().top;

        // Only scroll if the user has scrolled the window beneath the target y position.
        if (iFrameScrollY > targetDivY) {
            var animOptions = {

                // This function will be invoked each 'tick' of the animation.
                step: function () {
                    // As we don't have control over the Facebook iFrame we have to ask the Facebook JS API to 
                    // perform the scroll for us.
                    FB.Canvas.scrollTo(0, this.y);
                },

                // How long you want the animation to last in ms.
                duration: 200
            };

            // Here we are going to animate the 'y' property of the object from the 'iFrameScrollY' (the current 
            // scroll position) to the y position of your target div.
            $({ y: iFrameScrollY }).animate({ y: targetDivY }, animOptions);
        }
    });
}

答案 2 :(得分:2)

我刚刚使用了Francis的技术并实现了jQuery版本

$('html,body').animate(
  {scrollTop: $(".scroll_to_me").offset().top}, 
  {duration: 1000, step: function(top_offset){
    FB.Canvas.scrollTo(0, top_offset + 30);
  }
});

您需要将.scroll_to_me替换为要滚动到的选择器。另外,我在+ 30中添加了偏移量,因为iframe没有从页面顶部开始,您可能想要调整它。

答案 3 :(得分:0)

这样做的一种方法是获取当前的Y位置,然后到达Y位置。使用setTimeout运行for循环,该循环将使用户进入最终的Y位置。