问题 jQuery动画滚动顶部为0不能在Windows Phone上运行


我写了一个网站,它有一个将用户视图滚动到页面顶部的功能。有问题的电话是:

$('html,body').animate({scrollTop:0}, 150, 'swing');

这适用于所有桌面浏览器,但在Windows Phone上,它只向用户滚动约180像素,然后停止。我试过用以下函数替换函数:

$('html,body').scrollTop(0);

它在桌面上突然移动到顶部,但它在电话上滚动到顶部。我相信Internet Explorer Mobile需要尝试平滑地滚动动画,并导致问题。如果是这种情况(或者如果没有,有人可以纠正我),我如何覆盖此功能以使动画工作?

编辑

虽然它不理想,但似乎在有限的容量下工作,我用这个替换了滚动代码:

$('html,body').animate({scrollTop:0}, 150, 'swing', function() {
    $('html,body').scrollTop(0);
});

但是,如果有一个选项可以以编程方式禁用Mobile IE中的平滑滚动,那将是一件好事。


3181
2018-05-21 23:21


起源



答案:


在Windows Phone 8上,我遇到了同样的问题。我目前正在做以下hack,它等待动画“完成”,然后执行标准window.scrollTo以确保它滚动到正确的位置。

scrollHmtlBody: function (scrollToTarget, duration) {
    $('html, body').animate({ scrollTop: scrollToTarget }, duration);

    // Windows Phone doesn't animate properly, 
    // this makes sure it scrolls to the appropriate position (eventually)
    setTimeout(function() { 
        window.scrollTo(0, scrollToTarget);
    }, duration + 75);
}

我对结果不满意 - 它有效,但由于75ms的延迟,它在“完成”滚动动画之前犹豫不决。由于延迟较少,Windows Phone显然拒绝执行scrollTo操作(也许它认为它当前正在“滚动”?)

我可能最终会使用带有设备检测的if / else子句,但是现在我正试图找到一个更好的解决方案,而不是沿着那条路走下去。


7
2017-07-10 13:50



是的,这与我最后做的相似。除了,而不是 setTimeout 打电话到外面 .animate,它是内部完整回调参数的一部分 .animate。似乎工作正常,但是,之后延迟是令人讨厌的。设备发现程序(服务器端)可以包含不同的脚本,只要所有窗口动画都在独立脚本中处理 - topherg
是的,由于某种原因,它不能在模拟器的回调中工作。应该在本周末有一个真正的W8Phone,看看是否有所作为。 - LocalPCGuy
有时,我发现的事情是动画开始,然后它会停在一个点上。我认为它是因为当它向上滚动时,它会被中断,所以它会停止。它可能需要一个脚本来确定您当前所在位置,您要去的位置之间的像素数,然后如果可以计算速率(不应该花费太长时间),则可以确定WP滚动的时间。然后,用一点点填充(比如说5ms) scrollTo(0) 可以叫。会有一点戏。享受你的新手机 - topherg
哈哈......我很高兴我的Android,新手机是我们的QA实验室。我可能会考虑编写自己的动画函数,该函数使用递归调用和setTimeout的组合来使用window.scrollTo为滚动设置动画。应该在各处工作并提供相同的体验,并且不要认为它需要花费很长时间,它是一个相对简单的递归函数。 - LocalPCGuy
我发现在Windows Mobile上最容易检测到浏览器,只需调用window.scroll(0,0);浏览器将为您设置滚动动画。 - GGJ


答案:


在Windows Phone 8上,我遇到了同样的问题。我目前正在做以下hack,它等待动画“完成”,然后执行标准window.scrollTo以确保它滚动到正确的位置。

scrollHmtlBody: function (scrollToTarget, duration) {
    $('html, body').animate({ scrollTop: scrollToTarget }, duration);

    // Windows Phone doesn't animate properly, 
    // this makes sure it scrolls to the appropriate position (eventually)
    setTimeout(function() { 
        window.scrollTo(0, scrollToTarget);
    }, duration + 75);
}

我对结果不满意 - 它有效,但由于75ms的延迟,它在“完成”滚动动画之前犹豫不决。由于延迟较少,Windows Phone显然拒绝执行scrollTo操作(也许它认为它当前正在“滚动”?)

我可能最终会使用带有设备检测的if / else子句,但是现在我正试图找到一个更好的解决方案,而不是沿着那条路走下去。


7
2017-07-10 13:50



是的,这与我最后做的相似。除了,而不是 setTimeout 打电话到外面 .animate,它是内部完整回调参数的一部分 .animate。似乎工作正常,但是,之后延迟是令人讨厌的。设备发现程序(服务器端)可以包含不同的脚本,只要所有窗口动画都在独立脚本中处理 - topherg
是的,由于某种原因,它不能在模拟器的回调中工作。应该在本周末有一个真正的W8Phone,看看是否有所作为。 - LocalPCGuy
有时,我发现的事情是动画开始,然后它会停在一个点上。我认为它是因为当它向上滚动时,它会被中断,所以它会停止。它可能需要一个脚本来确定您当前所在位置,您要去的位置之间的像素数,然后如果可以计算速率(不应该花费太长时间),则可以确定WP滚动的时间。然后,用一点点填充(比如说5ms) scrollTo(0) 可以叫。会有一点戏。享受你的新手机 - topherg
哈哈......我很高兴我的Android,新手机是我们的QA实验室。我可能会考虑编写自己的动画函数,该函数使用递归调用和setTimeout的组合来使用window.scrollTo为滚动设置动画。应该在各处工作并提供相同的体验,并且不要认为它需要花费很长时间,它是一个相对简单的递归函数。 - LocalPCGuy
我发现在Windows Mobile上最容易检测到浏览器,只需调用window.scroll(0,0);浏览器将为您设置滚动动画。 - GGJ


在Windows Phone 7上,这些解决方案都不适用于我。 什么工作是删除animate()并简单地依赖于html标记上的scrollTop。 希望这有助于某人。

这个:

$('html').scrollTop(distance);

代替:

$('html,body').animate({ scrollTop: distance }, 250);

1
2017-07-03 17:02



虽然这确实很好用,但它确实有一个不幸的副作用,即在不自行动画的设备上删除任何漂亮的动画(如桌面上的Chrome) - topherg


我在Windows Phone 8上遇到了同样的问题。在我的情况下,我需要将窗口滚动到底部,但在手机上它只是不起作用。

最后,我使用了@topherg和@LocalPCGuy解决方案的组合,略微变化以使屏幕显示在底部。

这是我的代码,它可以帮助其他人:

$("html, body").stop().animate({
    scrollTop: $("#last-message").offset().top
}, 2000, 'swing', function () {
    $("html, body").scrollTop($("#last-message").offset().top);
});

setTimeout(function () {
    window.scrollTo(0, document.body.scrollHeight);
}, 2075);

#last-message是我要滚动到的div。感觉有点hacky,但Windows Phone也是如此:P


1
2017-12-13 18:27





我这样解决了

链接: <a href="#about" data-target="about" class="scroll-to">关于</a>

锚名称#about使其可以在具有平滑滚动的设备上工作

        function scrollToElement(elementId) {
            var top = $("#" + elementId).offset().top;
            $('html,body').animate({ scrollTop: top }, 250);
        }

        $(".scroll-to").click(function () {
            scrollToElement($(this).data("target"));
        });

0
2018-05-30 00:36



真的没有区别。我将它实现到测试页面上,但它只会走很短的距离,然后停止 - topherg