防止网页“过度滚动”


104

在Mac专用的Chrome浏览器中,可以使页面“滚动”(由于缺少更好的用词),如下面的屏幕截图所示,以查看“后面是什么”,类似于iPad或iPhone。

我注意到有些页面已将其禁用,例如gmail和“新标签”页面。

如何禁用“过度滚动”?还有其他方法可以控制“过度滚动”吗?

在此处输入图片说明


1
例如,我实际上正在尝试在newtab页面上启用它。试图了解此处涉及的问题。
2012年

我认为没有办法做到这一点。这是一个简单的问题,即页面足够长以允许滚动器启动。另外,请考虑将帖子标题更改为您想要实现的目标,而不是相反。
乔恩·埃格兰

Answers:


164

公认的解决方案对我不起作用。我仍然可以滚动的同时让它工作的唯一方法是:

html {
    overflow: hidden;
    height: 100%;
}

body {
    height: 100%;
    overflow: auto;
}

2
对于不尊重html样式hack的两种设备,以及对于移动网络浏览器而言,这种解决方案都是成问题的,这些浏览器完全body忽略了html设置的高度。
2015年

5
从Mac的Chrome 46起,此解决方案不起作用。它可以防止过度滚动,但是所有子元素均不可滚动。
Daniel Bonnell

1
然后,如何获取通常使用的scrollTop值$(window).scrollTop
Guig '16

1
这两种解决方案都不适用于Mac的Chrome 49或Mac的Firefox 44。window.scrollY一直是0
momo

3
适用于Chrome,但不适用于Safari。
布雷顿韦德

60

在Chrome 63 +,Firefox 59+和Opera 50+中,您可以在CSS中执行以下操作:

body {
  overscroll-behavior-y: none;
}

这将禁用问题截图中所示的iOS上的橡皮筋效果。但是,它也禁用“拉动刷新”,“发光”效果和滚动链接。

但是,您可以选择在过度滚动时实现自己的效果或功能。例如,如果您想模糊页面并添加整洁的动画:

<style>
  body.refreshing #inbox {
    filter: blur(1px);
    touch-action: none; /* prevent scrolling */
  }
  body.refreshing .refresher {
    transform: translate3d(0,150%,0) scale(1);
    z-index: 1;
  }
  .refresher {
    --refresh-width: 55px;
    pointer-events: none;
    width: var(--refresh-width);
    height: var(--refresh-width);
    border-radius: 50%; 
    position: absolute;
    transition: all 300ms cubic-bezier(0,0,0.2,1);
    will-change: transform, opacity;
    ...
  }
</style>

<div class="refresher">
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
</div>

<section id="inbox"><!-- msgs --></section>

<script>
  let _startY;
  const inbox = document.querySelector('#inbox');

  inbox.addEventListener('touchstart', e => {
    _startY = e.touches[0].pageY;
  }, {passive: true});

  inbox.addEventListener('touchmove', e => {
    const y = e.touches[0].pageY;
    // Activate custom pull-to-refresh effects when at the top of the container
    // and user is scrolling up.
    if (document.scrollingElement.scrollTop === 0 && y > _startY &&
        !document.body.classList.contains('refreshing')) {
      // refresh inbox.
    }
  }, {passive: true});
</script>

浏览器支持

在撰写本文时,Chrome 63 +,Firefox 59+和Opera 50+支持它。Edge公开支持它,而Safari未知。在MDN文档中跟踪此处的进度和当前浏览器兼容性

更多信息


3
我认为这是最好的解决方案。很简单。具有所有支持的人可能会出现问题。
TheTC

1
这对我来说效果很好。
Rajilesh Panoli

38

一种防止这种情况的方法是使用以下CSS:

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

body > div {
    height: 100%;
    overflow: scroll;
    -webkit-overflow-scrolling: touch;
}

这样,主体在滚动页面的顶部和底部时不会溢出,也不会“反弹”。容器将在其中完美滚动其内容。这适用于Safari和Chrome。

编辑

为什么使用额外的<div>元素作为包装器可能有用:
Florian Feldhaus的解决方案使用的代码略少,并且效果很好。但是,当内容超出视口宽度时,可能会有一点古怪之处。在这种情况下,窗口底部的滚动条将从视口移出一半,并且很难识别/到达。body { margin: 0; }如果合适,可以避免使用。在无法添加此CSS的情况下,包装元素很有用,因为滚动条始终是完全可见的。

在下面找到屏幕截图: 在此处输入图片说明


3
如果这一次有效,它将不再起作用。在我的Chrome v37中,元素滚动的任何地方都会发生overscoll行为。
bbsimonbb 2014年

@ user1585345我现在已经在OS X的Chrome 38中再次测试了该功能,它仍然有效(在Safari中也是如此)。这是我正在使用的文件。你可以用这个文件测试吗?直接链接到sendspace.com上的文件
此处插入用户名,2014年

1
我已经测试了上面的文件,但仍然有跳动。我怀疑我们不会深入到这个谜底。Chrome 37
bbsimonbb

您不需要额外的包装div。检查以下答案,以获得更好的解决方案。
JayD3e 2015年

1
从Mac的Chrome 46起,此解决方案不起作用。它可以防止过度滚动,但是所有子元素均不可滚动。
Daniel Bonnell

2

您可以使用以下代码删除touchmove预定义的操作:

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);

2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}

4
虽然这可能会回答问题,但最好解释一下答案的基本部分,并可能解释OPs代码的问题所在。
pirho

您的答案已被标记,因为它的长度和内容。我建议修改。也许添加其他细节。
www139

1
position: fixed是救星!
尼扎米尔·普特拉18/09/17 '13


0

position: absolute为我工作。我已经在Chrome 50.0.2661.75 (64-bit)OSX和OSX 上进行了测试。

body {
  overflow: hidden;
}

// position is important
#element {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: auto;
}

0

除非网页高度等于window.innerHeight,否则无法禁用弹跳效果,您可以让子元素滚动。

html {
    overflow: hidden;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.