Impedisce lo "scorrimento eccessivo" della pagina web


105

In Chrome per Mac, si può "scorrere" una pagina (in mancanza di una parola migliore), come mostrato nello screenshot qui sotto, per vedere "cosa c'è dietro", simile all'iPad o all'iPhone.

Ho notato che alcune pagine lo hanno disabilitato, come Gmail e la pagina "nuova scheda".

Come posso disabilitare l '"overscrolling"? Ci sono altri modi in cui posso controllare lo "overscrolling"?

inserisci qui la descrizione dell'immagine


1
In realtà sto cercando di abilitarlo nella pagina newtab, per esempio. Cercando di capire le questioni coinvolte qui.
Randomblue

Non credo che ci sia un modo per farlo. È semplice che la pagina sia abbastanza lunga da consentire l'avvio dello scroller. Inoltre, valuta la possibilità di modificare il titolo del tuo post con quello che vorresti ottenere invece del contrario.
Jon Egeland

Risposte:


164

La soluzione accettata non funzionava per me. L'unico modo per farlo funzionare pur essendo ancora in grado di scorrere è:

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

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

2
Questa soluzione è problematica sia per i dispositivi che non rispettano lo htmlstyling hack, sia per i browser web mobili che guardano al trabocco completo bodyignorando l'altezza a cui è htmlstata impostata.
runspired

5
Questa soluzione non funziona a partire da Chrome 46 per Mac. Impedisce lo scorrimento eccessivo ma nessuno degli elementi figlio è scorrevole.
Daniel Bonnell

1
Quindi, come puoi ottenere il valore scrollTop che di solito ottieni $(window).scrollTop?
Guig

1
Nessuna delle due soluzioni funziona per me su Chrome 49 per mac o Firefox 44 per mac. window.scrollYè sempre 0.
momo

3
Funziona per Chrome, ma non per Safari.
Bretton Wade

61

In Chrome 63+, Firefox 59+ e Opera 50+ puoi farlo in CSS:

body {
  overscroll-behavior-y: none;
}

Questo disabilita l'effetto elastico su iOS mostrato nello screenshot della domanda. Tuttavia, disabilita anche gli effetti pull-to-refresh, bagliore e scorrimento concatenato.

È tuttavia possibile scegliere di implementare il proprio effetto o funzionalità durante lo scorrimento eccessivo. Se ad esempio desideri sfocare la pagina e aggiungere un'animazione pulita:

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

Supporto browser

Al momento della stesura di questo articolo, Chrome 63+, Firefox 59+ e Opera 50+ lo supportano. Edge lo ha supportato pubblicamente mentre Safari è uno sconosciuto. Tieni traccia dei progressi qui e della compatibilità del browser corrente nella documentazione MDN

Maggiori informazioni


3
Questa è la soluzione migliore, secondo me. E semplice. Quello con tutti i voti positivi può essere problematico.
TheTC

38

Un modo per evitarlo è utilizzare il seguente CSS:

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

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

In questo modo il corpo non avrà mai alcun trabocco e non "rimbalzerà" durante lo scorrimento in alto e in basso della pagina. Il contenitore scorrerà perfettamente il suo contenuto all'interno. Funziona in Safari e in Chrome.

modificare

Perché l' <div>elemento extra come wrapper potrebbe essere utile:
la soluzione di Florian Feldhaus usa un po 'meno codice e funziona anche bene. Tuttavia, può avere un piccolo capriccio, quando si tratta di contenuti che superano la larghezza del viewport. In questo caso la barra di scorrimento nella parte inferiore della finestra viene spostata fuori dalla finestra a metà ed è difficile da riconoscere / raggiungere. Questo può essere evitato usando body { margin: 0; }se adatto. In situazioni in cui non è possibile aggiungere questo CSS l'elemento wrapper è utile in quanto la barra di scorrimento è sempre completamente visibile.

Trova uno screenshot qui sotto: inserisci qui la descrizione dell'immagine


3
Se ha funzionato una volta, non funziona più. Nel mio Chrome v37, il comportamento di overscoll avverrà ovunque un elemento scorre.
bbsimonbb

@ user1585345 L'ho provato in questo momento in Chrome 38 di nuovo su OS X e funziona ancora (anche in Safari). Ecco il file che sto usando. Puoi testarlo con questo file? Collegamento diretto al file su sendpace.com .
inserirenomeutentequi

1
Ho provato con il file sopra e ho ancora il rimbalzo. Sospetto che non andremo a fondo di questo mistero. Chrome 37
bbsimonbb

Non dovresti aver bisogno del div wrapper extra. Controlla la risposta di seguito per una soluzione migliore.
JayD3e

1
Questa soluzione non funziona a partire da Chrome 46 per Mac. Impedisce lo scorrimento eccessivo ma nessuno degli elementi figlio è scorrevole.
Daniel Bonnell

2

È possibile utilizzare questo codice per rimuovere l' touchmoveazione predefinita:

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
Sebbene questo possa rispondere alla domanda, è meglio spiegare le parti essenziali della risposta e possibilmente qual era il problema con il codice OP.
pirho

La tua risposta è stata contrassegnata a causa della lunghezza e del contenuto. Suggerisco di rivedere. Forse aggiungi ulteriori dettagli.
www139

1
position: fixedè il salvatore!
Nizamil Putra

1

Prova in questo modo

body {
    height: 100vh;
    background-size: cover;
    overflow: hidden;
}

0

position: absoluteper me va bene. Ho provato su Chrome 50.0.2661.75 (64-bit)e OSX.

body {
  overflow: hidden;
}

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

0

L'effetto rimbalzo non può essere disabilitato tranne che l'altezza della pagina web è uguale a window.innerHeight, puoi far scorrere i tuoi sottoelementi.

html {
    overflow: hidden;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.