jQuery scrollTop() 在移动浏览器上滚动 DIV 时不起作用,替代方案?

Posted

技术标签:

【中文标题】jQuery scrollTop() 在移动浏览器上滚动 DIV 时不起作用,替代方案?【英文标题】:jQuery scrollTop() does not work in scrolling DIV on mobile browsers, alternatives? 【发布时间】:2012-08-26 20:50:33 【问题描述】:

我正在尝试滚动到滚动 DIV 中的特定位置。现在我正在使用带有 jQ​​uery scrollTop() 函数的像素偏移,该函数在桌面浏览器上运行良好,但它不适用于除了谷歌的 Chrome android 浏览器之外的 android 手机浏览器(没有 ios 设备来测试它是否有效)。我找到的所有解决方案都是用于页面(窗口)滚动而不是在 DIV 中滚动,有人对我还可以使用什么来完成相同的任务有任何建议吗?

这是一个例子:http://jsfiddle.net/aQpPc/ http://jsfiddle.net/aQpPc/embedded/result/

我在桌面浏览器中尝试过的其他方法

document.getElementById('ID_of_element_in_a_DIV').scrollIntoView();
document.getElementById('ID_of_DIV').scrollTop = 200;

2013 年 3 月 11 日编辑:

这是一个已知的 android 浏览器问题:https://code.google.com/p/android/issues/detail?id=19625

错误报告中的一位用户提出了解决方法:

因为这个问题似乎只在溢出属性为 设置为滚动,可以先设置为'hidden',设置scrollTop 属性,然后将其重置回“滚动”(或自动)。滚动顶部 当元素被重新渲染时,属性似乎得到了尊重 滚动条。目前尚不清楚这是否有任何意想不到的副作用, 但是“它可以在我的机器上运行!”

【问题讨论】:

它确实适用于 IOS 的 safari 和 chrome 对于那些需要滚动整个文档的人(比如我),你可以使用 $("body").scrollTop(0),在 html 或 div 元素上尝试它不起作用跨度> jsfiddle.net/aQpPc/embedded/result 我在三星 Galaxy S3 的内置浏览器中试过这个,效果很好。 嘿,很高兴看到这里引用了我的解决方法。 :) 这种解决方法似乎仍然是我发现让它以合理的方式工作的唯一方法。怀疑这会很快解决...... 【参考方案1】:

这对我有用:

setTimeout( function() 
    $(div).scrollTop(0)
, 500 );

【讨论】:

【参考方案2】:

对我有用的解决方法:首先,将溢出属性临时设置为“隐藏”,然后设置 scrollTop 属性,然后将溢出属性设置回“滚动”(或自动)。当溢出属性设置回“滚动”时,scrollTop 值似乎保持不变并受到尊重。这是一个非常简单的解决方法,适用于我测试过的所有浏览器(桌面和移动)。我没有对它进行详尽的测试,也没有在适当的过渡情况下进行测试,所以可能会有我没有遇到的副作用......你的里程可能会有所不同 - 但这是一件容易尝试的事情。

【讨论】:

在 Android 4.0.X 浏览器上不起作用 - 当将溢出设置回“滚动”时,整个 div 只会转到顶部...【参考方案3】:

我在这里找到了答案http://blog.jonathanargentiero.com/jquery-scrolltop-not-working-on-mobile-devices-iphone-ipad-android-phones/

手机看不懂$('html,body')所以手机可以做以下操作

if(navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/))            
    window.scrollTo(0)
 else 
    // default `$('html,body')` code for scrolling

只需使用$('body') 而不是$('html, body')

【讨论】:

未捕获的类型错误:添加 window.scrollTo(0) 后无法在 'Window' 上执行 'scrollTo'; @VivekVikranth 你在用什么可以分享你的sn-p【参考方案4】:

我建议不要使用 scroll、scrollTo 或 scrollTop 方法(这会给我在移动设备上带来问题),而是在顶部 DOM 元素(如 #top)上设置一个 ID,然后只使用:

document.getElementById("top").scrollIntoView();

到目前为止,它在所有设备和浏览器上对我来说效果最好。

【讨论】:

【参考方案5】:

我有几个解决方案供您尝试。您必须自己测试它们,因为我之前没有在移动浏览器中尝试过它们,但它们在这里:

    使用 jQuery 的 .css() 方法(或 .animate(),取决于您的最终目标)来调整上边距(注意:您必须将溢出更改为隐藏并将文本包装在内部 div 中,这将是您正在调整其边距的元素) 执行与第一个解决方案相同的操作,除了将嵌入的 div 的位置设置为相对并调整其 top 属性。

如果您需要任何帮助或对此有任何疑问,请告诉我。祝你好运! :)

请注意,虽然在它们基于 CSS 标准而不是 jQuery 函数之前我没有在移动设备上测试过它们,但它们应该可以工作。

【讨论】:

【参考方案6】:

