【问题标题】:jQuery animating scroll top to 0 not working on Windows PhonejQuery 将滚动条设置为 0 在 Windows Phone 上不起作用
【发布时间】:2013-05-21 23:21:31
【问题描述】:

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

$('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);
});

但如果有一个选项可以在移动 IE 中以编程方式禁用平滑滚动,那就太好了。

【问题讨论】:

    标签: jquery windows-phone-8 scrolltop


    【解决方案1】:

    在 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);
    }
    

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

    我可能最终会求助于带有设备检测的 if/else 子句,但现在我正试图找到一个更好的解决方案,而不是走这条路。

    【讨论】:

    • 是的,这与我最后所做的相似。除了在.animate 之外调用setTimeout,它是.animate 中完整回调参数的一部分。似乎工作正常,但是是的,事后延迟很烦人。设备发现程序(服务器端)最好包含一个不同的脚本,只要所有的窗口动画都在一个独立的脚本中处理
    • 是的,由于某种原因,它在模拟器的回调中不起作用。应该在本周末之前拥有一个真正的 W8Phone,看看这是否会有所作为。
    • 有时,我发现动画会开始,然后它会停在某个点。我认为这是因为当它向上滚动时,它被打断了,所以它只是停止了。它可能需要一个脚本来确定您当前所在位置和您要去的位置之间的像素数,然后如果可以计算速率(这不应该花费太长时间),则可以确定 WP 滚动的时间。然后,通过一点填充(比如说 5 毫秒)可以调用 scrollTo(0)。会有一点儿戏。享受您的新手机
    • 哈哈...我对我的 Android 非常满意,新手机是为我们的 QA 实验室准备的。我可能会考虑编写自己的动画函数,该函数使用递归调用和 setTimeout 的组合来使用 window.scrollTo 为滚动设置动画。应该几乎可以在任何地方工作并提供相同的体验,并且不要认为需要那么长时间才能完成,这是一个相对简单的递归函数。
    • 我发现在 windows mobile 上最容易检测浏览器并调用 window.scroll(0,0);浏览器将为您设置滚动动画。
    【解决方案2】:

    这些解决方案都不适用于 Windows Phone 7。 起作用的是删除 animate() 并仅依靠 html 标签上的 scrollTop 。 希望这对某人有所帮助。

    这个:

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

    代替:

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

    【讨论】:

    • 虽然效果很好,但它确实有一个不幸的副作用,即在自己不做动画的设备上删除任何漂亮的动画(比如桌面上的 Chrome)
    【解决方案3】:

    我在 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

    【讨论】:

      【解决方案4】:

      我是这样解决的

      链接: 关于

      锚名称#about 使其可以在平滑滚动的设备上运行

              function scrollToElement(elementId) {
                  var top = $("#" + elementId).offset().top;
                  $('html,body').animate({ scrollTop: top }, 250);
              }
      
              $(".scroll-to").click(function () {
                  scrollToElement($(this).data("target"));
              });
      

      【讨论】:

      • 真的没有区别。我在测试页面上实现了它,但它只会走一小段距离,然后停止
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2021-11-22
      • 2012-07-15
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多