ipad safari:禁用滚动和弹跳效果?

Ada*_*dam 119 scroll mobile-safari bounce ipad

我正在开发一个基于浏览器的应用程序,目前我正在为ipad safari浏览器开发和设计样式.

我在ipad上寻找两件事:如何禁用不需要它的页面的垂直滚动?如何禁用弹性反弹效果?

Osk*_*ard 156

此答案不再适用,除非您正在开发一个非常旧的iOS设备...请参阅其他解决方案


2011答案:对于在iOS Safari中运行的web/html应用程序,你需要类似的东西

document.ontouchmove = function(event){
    event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)

对于iOS 5,您可能需要考虑以下因素:document.ontouchmove和在iOS 5上滚动

2014年9月更新:可以在此处找到更全面的方法:https://github.com/luster-io/prevent-overscroll.为此以及大量有用的webapp建议,请参阅http://www.luster.io/blog/9-29-14-mobile-web-checklist.html

2016年3月更新:最后一个链接不再有效 - 请参阅https://web.archive.org/web/20151103001838/http://www.luster.io/blog/9-29-14-mobile-web-checklist .html代替归档版本.谢谢@falsarella指出这一点.

  • 那么只是禁用反弹效果......? (7认同)
  • 这种方法的问题是,你的dom中的可滚动div不再滚动了.根据你的dom设置,有很多方法可以解决这个问题. (6认同)
  • 这里有很多人在使用这个问题时询问滚动div,以便使这些div可滚动,添加`onTouchMove:function(e){e.stopPropagation(); e.stopImmediatePropagation(); 这将阻止事件击中身体,但身体将保持无弹性.编辑:假设你设置$('div').on('touchmove',... onTouchMove); (3认同)

Ben*_*Bos 107

您还可以将body/html的位置更改为fixed:

body,
html {
  position: fixed;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想放置一个位置的东西:绝对并且所有边都设置为0(制作一个全屏div),则不起作用 - 你的整个文档缩小为空. (7认同)
  • 当我使用它时页面会跳回到页面顶部然后我专注于输入.你知道这个方法吗? (4认同)
  • 到目前为止我见过的最佳方式 (3认同)
  • 实际上,这在iPad iOS 8.2 Safari上效果很好。没有反弹效果了。 (2认同)
  • @riv 添加宽度:100%;height: 100% to body 和 html 帮助了我。 (2认同)

小智 47

要防止在现代移动浏览器上滚动,您需要添加被动:false.在找到这个解决方案之前,我一直在拉我的头发.我只在互联网上的另一个地方发现了这一点.

function preventDefault(e){
    e.preventDefault();
}

function disableScroll(){
    document.body.addEventListener('touchmove', preventDefault, { passive: false });
}
function enableScroll(){
    document.body.removeEventListener('touchmove', preventDefault);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想禁用所有类型的滚动,这非常有用。但是,如果我只想禁用主体上的滚动并保留使用“overflow-y:scroll”在元素上滚动的可能性,该怎么办?例如,具有比身体更高的视图高度的模态。 (8认同)
  • 这是正确的答案.你可以在这里看到的解释:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener后的Chrome 54 touchmove拖欠被动为真,这意味着的preventDefault通话将被忽略.这就是你必须通过{passive:false}的原因,因此不会忽略preventDefault调用. (6认同)
  • 没有`{被动:假}`肯定是行不通的!欢迎使用StackOverflow花花公子 (5认同)
  • removeEventListener不接受被动:false (3认同)
  • 感谢您提供此解决方案! (2认同)
  • 您在 JS 中声明该函数 - 但如何在元素上调用该函数,使其按建议工作? (2认同)

aga*_*ggi 9

iOS 16 现在支持CSS。overscroll-behavior如果您的目标是 > iOS 16 设备,为了防止弹性弹跳效果,请将以下 CSS 添加到 html 根目录

html {
  overscroll-behavior: none;
}
Run Code Online (Sandbox Code Playgroud)

请注意,提供的解决方案仅在内容大于视口时禁用弹性反弹效果。

如果您还想完全禁用 iOS 设备上主页的滚动,请使用

html body {
   overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*ati 7

您可以使用此jQuery代码段执行此操作:

$(document).bind(
      'touchmove',
          function(e) {
            e.preventDefault();
          }
);
Run Code Online (Sandbox Code Playgroud)

这将阻止垂直滚动以及页面上发生的任何反弹效果.

  • 这不是Javascript,它是jQuery.你应该提到的是,并非每个人都在使用该框架. (10认同)
  • @inta只是说这实际上是javascript.这不是纯粹的JavaScript. (4认同)

use*_*584 5

overflow: scroll;
-webkit-overflow-scrolling: touch;
Run Code Online (Sandbox Code Playgroud)

在容器上,您可以在元素内部设置反弹效果

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