移动溢出:滚动和溢出滚动:触摸//阻止视口“反弹”

时间:2013-03-31 17:44:04

标签: mobile-safari overflow viewport

在手机上(狩猎,网页浏览,无论在哪里),overflow:scrolloverflow-scrolling: touch都会给你一个非常流畅的卷轴,这很酷。

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

有没有办法防止它发生? 非常感谢您的帮助/提示/回复

that kind of suxx

5 个答案:

答案 0 :(得分:19)

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

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中向上滚动时 - 它会向上滚动页面而不是向上滚动并在页面顶部产生反弹效果。我想你的问题是如何摆脱这个问题?

为了解决这个问题,作者建议您使用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

答案 1 :(得分:9)

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

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

如果您打算在iPhone 5上将其作为全屏应用程序运行,请将高度修改为1136px(当apple-mobile-web-app-status-bar-style设置为'black-translucent'或1096px时设为'黑色')。 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>

答案 2 :(得分:1)

你可以尝试

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

必要时添加

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

请注意,除#div

外,所有内容都已修复

答案 3 :(得分:0)

body {
  position: fixed;
  height: 100%;
}

答案 4 :(得分:0)

此答案似乎已经过时,无法适应当今的单页应用程序。就我而言,我找到了解决方法,谢谢this aricle  提出了一个简单而有效的解决方案:

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

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