【问题标题】:Mobile overflow:scroll and overflow-scrolling: touch // prevent viewport "bounce"移动溢出:滚动和溢出滚动:触摸//防止视口“反弹”
【发布时间】:2013-03-21 21:06:24
【问题描述】:

在移动设备(Safari、webviews、任何地方)上,overflow:scrolloverflow-scrolling: touch 提供非常流畅的滚动,这很酷。

但是,它使页面“弹跳”(下面圈出的区域),当您不使用它时情况并非如此,但这会使体验不那么“原生”(更简单地说,就我而言可以有意见,绝对没用)

有没有办法防止它发生?

【问题讨论】:

标签: mobile-safari overflow viewport


【解决方案1】:

这里有一篇很棒的博客文章:

http://www.kylejlarson.com/blog/2011/fixed-elements-and-scrolling-divs-in-ios-5/

这里有一个演示:

http://www.kylejlarson.com/files/iosdemo/

总之,您可以在包含主要内容的 div 上使用以下内容:

.scrollable {
    position: absolute;
    top: 50px;
    left: 0;
    right: 0;
    bottom: 0;
    overflow: scroll;
    -webkit-overflow-scrolling: touch;
}

我认为您所描述的问题是,当您尝试在已经位于顶部的 div 内向上滚动时,它会向上滚动页面而不是向上滚动 div,并在页面顶部产生反弹效果.我想你的问题是问如何摆脱这个?

为了解决这个问题,作者建议你使用ScrollFix自动增加可滚动div的高度。

还值得注意的是,您可以使用以下内容来防止用户向上滚动,例如在导航元素中:

document.addEventListener('touchmove', function(event) {
   if(event.target.parentNode.className.indexOf('noBounce') != -1 
|| event.target.className.indexOf('noBounce') != -1 ) {
    event.preventDefault(); }
}, false);

不幸的是,ScrollFix 仍然存在一些问题(例如,使用表单字段时),但 ScrollFix 上的问题列表是寻找替代方案的好地方。 this issue 讨论了一些替代方法。

博文中还提到了其他替代方案,ScrollabilityiScroll

【讨论】:

  • 使用 iScroll 的问题是您没有使用本机滚动 - 这意味着 iScroll 的性能要差得多。我的解决方案是纯 CSS 解决方案,没有 JS 依赖。
  • 确定它在纯 css 中更好。但我无法让它工作。 kylejlarson 并没有真正使用 iscroll;只是一个简短的修复
  • 无论如何……这个镀铬的东西应该不是问题。讨厌这个苹果;即使这没什么大不了的
【解决方案2】:

我已经设法找到一种 CSS 解决方法来防止视口反弹。关键是将内容包装在 3 个 div 中,并对其应用 -webkit-touch-overflow:scroll。最终 div 的最小高度应为 101%。此外,您应该在 body 标签上明确设置固定宽度/高度,以表示您的设备尺寸。我在 body 上添加了一个红色背景,以表明它是现在弹跳的内容,而不是移动 safari 视口。

下面的源代码和这里是一个 plunker(这也已在 iOS7 GM 上测试过)。 http://embed.plnkr.co/NCOFoY/preview

如果您打算在 iPhone 5 上将其作为全屏应用程序运行,请将高度修改为 1136px(当 apple-mobile-web-app-status-bar-style 设置为 'black-translucent' 或 1096px 时设置为“黑色”)。考虑到移动 safari 的 chrome 后,视口的高度为 920x。

<!doctype html>
<html>

<head>
    <meta name="viewport" content="initial-scale=0.5,maximum-scale=0.5,minimum-scale=0.5,user-scalable=no" />
    <style>
        body { width: 640px; height: 920px; overflow: hidden; margin: 0; padding: 0; background: red; }
        .no-bounce { width: 100%; height: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; }
        .no-bounce > div { width: 100%; height: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; }
        .no-bounce > div > div { width: 100%; min-height: 101%; font-size: 30px; }
        p { display: block; height: 50px; }
    </style>
</head>

<body>

    <div class="no-bounce">
        <div>
            <div>
                <h1>Some title</h1>
                <p>item 1</p>
                <p>item 2</p>
                <p>item 3</p>
                <p>item 4</p>
                <p>item 5</p>
                <p>item 6</p>
                <p>item 7</p>
                <p>item 8</p>
                <p>item 9</p>
                <p>item 10</p>
                <p>item 11</p>
                <p>item 12</p>
                <p>item 13</p>
                <p>item 14</p>
                <p>item 15</p>
                <p>item 16</p>
                <p>item 17</p>
                <p>item 18</p>
                <p>item 19</p>
                <p>item 20</p>
            </div>
        </div>
    </div>

</body>

</html>

【讨论】:

  • 将“css”稍微更改为body { position: absolute; top: 0px; left: 0px; width: 640px; height: 100%; overflow: hidden; margin: 0; padding: 0; } 使其与设备无关。
  • 当我试图禁止滚动页面上专用 div 内的对象时,这对我不起作用。我不确定这是否可能。
【解决方案3】:

你可以试试

$('*').not('#div').bind('touchmove', false);

必要时添加

$('#div').bind('touchmove');

请注意,除了#div 之外的所有内容都是固定的

【讨论】:

  • 也许这个更好code$(document).bind("touchmove", function(e){ e.preventDefault(); }); $("#scrollable_div").on('touchmove', function (e) { e.stopPropagation(); });code
【解决方案4】:

这个答案似乎已经过时了,不适合现在的单页应用程序。就我而言,感谢this aricle,我找到了解决方案 这里提出了一个简单但有效的解决方案:

html,
body {
  position: fixed;
  overflow: hidden;
}

如果您的身体是滚动容器,则此解决方案不适用。

【讨论】:

    【解决方案5】:
    body {
      position: fixed;
      height: 100%;
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
    猜你喜欢
    • 2011-12-07
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多