2011-12-04 12 views

Respuesta

23

Esto es realmente un proceso un tanto en profundidad. Lo que hago es establecer indicadores globales cuando el usuario ingresa el mouse y deja el elemento que desea desplazar. Luego, en el evento mousewheel para el cuerpo, compruebo si el indicador MOUSE_OVER es verdadero, luego detengo la propagación del evento. Esto es para que el cuerpo principal no se desplace en caso de que toda la página se haya desbordado.

Tenga en cuenta que con el desbordamiento oculto, la capacidad de desplazamiento predeterminada se pierde, por lo que debe crearla usted mismo. Para hacer esto, puede configurar un oyente mousewheel en su div en cuestión y usar la propiedad event.wheelDelta para verificar si el usuario se está desplazando hacia arriba o hacia abajo. Este valor es diferente según el navegador, pero generalmente es negativo si se desplaza hacia abajo y es positivo si se desplaza hacia arriba. A continuación, puede cambiar la posición de su div en consecuencia.

Este código se cortó rápidamente, pero se vería esencialmente como esto ...

var MOUSE_OVER = false; 
$('body').bind('mousewheel', function(e){ 
    if(MOUSE_OVER){ 
    if(e.preventDefault) { e.preventDefault(); } 
    e.returnValue = false; 
    return false; 
    } 
}); 

$('#myDiv').mouseenter(function(){ MOUSE_OVER=true; }); 
$('#myDiv').mouseleave(function(){ MOUSE_OVER=false; }); 

$('#myDiv').bind('mousewheel', function(e){ 
    var delta = e.wheelDelta; 
    if(delta > 0){ 
    //go up 
    } 
    else{ 
    //go down 
    } 
}); 
+0

Eso es perfecto. ¡Muchas gracias! :) –

+2

No mencioné, pero deberías mirar 'event.wheelDelta' y' event.detail' para afinar las cosas. Firefox usa 'event.detail' mientras que otros usan' event.wheelDelta' y usando estos valores puedes calcular algún control de velocidad si quieres ir a ese complejo. Este enlace ayudará a http://www.javascriptkit.com/javatutors/onmousewheel.shtml – anson

+0

El evento mousewheel ya no funciona. Se llama rueda en los navegadores modernos. – netAction

1

Uso el desbordamiento: desplazarse, pero también colocar Absolutamente un div sobre la barra de desplazamiento para ocultarlo.

+0

Gracias! Podría ser una buena resolución si no puedo encontrar otra solución. Sin embargo, se siente un poco feo para resolverlo. –

+0

Claro, es un truco, pero muy elegante en mi opinión. De hecho, comencé a escribir una respuesta como @ y más allá, pero luego se me ocurrió este truco de CSS. Es mucho más simple que el método JS, lo que significa que no solo es más fácil de implementar, sino que también es menos propenso a errores. – maxedison

+1

por ejemplo, creé esto en menos de 5 minutos: http://jsfiddle.net/ZGSVj/ – maxedison

1
$("body").css("overflow", "hidden") 

$(document).bind('mousewheel', function(evt) { 
    var delta = evt.originalEvent.wheelDelta 
    console.log(delta) 
}) 

funciona para mí. adaptado de How do I get the wheelDelta property?

0
$("div").on('wheel', function (e) { 
     if (e.originalEvent.deltaY < 0) { 
     console.log("Scroll up"); 
    } else { 
     console.log("Scroll down"); 
    } 
}); 

Esto hizo el truco para mí. JSFiddle

StackFiddle:

$("div").on('wheel', function(e) { 
 
    if (e.originalEvent.deltaY < 0) { 
 
    console.log("Scroll up"); 
 
    } else { 
 
    console.log("Scroll down"); 
 
    } 
 
});
div { 
 
    height: 50px; 
 
    width: 300px; 
 
    background-color: black; 
 
    overflow: hidden; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div></div>

Cuestiones relacionadas