【问题标题】:iOS overflow-x (or position absolute) makes scrolling choppy?iOS 溢出-x(或绝对位置)使滚动不连贯?
【发布时间】:2012-10-11 18:08:47
【问题描述】:

我希望我的网页只能垂直滚动。所以我将overflow-x:hidden; 设置为我的.page-wrapper。我的.page-wrapper 将两个绝对定位的图层叠加在一起。单击按钮时,顶层会滑动到一侧(如 position:absolute; 所述),并使网站实际上比 100% 视口宽度更宽 - 所以它可以水平滚动。

为了防止水平滚动,我将overflow-x:hidden 设置为我的.page-wrapper

如果我这样做,我的正常内容的垂直滚动确实有问题并且无法正常工作。

有什么办法解决这个问题吗?

更新

-webkit-overflow-scrolling: touch; 似乎工作正常,只要没有 javascript 改变任何高度。请参阅以下示例。我在这里所做的是将主体的高度更新为第二层的内容高度 - 因此,一旦上层向左滑动,就没有空的滚动空间。将上层向后滑动时,我从主体中删除了属性style(设置高度)。这样做之后,滚动再次波涛汹涌。

function showInfos(show) {

    if ( show ) {
        $('#videos').addClass('slid');
        $('body').height($('#infos > .content').height());
        $('#page-wrap').addClass('no-overflow');
    } else if ( !show ) {
        $('#videos').removeClass('slid');
        $('#page-wrap').removeClass('no-overflow');
        $('body').removeAttr('style');
    }
}

【问题讨论】:

  • 将高度设置为 100%。然后你可以将溢出设置为自动
  • 我已经将我的身体和元素的高度设置为100%,但这不是我的意思。页面仍然比视口宽,因此它也可以自动水平滚动。我只是不希望这种情况发生。我不希望我的网站上有任何水平滚动(因为我正在通过 javascript 进行滑动和其他手势)。这就是为什么我认为我可以简单地设置overflox-x:hidden 这样这个问题就可以解决了——而且确实如此——但是下一个问题就是垂直滚动不连贯。
  • 此外,我刚刚对此进行了测试,甚至overlow:auto 也使滚动不稳定——在本例中为 x 方向和 y 方向。

标签: iphone ios css scroll


【解决方案1】:

尝试将其应用于每个元素:

* {
  -webkit-overflow-scrolling: touch;
}

【讨论】:

  • 我不知道为什么有人给这个答案-1..它直接解决了我的问题。 +1
  • 确实是:),你不应该将它设置为所有元素。这就是为什么我猜它得到-1。
  • 它帮助我将此添加到body
  • 我同意这也解决了我的问题。但是,我不明白为什么有必要将它添加到每个元素中,为什么它不是默认情况?我的意思是,如果 iOS 有这么多问题,为什么即使它不是可滚动元素也需要分配此属性?
  • 是的,但根据developer.mozilla.org/en-US/docs/Web/CSS/…,此属性仅在 safari 中受支持
【解决方案2】:

您可以尝试在.page-wrapper 上设置width:100% 并将其设置为overflow:hiddenposition:relative。这可能会阻止水平滚动。

2012 年 10 月 12 日更新

感谢代码示例。它确实帮助我更清楚地了解您的意图和滚动问题。看起来你需要-webkit-overflow-scrolling。将-webkit-overflow-scrolling: touch; 添加到page-wrapper。这是应用了该规则的 [更新的测试页面]。您可以在我下面的评论中与测试页进行比较,看看有什么不同。

【讨论】:

  • 我确实已经width:100%.page-wrapperoverflow-x:hidden 也设置为 .page-wrapper -> 上面提到的所有内容。甚至position:relative 设置为.page-wrapper,因为.page-wrapper 内部的层绝对定位在.page-wrapper 内。首先,当应用overflow:hidden 时,我不能再垂直滚动了——我需要垂直滚动,但根本不想要任何水平滚动。
  • 有趣。我提出了little test page。这与您尝试做的事情一致吗?在我的示例中可以进行垂直滚动,但在桌面浏览器(FF 和 Chrome)上,滚动条不会以小窗口宽度显示。如果这不是目标,您可以发布您正在进行的工作或测试用例,看看是否有其他原因导致问题?
【解决方案3】:

这为我完成了这项工作,因此它在任何页面上都不是问题:

html {
  -webkit-overflow-scrolling: touch;
}

【讨论】:

    【解决方案4】:

    所以我在 Bootstrap 4.5 模板上遇到了这个问题:每当我添加 'overflow-x:hidden;'到 .page-wrapper 后,iPhone 上的滚动不再流畅,而是断断续续。

    但是当我删除 'overflow-x:hidden;'来自 .page-wrapper,在 iPad 上,用户可以水平移动页面,这是不希望的。

    Tim 的解决方案是一个很好的方向,对我来说最小的解决方案是在我的 CSS 文件中添加这两个部分:

    在 CSS 的顶部:

    html, body {width:100%; height:100%;}
    

    在 CSS 中:

    .page-wrapper { 
    /** overflow-x: hidden; GIVES ISSUES WITH IPHONE!!! **/
    
        width:100%; 
        height:100%;
        
        position:relative; 
        overflow-x:hidden; 
        -webkit-overflow-scrolling:touch;
    }
    

    别忘了放入 index.html:

    <META name='viewport' content='width=device-width, initial-scale=1.0, shrink-to-fit=no'>
    

    【讨论】:

      【解决方案5】:

      TLDR;将transform: translate3d(0px,0px,0px) 应用于元素和包装器。

      在我的例子中,一个绝对或固定位置的元素通过较小的 z-index 隐藏在主页后面。结果是,当包装器移开以使元素陶醉,然后移回时,在 iOS 上,尝试滚动该元素所在的位置时会出现延迟。我可以滚动,但我必须按住大约一秒钟。

      这里描述的解决方案对我有用: https://css-tricks.com/forums/topic/mobile-safari-iphone-issue-with-position-fixed-content-running-over-the-top/

      基本上,元素和元素的包装器都需要应用transform: translate3d(0px,0px,0px) 样式,然后滚动顺利进行。对我来说,如果不对元素和包装器都应用它,修复不起作用。

      【讨论】:

      • 离题,但对于 15 秒的笑声,将 transform 应用于 *。在您能找到的最旧和最慢的设备上。看起来棒极了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多