Webページの「オーバースクロール」を防止


104

Chrome for Macでは、下のスクリーンショットに示すように、ページを「わかりやすくする」ために「オーバースクロール」して、iPadまたはiPhoneと同様に「背後にあるもの」を確認できます。

Gmailや「新しいタブ」ページなど、一部のページで無効になっていることに気付きました。

「オーバースクロール」を無効にするにはどうすればよいですか?「オーバースクロール」を制御できる他の方法はありますか?

ここに画像の説明を入力してください


1
たとえば、私は実際それをnewtabページで有効にしようとしています。ここに含まれる問題を理解しようとしています。
Randomblue 2012

それを行う方法はないと思います。スクローラーが起動するのに十分な長さのページを持つことは簡単です。また、投稿のタイトルを、反対ではなく達成したいものに変更することを検討してください。
Jon Egeland 2012

回答:


164

受け入れられた解決策は私のために働いていませんでした。スクロールしながら、私がそれを機能させる唯一の方法は次のとおりです。

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

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

2
この解決策は、htmlスタイリングハックを尊重しない両方のデバイスと、設定bodyされた高さに関係なくフルオーバーフローを見るモバイルWebブラウザーの両方に問題がありますhtml
runspired、2015

5
このソリューションはChrome 46 for Macでは機能しません。オーバースクロールを防ぎますが、子要素はスクロールできません。
Daniel Bonnell

1
次に、通常取得するscrollTop値をどのように取得できます$(window).scrollTopか?
Guig

1
Mac版Chrome 49またはMac版Firefox 44では、どちらのソリューションも機能しません。window.scrollY常に0です。
momo

3
Chromeでは機能しますが、Safariでは機能しません。
Bretton Wade

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以降でサポートされています。Safariは不明ですが、Edgeはそれを公的にサポートしています。ここで進捗状況と現在のブラウザーの互換性をMDNドキュメントで追跡する

詳しくは


3
これは私の意見では最良の解決策です。そしてシンプル。すべての賛成票がある場合、問題が発生する可能性があります。
TheTC、

1
これは私にはうまくいきました。
Rajilesh Panoli

38

これを防ぐ1つの方法は、次のCSSを使用することです。

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

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

このようにして、本文がオーバーフローすることはなく、ページの上下でスクロールしても「バウンス」しません。コンテナは、コンテンツを完全にスクロールします。これはSafariとChromeで機能します。

編集する

<div>ラッパーとして余分な-elementが役立つ理由:
Florian Feldhausのソリューションはわずかに少ないコードを使用し、うまく機能します。ただし、ビューポートの幅を超えるコンテンツに関しては、少し癖があります。この場合、ウィンドウの下部にあるスクロールバーがビューポートから途中まで移動し、認識/到達が困難になります。これはbody { margin: 0; }、必要に応じて使用することで回避できます。このCSSを追加できない状況では、スクロールバーが常に完全に表示されるため、ラッパー要素が役立ちます。

以下のスクリーンショットを見つけてください: ここに画像の説明を入力してください


3
これが一度機能した場合、機能しなくなります。私のChrome v37では、要素がスクロールされると、overscoll動作が発生します。
bbsimonbb 2014年

@ user1585345私はこれをOS XのChrome 38で今すぐテストしましたが、それでも動作します(これもSafariで)。これが私が使っているファイルです。このファイルでテストできますか?sendspace.com上のファイルへの直接リンク
insertusernamehere 2014年

1
上記のファイルでテストしましたが、まだバウンスしています。私たちはこの謎の底に到達しないと思います。Chrome 37
bbsimonbb 2014年

追加のラッパーdivは必要ありません。より良い解決策については、以下の回答を確認してください。
JayD3e 2015年

1
このソリューションはChrome 46 for Macでは機能しません。オーバースクロールを防ぎますが、子要素はスクロールできません。
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コードの問題点を説明する方が良いでしょう。
ピロー2017

あなたの回答は、その長さと内容のためにフラグが付けられました。改定をお勧めします。おそらく、さらに詳細を追加します。
www139

1
position: fixed救い主です!
ニザミルプトラ


0

position: absolute私のために働く。Chrome 50.0.2661.75 (64-bit)OSXでテストしました。

body {
  overflow: hidden;
}

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

0

Webページの高さがに等しい場合を除き、バウンス効果を無効にすることはできませんwindow.innerHeight。サブ要素をスクロールさせることができます。

html {
    overflow: hidden;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.