Evitar el "desplazamiento excesivo" de la página web

104

En Chrome para Mac, uno puede "desplazarse demasiado" por una página (a falta de una palabra mejor), como se muestra en la captura de pantalla a continuación, para ver "qué hay detrás", similar al iPad o iPhone.

He notado que algunas páginas lo tienen deshabilitado, como Gmail y la página "Nueva pestaña".

¿Cómo puedo desactivar el "desplazamiento excesivo"? ¿Hay otras formas de controlar el "desplazamiento excesivo"?

ingrese la descripción de la imagen aquí

Randomblue
fuente
1
De hecho, estoy tratando de habilitarlo en la página de nueva pestaña, por ejemplo. Tratando de comprender los problemas involucrados aquí.
Randomblue
No creo que haya una forma de hacer eso. Es una simple cuestión de que la página sea lo suficientemente larga para permitir que se inicie el desplazador. Además, considere cambiar el título de su publicación a lo que le gustaría lograr en lugar de lo contrario.
Jon Egeland

Respuestas:

164

La solución aceptada no me funcionó. La única forma en que lo hice funcionar sin dejar de poder desplazarme es:

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

body {
    height: 100%;
    overflow: auto;
}
Florian Feldhaus
fuente
2
Esta solución es problemática tanto para los dispositivos que no respetan el htmltruco de estilo como para los navegadores web móviles que observan el desbordamiento completo de bodyignorar la altura a la que htmlse estableció.
expiró el
5
Esta solución no funciona a partir de Chrome 46 para Mac. Evita el desplazamiento excesivo, pero ninguno de los elementos secundarios se puede desplazar.
Daniel Bonnell
1
Entonces, ¿cómo puede obtener el valor scrollTop con el que normalmente obtendría $(window).scrollTop?
Guig
1
Ninguna solución me funciona en Chrome 49 para mac o Firefox 44 para mac. window.scrollYes siempre 0.
momo
3
Funciona para Chrome, pero no para Safari.
Bretton Wade
60

En Chrome 63+, Firefox 59+ y Opera 50+ puedes hacer esto en CSS:

body {
  overscroll-behavior-y: none;
}

Esto desactiva el efecto de goma elástica en iOS que se muestra en la captura de pantalla de la pregunta. Sin embargo, también deshabilita la función de extracción para actualizar, los efectos de brillo y el encadenamiento de desplazamiento.

Sin embargo, puede optar por implementar su propio efecto o funcionalidad al realizar el desplazamiento excesivo. Si, por ejemplo, desea difuminar la página y agregar una animación ordenada:

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

Soporte del navegador

En el momento de escribir estas líneas, Chrome 63+, Firefox 59+ y Opera 50+ lo admiten. Edge lo apoyó públicamente, mientras que Safari es un desconocido. Siga el progreso aquí y la compatibilidad actual del navegador en la documentación de MDN

Más información

Koslun
fuente
3
Esta es la mejor solución, en mi opinión. Y simple. El que tiene todos los votos a favor puede ser problemático.
TheTC
1
Este funcionó bien para mí.
Rajilesh Panoli
38

Una forma de evitar esto es utilizando el siguiente CSS:

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

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

De esta forma, el cuerpo nunca se desbordará y no "rebotará" al desplazarse por la parte superior e inferior de la página. El contenedor desplazará perfectamente su contenido dentro. Esto funciona en Safari y Chrome.

Editar

Por qué el elemento adicional <div>como envoltorio podría ser útil:
la solución de Florian Feldhaus usa un poco menos de código y también funciona bien. Sin embargo, puede tener un poco de peculiaridad cuando se trata de contenido que excede el ancho de la ventana gráfica. En este caso, la barra de desplazamiento en la parte inferior de la ventana se mueve fuera de la ventana gráfica hasta la mitad y es difícil de reconocer / alcanzar. Esto se puede evitar usar body { margin: 0; }si es adecuado. En una situación en la que no puede agregar este CSS, el elemento contenedor es útil ya que la barra de desplazamiento siempre está completamente visible.

Encuentre una captura de pantalla a continuación: ingrese la descripción de la imagen aquí

insertar nombre de usuario aquí
fuente
3
Si esto funcionó una vez, ya no funciona. En mi Chrome v37, el comportamiento de overcoll ocurrirá siempre que un elemento se desplace.
bbsimonbb
@ user1585345 He probado esto ahora mismo en Chrome 38 nuevamente en OS X y todavía funciona (también en Safari). Aquí está el archivo que estoy usando. ¿Puedes probarlo con este archivo? Enlace directo al archivo en sendpace.com .
insertusernamehere
1
Probé con el archivo anterior y todavía tengo el rebote. Sospecho que no llegaremos al fondo de este misterio. Chrome 37
bbsimonbb
No debería necesitar el div contenedor adicional. Verifique la respuesta a continuación para una mejor solución.
JayD3e
1
Esta solución no funciona a partir de Chrome 46 para Mac. Evita el desplazamiento excesivo, pero ninguno de los elementos secundarios se puede desplazar.
Daniel Bonnell
2

Puede utilizar este código para eliminar la touchmoveacción predefinida:

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);
Daniel Prol
fuente
2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}
Cormorano71
fuente
4
Si bien esto puede responder a la pregunta, es mejor explicar las partes esenciales de la respuesta y posiblemente cuál fue el problema con el código de OP.
pirho
Su respuesta fue marcada debido a su extensión y contenido. Sugiero revisar. Quizás agregue detalles adicionales.
www139
1
position: fixedes el salvador!
Nizamil Putra
1

Prueba de esta manera

body {
    height: 100vh;
    background-size: cover;
    overflow: hidden;
}
Corazón de Moldavia
fuente
0

position: absolutefunciona para mi. He probado en Chrome 50.0.2661.75 (64-bit)y OSX.

body {
  overflow: hidden;
}

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

El efecto de rebote no se puede deshabilitar excepto que la altura de la página web sea igual a window.innerHeight, puede dejar que sus subelementos se desplacen.

html {
    overflow: hidden;
}
Yibo
fuente