Estoy usando el plugin scrollTo jQuery y me gustaría saber si de alguna manera es posible deshabilitar temporalmente el desplazamiento en el elemento de la ventana a través de Javascript. La razón por la que me gustaría deshabilitar el desplazamiento es que cuando te desplazas mientras scrollTo está animando, se pone realmente feo;)
Por supuesto, podría hacer un $("body").css("overflow", "hidden");
y luego volver a ponerlo en automático cuando la animación se detenga, pero sería mejor si la barra de desplazamiento todavía fuera visible pero inactiva.
javascript
jquery
scroll
Olivier Lalonde
fuente
fuente
Respuestas:
El
scroll
evento no puede ser cancelado. Pero puede hacerlo cancelando estos eventos de interacción:mouse y Touch scroll y botones asociados con el desplazamiento.
[ Demo de trabajo ]
ACTUALIZACIÓN: escritorio Chrome fijo y navegadores móviles modernos con oyentes pasivos
fuente
Hágalo simplemente agregando una clase al cuerpo:
Agregue la clase y luego elimine cuando desee volver a habilitar el desplazamiento, probado en IE, FF, Safari y Chrome.
Para dispositivos móviles , deberá manejar el
touchmove
evento:Y desvinculate para volver a habilitar el desplazamiento. Probado en iOS6 y Android 2.3.3
fuente
touchmove
evento, como con$('body').bind('touchmove', function(e){e.preventDefault()})
. Editó esta respuesta para incluir esta solución móvil.$('body,html')
Aquí hay una forma realmente básica de hacerlo:
Es un poco nervioso en IE6.
fuente
(0, 0)
, solo use la posición de desplazamiento actual.La siguiente solución es JavaScript básico pero puro (sin jQuery):
fuente
scroll-behavior: smooth
Bork esto. Además, no estoy de acuerdo con Oto diciendo que es culpa del navegador. Básicamente estás asumiendo que algo sucederá instantáneamente cuando en realidad es asíncronoEsta solución mantendrá la posición de desplazamiento actual mientras el desplazamiento esté deshabilitado, a diferencia de algunos que vuelven al usuario a la cima.
Se basa en la respuesta de galambalazs , pero con soporte para dispositivos táctiles, y se refactoriza como un solo objeto con jquery plugin wrapper.
Demostración aquí.
En github aquí.
fuente
mousewheel
funcionó deLamento responder una publicación anterior, pero estaba buscando una solución y encontré esta pregunta.
Hay muchas soluciones para que este problema muestre la barra de desplazamiento, como darle al contenedor una altura del 100% y un
overflow-y: scroll
estilo.En mi caso, acabo de crear un div con una barra de desplazamiento que visualizo mientras agrego
overflow: hidden
al cuerpo:La barra de desplazamiento del elemento debe tener estos estilos:
Esto muestra una barra de desplazamiento gris, espero que ayude a futuros visitantes.
fuente
Estaba buscando una solución a este problema, pero no estaba satisfecho con ninguna de las soluciones anteriores ( al momento de escribir esta respuesta ), así que se me ocurrió esta solución.
CSS
JS
fuente
overflow-y: scroll
al.scrollDisabled
estilo. De lo contrario, hubo un pequeño salto cuando la barra de desplazamiento se ocultó cada vez. Por supuesto, eso solo funciona para mí porque mi página es lo suficientemente larga como para necesitar una barra de desplazamiento incluso en las pantallas más grandes.Según la publicación de galambalazs , agregaría soporte para dispositivos táctiles, lo que nos permite tocar pero no desplazarnos hacia arriba o hacia abajo:
fuente
A partir de Chrome 56 y otros navegadores modernos, debe agregar
passive:false
a laaddEventListener
llamada para quepreventDefault
funcione. Así que uso esto para detener el desplazamiento en el móvil:fuente
No, no iría con el manejo de eventos porque:
no todos los eventos están garantizados para llegar al cuerpo,
seleccionar texto y moverse hacia abajo en realidad desplaza el documento,
si en la fase del evento, separar algo sale mal, estás condenado.
He mordido esto haciendo una acción de copiar y pegar con un área de texto oculta y adivina qué, la página se desplaza cada vez que hago una copia porque internamente tengo que seleccionar el área de texto antes de llamar
document.execCommand('copy')
.De todos modos, así es como me dirijo, fíjate en
setTimeout()
:Existe un impulso intermitente cuando las barras de desplazamiento desaparecen momentáneamente, pero es aceptable.
fuente
Dependiendo de lo que desee lograr con el desplazamiento eliminado, puede simplemente arreglar el elemento del que desea eliminar el desplazamiento (al hacer clic o cualquier otro activador que desee desactivar temporalmente el desplazamiento)
Estaba buscando una solución "temp no scroll" y para mis necesidades, esto lo resolvió
hacer una clase
luego con Jquery
Descubrí que esta era una solución lo suficientemente simple que funciona bien en todos los navegadores, y también es fácil de usar en dispositivos portátiles (es decir, iPhones, tabletas, etc.). Dado que el elemento está temporalmente arreglado, no hay desplazamiento :)
¡NOTA! Dependiendo de la ubicación de su elemento "contentContainer", es posible que deba ajustarlo desde la izquierda. Lo que se puede hacer fácilmente agregando un valor izquierdo css a ese elemento cuando la clase fija está activa
fuente
Otra solución:
De esta manera, siempre tiene una barra de desplazamiento vertical, pero como la mayoría de mi contenido es más largo que la ventana gráfica, esto está bien para mí. El contenido está centrado con un div separado, pero sin volver a establecer el margen en el cuerpo, mi contenido se quedaría a la izquierda.
Estas son las dos funciones que uso para mostrar mi ventana emergente / modal:
Resultado: fondo no desplazable y sin reubicación del contenido debido a la barra de desplazamiento izquierda. Probado con FF actual, Chrome e IE 10.
fuente
¿Qué tal esto? (Si estás usando jQuery)
fuente
Estoy usando showModalDialog , para mostrar la página secundaria como diálogo modal.
para ocultar las barras de desplazamiento de la ventana principal:
y al cerrar el diálogo modal, que muestra las barras de desplazamiento de la ventana principal:
para acceder a elementos en la ventana principal desde el diálogo:
solo para cualquiera que busque sobre showModalDialog : (después de la línea 29 del código original)
fuente
Cancelar el evento como en la respuesta aceptada es un método horrible en mi opinión: /
En su lugar, utilicé a
position: fixed; top: -scrollTop();
continuación.Demostración: https://jsfiddle.net/w9w9hthy/5/
Desde mi proyecto emergente jQuery: https://github.com/seahorsepip/jPopup
Este código toma en consideración los problemas de ancho, alto, barra de desplazamiento y salto de página.
Posibles problemas resueltos con el código anterior:
Si alguien tiene alguna mejora en el código de congelación / descongelación de la página anterior, avíseme para que pueda agregar esas mejoras a mi proyecto.
fuente
fuente
Tengo el mismo problema, a continuación se muestra la forma en que lo manejo.
espero que esto ayude.
fuente
Sobre la base de la respuesta de Cheyenne Forbes, y una que encontré aquí a través de fcalderan: ¿Deshabilitar el desplazamiento, no ocultarlo? y para arreglar el problema de Hallodom de la barra de desplazamiento desapareciendo
CSS:
JS:
Este código lo lleva a la parte superior de la página, pero creo que el código de fcalderan tiene una solución alternativa.
fuente
Sé que esta es una vieja pregunta, pero tuve que hacer algo muy similar, y después de un tiempo buscando una respuesta e intentando diferentes enfoques, terminé usando una solución muy fácil.
Mi problema era muy similar, casi idéntico, la única diferencia es que no tenía que mostrar realmente la barra de desplazamiento; solo tenía que asegurarme de que su ancho aún se usaría, para que el ancho de la página no cambiara mientras se mostraba mi superposición .
Cuando comienzo a deslizar mi superposición en la pantalla, hago:
y después de deslizar mi superposición fuera de la pantalla hago:
IMPORTANTE: esto funciona perfectamente porque mi superposición está posicionada
absolute
,right: 0px
cuandovisible
.fuente
El método más simple es:
Para deshacerlo:
Fácil de implementar, pero el único inconveniente es:
Esto se debe a la eliminación de la barra de desplazamiento y a que la vista se vuelve un poco más ancha.
fuente
body
a en suhtml
lugar.overflow:hidden
no funciona allíAquí está mi solución para detener el desplazamiento (sin jQuery). Lo uso para deshabilitar el desplazamiento cuando aparece el menú lateral.
Puse 17 píxeles de relleno a la derecha para compensar la desaparición de la barra de desplazamiento. Pero esto también es problemático, principalmente para los navegadores móviles. Resuelto obteniendo el ancho de la barra de acuerdo con esto .
Todos juntos en esta pluma.
fuente
Tengo un problema similar en dispositivos táctiles. Agregar "acción táctil: ninguna" al elemento resolvió el problema.
Para más información. Mira esto:-
https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
fuente
Esta es la solución más simple que obtuve hasta ahora. Y créeme, probé todos los demás y este es el más fácil. Funciona muy bien en dispositivos Windows , lo que empuja la página desde la derecha para tener espacio para la barra de desplazamiento del sistema y los dispositivos IOS que no requieren espacio para sus barras de desplazamiento en los navegadores. Por lo tanto, al usar esto, no necesitará agregar relleno a la derecha para que la página no parpadee cuando oculte el desbordamiento del cuerpo o html con css .
La solución es bastante simple si lo piensas. La idea es darle a window.scrollTop () la misma posición exacta en el momento en que se abre una ventana emergente. También cambie esa posición cuando la ventana cambie de tamaño (ya que la posición de desplazamiento cambia una vez que eso sucede).
Así que, aquí vamos...
Primero, creemos la variable que le permitirá saber que la ventana emergente está abierta y la llamaremos stopWindowScroll . Si no hacemos esto, obtendrá un error de una variable indefinida en su página y lo configurará en 0, como no activo.
Ahora hagamos que la función de ventana emergente abierta sea cualquier función en su código que active cualquier ventana emergente que esté usando como complemento o personalizada. En este caso, será una ventana emergente personalizada simple con un documento simple en función de clic.
Entonces, lo siguiente que hacemos es crear la función emergente de cierre, que repito nuevamente puede ser cualquier función que ya haya creado o esté utilizando en un complemento. Lo importante es que necesitamos esas 2 funciones para establecer la variable stopWindowScroll en 1 o 0 para saber cuándo está abierta o cerrada.
Luego, creemos la función window.scroll para que podamos evitar el desplazamiento una vez que stopWindowScroll mencionado anteriormente se establezca en 1, como activo.
Eso es. No se requiere CSS para que esto funcione, excepto sus propios estilos para la página. Esto funcionó a las mil maravillas para mí y espero que les ayude a usted y a los demás.
Aquí hay un ejemplo de trabajo en JSFiddle:
JS Fiddle Example
Hagame saber si esto fue de utilidad. Saludos.
fuente
fuente
Este código funcionará en Chrome 56 y más (la respuesta original ya no funciona en Chrome).
Utilizar
DomUtils.enableScroll()
para habilitar el desplazamiento.Use
DomUtils.disableScroll()
para deshabilitar el desplazamiento.fuente
Para evitar el salto, esto es lo que usé
y en mi css
fuente
Encontré esta respuesta en otro sitio :
Deshabilitar desplazamiento:
Después de cerrar la ventana emergente, desplácese:
fuente
¡La solución de galambalazs es genial! Funcionó perfectamente para mí en Chrome y Firefox. Y también se puede extender para evitar cualquier evento predeterminado desde la ventana del navegador. Digamos que está haciendo una aplicación en el lienzo. Podrías hacer esto:
Y luego, en su aplicación, digamos que va a procesar sus propios eventos, como el mouse, el teclado, los eventos táctiles, etc. sale:
Incluso podría deshabilitar el menú del botón derecho con este truco:
fuente
Tuve un problema de animación similar en pantallas móviles pero no en computadoras portátiles, cuando trataba de animar un div usando el comando animado de jquery. Entonces decidí usar un temporizador que restaurara la posición de desplazamiento de la ventana con tanta frecuencia que a simple vista el documento parecería estático. Esta solución funcionó perfectamente en un dispositivo móvil de pantalla pequeña como Samsung Galaxy-2 o iphone-5.
Lógica principal de este enfoque : el temporizador para establecer la posición de desplazamiento de la ventana en la posición de desplazamiento original debe iniciarse antes del comando jquery animate, y luego, cuando se complete la animación, necesitamos borrar este temporizador (
original scroll position
es la posición justo antes de que comience la animación).Para mi sorpresa agradable, encontré que el documento realmente parecía estático durante la duración de la animación si el intervalo del temporizador era
1 millisecond
, que es a lo que estaba apuntando.OTRA SOLUCIÓN que funcionó : según la respuesta de Mohammad Anini en esta publicación para habilitar / deshabilitar el desplazamiento, también encontré que una versión modificada del código, como se muestra a continuación, funcionó.
fuente
Una solución simple que funcionó para mí (deshabilitar el desplazamiento de la ventana temporalmente).
Basado en este violín: http://jsfiddle.net/dh834zgw/1/
el siguiente fragmento (usando jquery) deshabilitará el desplazamiento de la ventana:
Y en tu css:
Ahora, cuando elimine el modal, no olvide eliminar la clase noscroll en la etiqueta html:
fuente