He revisado y probado las diversas funciones para evitar que el cuerpo se desplace mientras está dentro de un div y he combinado una función que debería funcionar.
$('.scrollable').mouseenter(function() {
$('body').bind('mousewheel DOMMouseScroll', function() {
return false;
});
$(this).bind('mousewheel DOMMouseScroll', function() {
return true;
});
});
$('.scrollable').mouseleave(function() {
$('body').bind('mousewheel DOMMouseScroll', function() {
return true;
});
});
- Esto detiene todo el desplazamiento donde quiero que el desplazamiento aún sea posible dentro del contenedor
- Esto tampoco se desactiva al dejar el mouse
¿Alguna idea o mejores formas de hacer esto?
jquery
mousewheel
RIK
fuente
fuente
Respuestas:
Actualización 2: Mi solución se basa en deshabilitar el desplazamiento nativo del navegador por completo (cuando el cursor está dentro del DIV) y luego desplazar manualmente el DIV con JavaScript (configurando su
.scrollTop
propiedad). Un enfoque alternativo y mejor en mi opinión sería deshabilitar solo de forma selectiva el desplazamiento del navegador para evitar el desplazamiento de la página, pero no el desplazamiento DIV. Consulte la respuesta de Rudie a continuación, que demuestra esta solución.Aqui tienes:
Demostración en vivo: https://jsbin.com/howojuq/edit?js,output
Por lo tanto, configura manualmente la posición de desplazamiento y luego simplemente evita el comportamiento predeterminado (que sería desplazar el DIV o toda la página web).
Actualización 1: como Chris señaló en los comentarios a continuación, en las versiones más nuevas de jQuery, la información delta está anidada dentro del
.originalEvent
objeto, es decir, jQuery ya no la expone en su objeto de evento personalizado y tenemos que recuperarlo del objeto de evento nativo. .fuente
-e.detail
, probado en Firefox (Mac, Linux), Safari (Mac) y Chromium (Linux)..detail
no se corresponde con el signo de.wheelData
(que es lo que tienen Chrome / IE), por lo que tenemos que invertirlo manualmente. Gracias por arreglar mi respuesta.if( e.originalEvent ) e = e.originalEvent;
if ( $(this)[0].scrollHeight !== $(this).outerHeight() ) { //yourcode }
se ejecutará solo cuando haya una barra de desplazamiento.Si no le importa la compatibilidad con versiones anteriores de IE (<8), puede crear un complemento jQuery personalizado y luego llamarlo en el elemento desbordado.
Esta solución tiene una ventaja sobre la propuesta por Šime Vidas, ya que no sobrescribe el comportamiento de desplazamiento, solo la bloquea cuando es apropiado.
fuente
[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
Creo que es posible cancelar el evento mousescroll a veces: http://jsfiddle.net/rudiedirkx/F8qSq/show/
Dentro del controlador de eventos, necesitará saber:
d = e.originalEvent.deltaY, dir = d < 0 ? 'up' : 'down'
porque un número positivo significa desplazarse hacia abajoscrollTop
para arriba,scrollHeight - scrollTop - offsetHeight
para abajoSi eres
top = 0
, obottom = 0
,cancelar el evento:
e.preventDefault()
(y tal vez inclusoe.stopPropagation()
).Creo que es mejor no anular el comportamiento de desplazamiento del navegador. Cancele solo cuando corresponda.
Probablemente no sea perfectamente xbrowser, pero no puede ser muy difícil. Quizás la dirección de desplazamiento dual de Mac sea complicada ...
fuente
Use la propiedad CSS debajo del
overscroll-behavior: contain;
elemento secundariofuente
mira si esto te ayuda:
demostración: jsfiddle
editar:
prueba esto:
fuente
Una solución menos hacky, en mi opinión, es establecer el desbordamiento oculto en el cuerpo cuando pasa el mouse sobre el div desplazable. Esto evitará que el cuerpo se desplace, pero se producirá un efecto de "salto" no deseado. La siguiente solución soluciona eso:
Puede hacer que su código sea más inteligente si es necesario. Por ejemplo, puede probar si el cuerpo ya tiene un relleno y, en caso afirmativo, agregar el nuevo relleno a eso.
fuente
En la solución anterior hay un pequeño error con respecto a Firefox. En Firefox, el evento "DOMMouseScroll" no tiene la propiedad e.detail, para obtener esta propiedad debe escribir lo siguiente 'e.originalEvent.detail'.
Aquí hay una solución funcional para Firefox:
fuente
aquí una solución simple sin jQuery que no destruye el desplazamiento nativo del navegador (esto es: sin desplazamiento artificial / feo):
Demostración en vivo: http://jsfiddle.net/ibcaliax/bwmzfmq7/4/
fuente
Aquí está mi solución que he usado en aplicaciones.
Inhabilité el desbordamiento del cuerpo y coloqué todo el html del sitio web dentro de los div del contenedor. Los contenedores del sitio web se desbordan y, por lo tanto, el usuario puede desplazarse por la página como se esperaba.
Luego creé un div hermano (#Prevent) con un índice Z más alto que cubre todo el sitio web. Dado que #Prevent tiene un índice Z más alto, se superpone al contenedor del sitio web. Cuando #Prevent está visible, el mouse ya no se desplaza por los contenedores del sitio web, por lo que no es posible desplazarse.
Por supuesto, puede colocar otro div, como su modal, con un índice z más alto que #Prevent en el marcado. Esto le permite crear ventanas emergentes que no sufren problemas de desplazamiento.
Esta solución es mejor porque no oculta las barras de desplazamiento (efecto de salto). No requiere detectores de eventos y es fácil de implementar. Funciona en todos los navegadores, aunque con IE7 y 8 tienes que jugar (depende de tu código específico).
html
css
jquery / js
deshabilitar / habilitar el desplazamiento
fuente
Necesitaba agregar este evento a varios elementos que podrían tener una barra de desplazamiento. Para los casos en los que no había barra de desplazamiento, la barra de desplazamiento principal no funcionó como debería. Así que hice un pequeño cambio en el código @ Šime de la siguiente manera:
Ahora, solo los elementos con una barra de desplazamiento evitarán que el desplazamiento principal comience detenido.
fuente
La versión javascript pura de la respuesta de Vidas,
el$
es el nodo DOM del plano en el que se está desplazando.¡Asegúrese de no adjuntar el par varias veces! Aquí hay un ejemplo,
Una advertencia , la función debe ser una constante, si reinicializa la función cada vez antes de adjuntarla, es decir.
var func = function (...)
elremoveEventListener
no funcionará.fuente
Puede hacer esto sin JavaScript. Puede establecer el estilo en ambos divs en
position: fixed
yoverflow-y: auto
. Es posible que deba hacer que uno de ellos sea más alto que el otro estableciendo suz-index
(si se superponen).Aquí hay un ejemplo básico de CodePen .
fuente
Aquí está el complemento que es útil para evitar el desplazamiento de los padres mientras se desplaza un div específico y tiene un montón de opciones para jugar.
Compruébalo aquí:
https://github.com/MohammadYounes/jquery-scrollLock
Uso
Activar bloqueo de desplazamiento a través de JavaScript:
Activar bloqueo de desplazamiento mediante marcado:
Ver demostración
fuente
simplemente ofreciendo esto como una posible solución si no cree que el usuario tendrá una experiencia negativa con el cambio obvio. Simplemente cambié la clase de desbordamiento del cuerpo a oculto cuando el mouse estaba sobre el div de destino; luego cambié el div del cuerpo a desbordamiento oculto cuando el mouse se va.
Personalmente, no creo que se vea mal, mi código podría usar alternar para hacerlo más limpio, y hay beneficios obvios para hacer posible este efecto sin que el usuario se dé cuenta. Entonces, esta es probablemente la respuesta hackish-last-resort.
fuente