Verhindern Sie ein "Überschreiben" der Webseite

104

In Chrome für Mac kann man eine Seite "überschreiben" (mangels eines besseren Wortes), wie im folgenden Screenshot gezeigt, um zu sehen, was dahinter steckt, ähnlich wie beim iPad oder iPhone.

Ich habe festgestellt, dass einige Seiten deaktiviert sind, z. B. Google Mail und die Seite "Neuer Tab".

Wie kann ich "Overscrolling" deaktivieren? Gibt es andere Möglichkeiten, wie ich "Overscrolling" steuern kann?

Geben Sie hier die Bildbeschreibung ein

Zufälliges Blau
quelle
1
Ich versuche tatsächlich, es zum Beispiel auf der Newtab-Seite zu aktivieren . Ich versuche, die hier auftretenden Probleme zu verstehen.
Randomblue
Ich glaube nicht, dass es einen Weg gibt, das zu tun. Es ist ganz einfach, dass die Seite lang genug ist, damit der Scroller gestartet werden kann. Erwägen Sie auch, den Titel Ihres Beitrags so zu ändern, wie Sie es möchten, anstatt das Gegenteil.
Jon Egeland

Antworten:

164

Die akzeptierte Lösung funktionierte bei mir nicht. Der einzige Weg, wie ich es zum Laufen gebracht habe, während ich noch scrollen konnte, ist:

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

body {
    height: 100%;
    overflow: auto;
}
Florian Feldhaus
quelle
2
Diese Lösung ist sowohl für Geräte problematisch, die den htmlStyling-Hack nicht respektieren, als auch für mobile Webbrowser, die den vollständigen Überlauf der bodyNichtbeachtung der eingestellten Höhe betrachten html.
Runspired
5
Diese Lösung funktioniert ab Chrome 46 für Mac nicht mehr. Es verhindert ein Über-Scrollen, aber keines der untergeordneten Elemente kann gescrollt werden.
Daniel Bonnell
1
Wie können Sie dann den scrollTop-Wert erhalten, mit dem Sie normalerweise arbeiten würden $(window).scrollTop?
Guig
1
Keine der beiden Lösungen funktioniert für mich unter Chrome 49 für Mac oder Firefox 44 für Mac. window.scrollYist immer 0.
Momo
3
Funktioniert für Chrome, aber nicht für Safari.
Bretton Wade
60

In Chrome 63+, Firefox 59+ und Opera 50+ können Sie dies in CSS tun:

body {
  overscroll-behavior-y: none;
}

Dadurch wird der im Screenshot der Frage gezeigte Gummibandeffekt unter iOS deaktiviert. Es deaktiviert jedoch auch Pull-to-Refresh, Glow-Effekte und Scroll-Verkettung.

Sie können jedoch beim Überblättern Ihren eigenen Effekt oder Ihre eigene Funktionalität implementieren. Wenn Sie beispielsweise die Seite verwischen und eine übersichtliche Animation hinzufügen möchten:

<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>

Browser-Unterstützung

Zum jetzigen Zeitpunkt unterstützen Chrome 63+, Firefox 59+ und Opera 50+ dies. Edge hat es öffentlich unterstützt, während Safari unbekannt ist. Verfolgen Sie hier den Fortschritt und die aktuelle Browserkompatibilität in der MDN-Dokumentation

Mehr Informationen

Koslun
quelle
3
Dies ist meiner Meinung nach die beste Lösung. Und einfach. Der mit all den positiven Stimmen kann problematisch sein.
TheTC
1
Dieser hat gut für mich funktioniert.
Rajilesh Panoli
38

Eine Möglichkeit, dies zu verhindern, ist die Verwendung des folgenden CSS:

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

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

Auf diese Weise hat der Körper nie einen Überlauf und "springt" nicht, wenn Sie oben und unten auf der Seite scrollen. Der Container wird seinen Inhalt perfekt scrollen. Dies funktioniert in Safari und in Chrome.

Bearbeiten

Warum das Extra- <div>Element als Wrapper nützlich sein könnte:
Die Lösung von Florian Feldhaus verwendet etwas weniger Code und funktioniert auch einwandfrei. Es kann jedoch eine kleine Eigenart haben, wenn es um Inhalte geht, die die Breite des Ansichtsfensters überschreiten. In diesem Fall wird die Bildlaufleiste am unteren Rand des Fensters zur Hälfte aus dem Ansichtsfenster verschoben und ist schwer zu erkennen / zu erreichen. Dies kann bei Bedarf vermieden werden body { margin: 0; }. In Situationen, in denen Sie dieses CSS nicht hinzufügen können, ist das Wrapper-Element hilfreich, da die Bildlaufleiste immer vollständig sichtbar ist.

Unten finden Sie einen Screenshot: Geben Sie hier die Bildbeschreibung ein

insertusernamehere
quelle
3
Wenn dies einmal funktioniert hat, funktioniert es nicht mehr. In meinem Chrome v37 tritt das Überrollverhalten überall dort auf, wo ein Element gescrollt wird.
Bbsimonbb
@ user1585345 Ich habe dies jetzt in Chrome 38 unter OS X erneut getestet und es funktioniert immer noch (auch in Safari). Hier ist die Datei, die ich verwende. Können Sie es mit dieser Datei testen? Direkter Link zur Datei auf sendspace.com .
Insertusernamehere
1
Ich habe mit der obigen Datei getestet und habe immer noch den Sprung. Ich vermute, wir werden diesem Rätsel nicht auf den Grund gehen. Chrome 37
bbsimonbb
Sie sollten den zusätzlichen Wrapper Div nicht benötigen. Überprüfen Sie die folgende Antwort für eine bessere Lösung.
JayD3e
1
Diese Lösung funktioniert ab Chrome 46 für Mac nicht mehr. Es verhindert ein Über-Scrollen, aber keines der untergeordneten Elemente kann gescrollt werden.
Daniel Bonnell
2

Mit diesem Code können Sie touchmovevordefinierte Aktionen entfernen :

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);
Daniel Prol
quelle
2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}
Cormorano71
quelle
4
Während dies die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort und möglicherweise das Problem mit dem OP-Code zu erklären.
Pirho
Ihre Antwort wurde aufgrund ihrer Länge und ihres Inhalts markiert. Ich schlage vor, zu überarbeiten. Fügen Sie möglicherweise zusätzliche Details hinzu.
www139
1
position: fixedist der Retter!
Nizamil Putra
1

Versuchen Sie es auf diese Weise

body {
    height: 100vh;
    background-size: cover;
    overflow: hidden;
}
Moldawisches Herz
quelle
0

position: absolutefunktioniert bei mir. Ich habe auf Chrome 50.0.2661.75 (64-bit)und OSX getestet .

body {
  overflow: hidden;
}

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

Der Bounce-Effekt kann nur deaktiviert werden, wenn die Höhe der Webseite gleich window.innerHeightist. Sie können Ihre Unterelemente scrollen lassen.

html {
    overflow: hidden;
}
Yibo
quelle