按照@Allan Nienhuis 的回答中的建议,暂时将overflow 属性设置为“隐藏”,例如,在Android 4.0.3 上不起作用(例如,Kindle Fire 2s 正在运行)-当您将overflow 设置回scroll 时,元素会滚动回顶部。

替代方案:

通过辅助函数滚动您自己的滚动,如 here 所示 - 虽然这很容易实现,但它是简单的,因为它不会给您惯性滚动或过度滚动。

使用诸如 iScroll 之类的库,它基于 CSS 转换实现自己的复杂滚动(惯性、过度滚动)。

不过,使用 iScroll 需要一些设置:您需要一个 wrapper div 具有固定的高度和样式 overflow: hidden 并且要滚动的元素应该有 no overflow 风格。 This jsFiddle demo 展示了它是如何完成的。

【讨论】:

iScroll 适用于 4.1,它会激活锚链接!谢谢!【参考方案7】:

我可以在 Galaxy Tab 上滚动到页面顶部的唯一方法是在滚动时将页面 body 隐藏 100 毫秒。使用 jQuery:

$("body").hide();
window.scrollTo(0, 0);
setTimeout(function() $("body").show() , 100);

【讨论】:

【参考方案8】:

尝试使用 jQuery 的 .animate 方法:

$('.div').animate( scrollTo: x; );

其中 x 等于要滚动到顶部的 div 的位置。

【讨论】:

最初也尝试过,但这不起作用。我认为 jQuery(不要强迫我)正在使用底层的 javascript .scrollTop 方法,但只是通过位置来为滚动设置动画。 其实是这样的:$('.div').animate( scrollTop: x );【参考方案9】:

你试过了吗?

$("html").scrollTop(0);

【讨论】:

是的,这就是小提琴中使用的方法,并在第一篇文章的描述中讨论过。【参考方案10】:
jQuery(document).ready(function($) 

$(".scroll").click(function(event)     
    event.preventDefault();
    $('html,body').animate(scrollTop:$(this.hash).offset().top, 1500);
);
);

<a href="#top" class="scroll"></a>

【讨论】:

【参考方案11】:

使用以下代码:

$("body").animate(  scrollTop: 50,  ,  800,  function()
    $("body").clearQueue();
 );

【讨论】:

【参考方案12】:

这些解决方案对我不起作用。我知道有人提到了移动检测,但他们的方法对我不起作用。我终于意识到使用移动检测为每种情况提供两种不同的 CSS 样式。也许不理想,但它肯定有效。上面还建议用 js 临时更改样式对我不起作用。

我有一个带有独立滚动 div 的两列布局,每个设置为溢出:滚动,主体必须设置为溢出:隐藏。我需要在其中一列上使用 scrollTop 并且没有解决方案。

我使用了 wp_is_mobile()(Wordpress 函数),如果 mobile 为真,overflow:hidden 将从 body 中删除,并且带有 overflow:scroll 的 div 已删除该 css。最后,scrollTop 在移动设备上工作了。

【讨论】:

【参考方案13】:

  
$(document).ready(function ()
  $(window).scroll(function()
        if($(this).scrollTop() > 100)
            $('.scrollup').fadeIn();
         
        else
            $('.scrollup').fadeOut();
        
    );
  
  $('.scrollup').click(function()
    if (navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/))            
      window.scrollTo(0,0);
    
    else
      $('html,body').animate(
        scrollTop: 0
        , 500, function()
        $('html,body').clearQueue();
      );
    
  );              
);
body
  height: 1500px;


.scrollup 
    bottom: 135px;
    height: 40px;
    width: 40px;
    display: none;
    background: #000;
    border: 2px solid #fff;
    border-radius: 100%;
    box-shadow: 1px 3px 5px #000;
    text-align: center;
    font-size: 25px;
    color: #fff;
    cursor: pointer;
    position: fixed;
    right: 12px;
    line-height: 36px;
    z-index: 25;


svg
  fill: #fff;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="scrollup">
    <svg  viewBox="0 0 512 512" >
        <polygon points="396.6,352 416,331.3 256,160 96,331.3 115.3,352 256,201.5 "/>
    </svg>
</div>

【讨论】:

虽然这段代码可能会解决问题,包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit你的答案添加解释。 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案14】:

我也遇到了同样的问题,改用 jquery .offset() 解决了。

http://api.jquery.com/offset/

$('#yourFineElement').offset( top: X, left Y));

【讨论】:

这将杀死整个布局,因为它将滚动 DIV 本身定位在屏幕上(不影响其滚动位置)。

以上是关于jQuery scrollTop() 在移动浏览器上滚动 DIV 时不起作用,替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-jquery scrollTop怎么解决所有浏览器兼容问题

jquery中的scrollTop控制浏览器的滚动条

使用动画链(jQuery)在 Ipad 上的 ScrollLeft 和 ScrollTop

$(document).height()$(document).scrollTop()

jQuery动画效果animate和scrollTop结合使用实例

jquery获取滚动条高度和位置