¿Cómo puedo determinar la dirección de un evento de desplazamiento jQuery?


344

Estoy buscando algo a este efecto:

$(window).scroll(function(event){
   if (/* magic code*/ ){
       // upscroll code
   } else {
      // downscroll code
   }
});

¿Algunas ideas?


Para aquellos que tienen problemas con el desplazamiento elástico, utilice esta respuesta stackoverflow.com/questions/7154967/jquery-detect-scrolldown
Timothy Dalton

1
El wheelevento más fácil de usar en estos días: stackoverflow.com/a/33334461/3168107 .
Shikkediel

Respuestas:


699

Comprobar actual scrollTopvs anteriorscrollTop

var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st;
});

16
¿Alguna forma de establecer una sensibilidad para esto?
codificador de cacao

8
Hice un ejemplo en este codepen. Tal vez actualizaré, actualice esta respuesta con un complemento jQuery debido a la popularidad.
Josiah Ruddell el

3
¿Has probado esto si vuelves a una página anterior con este código? Si se desplaza hacia abajo en su página, digamos 500PX. Vaya a otra página y luego regrese a la página inicial. Algunos navegadores mantienen la posición de desplazamiento y lo llevarán de vuelta a la página. ¿Comenzará lastScrollTopen 0 o se inicializará correctamente?
TCHdvlp

77
@TCHdvlp: en el peor de los casos, el primer evento de desplazamiento actualizaría la variable y el segundo evento sería preciso (... solo importaría en un desplazamiento ascendente después de la navegación hacia atrás). Esto podría solucionarse mediante la configuración var lastScrollTop = $(window).scrollTop()después de que el navegador actualice la posición de desplazamiento al cargar la página.
Josiah Ruddell el

2
Una actualización sobre esto: tenga cuidado de que algunos navegadores, especialmente IE 11 en Windows 8, puedan activar un evento de desplazamiento basado en subpíxeles (desplazamiento suave). Pero debido a que informa scrollTop como un entero, su valor de desplazamiento anterior podría ser el mismo que el actual.
Renato

168

Puede hacerlo sin tener que realizar un seguimiento de la parte superior de desplazamiento anterior, ya que todos los demás ejemplos requieren:

$(window).bind('mousewheel', function(event) {
    if (event.originalEvent.wheelDelta >= 0) {
        console.log('Scroll up');
    }
    else {
        console.log('Scroll down');
    }
});

No soy un experto en esto, así que siéntase libre de investigarlo más a fondo, pero parece que cuando lo usa $(element).scroll, el evento que se está escuchando es un evento de 'desplazamiento'.

Pero si escucha específicamente un mousewheelevento utilizando bind, el originalEventatributo del parámetro de evento a su devolución de llamada contiene información diferente. Parte de esa información es wheelDelta. Si es positivo, movió la rueda del mouse hacia arriba. Si es negativo, movió la rueda del mouse hacia abajo.

Supongo que los mousewheeleventos se dispararán cuando la rueda del mouse gire, incluso si la página no se desplaza; un caso en el que los eventos de 'desplazamiento' probablemente no se activen. Si lo desea, puede llamar event.preventDefault()al final de su devolución de llamada para evitar que la página se desplace, y para que pueda usar el evento de la rueda del mouse para algo que no sea un desplazamiento de página, como algún tipo de funcionalidad de zoom.


13
Agradable pero lamentablemente, el único Firefox no lo admite developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/… (probado en FF v15). : C
nuala

8
Esto fue útil para mí: necesitaba detectar el desplazamiento, a pesar de que la página en sí no se desplazaba, por scrollToplo que no se actualizó. De hecho, $(window).scroll()no disparó en absoluto.
Martti Laine

13
Es bueno que no necesites el estado anterior. Sin embargo, esta técnica no funcionará en móviles o tabletas, ¡ya que no tienen rueda de ratón!
joeytwiddle

13
Este enfoque no funcionará si me desplazo con el teclado. Definitivamente es un enfoque interesante para cosas como el zoom, pero no creo que aborde la pregunta de dirección de desplazamiento.
chmac

66
$ ("html, body"). bind ({'mousewheel DOMMouseScroll onmousewheel touchmove scroll': function (e) {// ...}); funciona para mí al detectar todos los datos de desplazamiento del navegador
GoreDefex

31

Almacene la ubicación de desplazamiento anterior, luego vea si la nueva es mayor o menor que eso.

Aquí hay una manera de evitar cualquier variable global ( violín disponible aquí ):

(function () {
    var previousScroll = 0;

    $(window).scroll(function(){
       var currentScroll = $(this).scrollTop();
       if (currentScroll > previousScroll){
           alert('down');
       } else {
          alert('up');
       }
       previousScroll = currentScroll;
    });
}()); //run this anonymous function immediately

29

Solución existente

Podría haber 3 soluciones de esta publicación y otra respuesta .

Solución 1

    var lastScrollTop = 0;
    $(window).on('scroll', function() {
        st = $(this).scrollTop();
        if(st < lastScrollTop) {
            console.log('up 1');
        }
        else {
            console.log('down 1');
        }
        lastScrollTop = st;
    });

Solución 2

    $('body').on('DOMMouseScroll', function(e){
        if(e.originalEvent.detail < 0) {
            console.log('up 2');
        }
        else {
            console.log('down 2');
        }
    });

Solución 3

    $('body').on('mousewheel', function(e){
        if(e.originalEvent.wheelDelta > 0) {
            console.log('up 3');
        }
        else {
            console.log('down 3');
        }
    });

Prueba de navegador múltiple

No pude probarlo en Safari

Chrome 42 (gana 7)

  • Solución 1
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: no funciona
  • Solución 3
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento

Firefox 37 (Win 7)

  • Solución 1
    • Arriba: 20 eventos por 1 desplazamiento
    • Abajo: 20 eventos por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: 1 evento por 1 desplazamiento
  • Solución 3
    • Arriba: no funciona
    • Abajo: no funciona

IE 11 (Win 8)

  • Solución 1
    • Arriba: 10 eventos por 1 desplazamiento (efecto secundario: el desplazamiento hacia abajo ocurrió por fin)
    • Abajo: 10 eventos por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: no funciona
  • Solución 3
    • Arriba: no funciona
    • Abajo: 1 evento por 1 desplazamiento

IE 10 (Win 7)

  • Solución 1
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: no funciona
  • Solución 3
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento

IE 9 (Win 7)

  • Solución 1
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: no funciona
  • Solución 3
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento

IE 8 (Win 7)

  • Solución 1
    • Arriba: 2 eventos por 1 desplazamiento (efecto secundario: el desplazamiento hacia abajo ocurrió por fin)
    • Abajo: 2 ~ 4 eventos por 1 desplazamiento
  • Soltion 2
    • Arriba: no funciona
    • Abajo: no funciona
  • Solución 3
    • Arriba: 1 evento por 1 desplazamiento
    • Abajo: 1 evento por 1 desplazamiento

Solución combinada

Verifiqué que el efecto secundario de IE 11 e IE 8 proviene de la if elsedeclaración. Entonces, lo reemplacé con la if else ifsiguiente declaración.

De la prueba de navegador múltiple, decidí usar la Solución 3 para navegadores comunes y la Solución 1 para firefox e IE 11.

Remití esta respuesta para detectar IE 11.

    // Detect IE version
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    // Firefox or IE 11
    if(typeof InstallTrigger !== 'undefined' || iev == 11) {
        var lastScrollTop = 0;
        $(window).on('scroll', function() {
            st = $(this).scrollTop();
            if(st < lastScrollTop) {
                console.log('Up');
            }
            else if(st > lastScrollTop) {
                console.log('Down');
            }
            lastScrollTop = st;
        });
    }
    // Other browsers
    else {
        $('body').on('mousewheel', function(e){
            if(e.originalEvent.wheelDelta > 0) {
                console.log('Up');
            }
            else if(e.originalEvent.wheelDelta < 0) {
                console.log('Down');
            }
        });
    }

Si alguien pudiera agregar el resultado Safari browser, sería útil complementar la solución.
Programador químico

¡Uy! Descubrí que Mobile Chrome y el navegador predeterminado de Android solo están cubiertos por la Solución 1. Por lo tanto, sería mejor usar la Solución 1 y la 3 juntas para cubrir varios navegadores.
Programador químico

No funcionará si el diseño es un diseño de diseño fijo. Si desea detectar la dirección de desplazamiento en un sitio web estático sin desplazamiento, Firefox e IE11 no funcionarán
Shannon Hochkins

Encuentro que cuando uso esto usa los "Otros navegadores" en cromo, esto no es realmente útil cuando deseas detectar el desplazamiento por la rueda del mouse y la barra de desplazamiento. .scroll detectará ambos tipos de desplazamiento en Chrome.
Sam

12

Entiendo que ya ha habido una respuesta aceptada, pero quería publicar lo que estoy usando en caso de que pueda ayudar a alguien. cliphexObtuve la dirección como con el evento mousewheel pero con soporte para Firefox. Es útil hacerlo de esta manera en caso de que esté haciendo algo como bloquear el desplazamiento y no pueda obtener la parte superior del desplazamiento actual.

Vea una versión en vivo aquí .

$(window).on('mousewheel DOMMouseScroll', function (e) {

    var direction = (function () {

        var delta = (e.type === 'DOMMouseScroll' ?
                     e.originalEvent.detail * -40 :
                     e.originalEvent.wheelDelta);

        return delta > 0 ? 0 : 1;
    }());

    if(direction === 1) {
       // scroll down
    }
    if(direction === 0) {
       // scroll up
    }
});

@EtienneMartin el código anterior se basa en jQuery si eso es lo que estaba causando su error. Consulte el violín adjunto para verlo funcionando.
souporserious

8

Evento de desplazamiento

El evento de desplazamiento se comporta de manera extraña en FF (se dispara muchas veces debido al desplazamiento de suavidad) pero funciona.

Nota: El evento de desplazamiento en realidad se activa al arrastrar la barra de desplazamiento, usando las teclas del cursor o la rueda del mouse.

//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
    padding: "5px 7px",
    background: "#e9e9e9",
    position: "fixed",
    bottom: "15px",
    left: "35px"
});

//binds the "scroll" event
$(window).scroll(function (e) {
    var target = e.currentTarget,
        self = $(target),
        scrollTop = window.pageYOffset || target.scrollTop,
        lastScrollTop = self.data("lastScrollTop") || 0,
        scrollHeight = target.scrollHeight || document.body.scrollHeight,
        scrollText = "";

    if (scrollTop > lastScrollTop) {
        scrollText = "<b>scroll down</b>";
    } else {
        scrollText = "<b>scroll up</b>";
    }

    $("#test").html(scrollText +
      "<br>innerHeight: " + self.innerHeight() +
      "<br>scrollHeight: " + scrollHeight +
      "<br>scrollTop: " + scrollTop +
      "<br>lastScrollTop: " + lastScrollTop);

    if (scrollHeight - scrollTop === self.innerHeight()) {
      console.log("► End of scroll");
    }

    //saves the current scrollTop
    self.data("lastScrollTop", scrollTop);
});

Evento de rueda

También puede echar un vistazo a MDN, que expone una gran información sobre el evento de la rueda .

Nota: El evento de rueda se dispara solo cuando se usa la rueda del mouse ; Las teclas de cursor y arrastrar la barra de desplazamiento no activan el evento.

Leí el documento y el ejemplo: escuchando este evento en el navegador
y después de algunas pruebas con FF, IE, Chrome, Safari, terminé con este fragmento:

//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
    padding: "5px 7px",
    background: "#e9e9e9",
    position: "fixed",
    bottom: "15px",
    left: "15px"
});

//attach the "wheel" event if it is supported, otherwise "mousewheel" event is used
$("html").on(("onwheel" in document.createElement("div") ? "wheel" : "mousewheel"), function (e) {
    var evt = e.originalEvent || e;

    //this is what really matters
    var deltaY = evt.deltaY || (-1 / 40 * evt.wheelDelta), //wheel || mousewheel
        scrollTop = $(this).scrollTop() || $("body").scrollTop(), //fix safari
        scrollText = "";

    if (deltaY > 0) {
        scrollText = "<b>scroll down</b>";
    } else {
        scrollText = "<b>scroll up</b>";
    }

    //console.log("Event: ", evt);
    $("#test").html(scrollText +
      "<br>clientHeight: " + this.clientHeight +
      "<br>scrollHeight: " + this.scrollHeight +
      "<br>scrollTop: " + scrollTop +
      "<br>deltaY: " + deltaY);
});

2
Tengo una vista de panel fijo que deshabilita la barra de desplazamiento real, por lo que necesitaba detectar la dirección desde la rueda del mouse. Su solución de rueda de ratón funcionó perfectamente en todos los navegadores, ¡así que gracias por eso!
Shannon Hochkins

8

En caso de que solo quiera saber si se desplaza hacia arriba o hacia abajo con un dispositivo puntero (mouse o track pad), puede usar la propiedad deltaY del wheelevento.

$('.container').on('wheel', function(event) {
  if (event.originalEvent.deltaY > 0) {
    $('.result').append('Scrolled down!<br>');
  } else {
    $('.result').append('Scrolled up!<br>');
  }
});
.container {
  height: 200px;
  width: 400px;
  margin: 20px;
  border: 1px solid black;
  overflow-y: auto;
}
.content {
  height: 300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="container">
  <div class="content">
    Scroll me!
  </div>
</div>

<div class="result">
  <p>Action:</p>
</div>


Este enlace dice que no confíe en deltaY developer.mozilla.org/en-US/docs/Web/Events/wheel
Charlie Martin

3
var tempScrollTop, currentScrollTop = 0; 

$(window).scroll(function(){ 

   currentScrollTop = $("#div").scrollTop(); 

   if (tempScrollTop > currentScrollTop ) {
       // upscroll code
   }
  else if (tempScrollTop < currentScrollTop ){
      // downscroll code
  }

  tempScrollTop = currentScrollTop; 
} 

o use la extensión de la rueda del mouse , vea aquí .


3

He visto muchas versiones de buenas respuestas aquí, pero parece que algunas personas tienen problemas de navegador cruzado, así que esta es mi solución.

Lo he utilizado con éxito para detectar la dirección en FF, IE y Chrome ... No lo he probado en safari, ya que normalmente uso Windows.

$("html, body").bind({'mousewheel DOMMouseScroll onmousewheel touchmove scroll': 
    function(e) {
        if (e.target.id == 'el') return;
        e.preventDefault();
        e.stopPropagation();

        //Determine Direction
        if (e.originalEvent.wheelDelta && e.originalEvent.wheelDelta >= 0) {
            //Up
            alert("up");

        } else if (e.originalEvent.detail && e.originalEvent.detail <= 0) {
            //Up
            alert("up");

        } else {
            //Down
            alert("down");
        }
    }
});

Tenga en cuenta que también uso esto para detener cualquier desplazamiento, por lo que si desea que se produzca el desplazamiento, debe eliminar el e.preventDefault(); e.stopPropagation();


1
siempre regresa a Android GS5
SISYN

Esto funcionó muy bien! Tuve un problema con la respuesta más votada en IE. ¡Esto no tiene ese problema! +1 de mi parte
Radmation

3

Para ignorar cualquier complemento / impulso / rebote en la parte superior e inferior de la página, aquí hay una versión modificada de la respuesta aceptada de Josiah :

var prevScrollTop = 0;
$(window).scroll(function(event){

    var scrollTop = $(this).scrollTop();

    if ( scrollTop < 0 ) {
        scrollTop = 0;
    }
    if ( scrollTop > $('body').height() - $(window).height() ) {
        scrollTop = $('body').height() - $(window).height();
    }

    if (scrollTop >= prevScrollTop && scrollTop) {
        // scrolling down
    } else {
        // scrolling up
    }

    prevScrollTop = scrollTop;
});

3

Puede determinar la dirección del mousewhell.

$(window).on('mousewheel DOMMouseScroll', function (e) {
    var delta = e.originalEvent.wheelDelta ? 
                   e.originalEvent.wheelDelta : -e.originalEvent.detail;

    if (delta >= 0) {
        console.log('scroll up');
    } else {
        console.log('scroll down');
    }
});

3

Use esto para encontrar la dirección de desplazamiento. Esto es solo para encontrar la dirección del desplazamiento vertical. Admite todos los navegadores cruzados.

    var scrollableElement = document.getElementById('scrollableElement');

    scrollableElement.addEventListener('wheel', findScrollDirectionOtherBrowsers);

    function findScrollDirectionOtherBrowsers(event){
        var delta;

        if (event.wheelDelta){
            delta = event.wheelDelta;
        }else{
            delta = -1 * event.deltaY;
        }

        if (delta < 0){
            console.log("DOWN");
        }else if (delta > 0){
            console.log("UP");
        }

    }

Ejemplo


3

Este código funciona bien con IE, Firefox, Opera y Chrome:

$(window).bind('wheel mousewheel', function(event) {
      if (event.originalEvent.deltaY >= 0) {
          console.log('Scroll down');
      }
      else {
          console.log('Scroll up');
      }
  });

'wheel mousewheel' y la propiedad deltaY deben usarse en la función bind () .

Recuerde: su usuario debe actualizar su sistema y navegadores por razones de seguridad. En 2018, las excusas de "I have IE 7" no tienen sentido. Debemos educar a los usuarios.

Tenga un buen día :)


1
Probé tu código y es al revés. El primero se activa al desplazarse hacia abajo y el segundo al desplazarse hacia arriba.
AlexioVay

Hola :) Gracias AlexioVay. Edité mi código (¡ya es hora!) ^^. Por supuesto, "console.log ('.......')" es solo un ejemplo de lo que podemos hacer.
Cyril Morales

2

Mantenlo súper simple:

Forma de escucha de eventos jQuery:

$(window).on('wheel', function(){
  whichDirection(event);
});

Vanilla JavaScript Event Listener Way:

if(window.addEventListener){
  addEventListener('wheel', whichDirection, false);
} else if (window.attachEvent) {
  attachEvent('wheel', whichDirection, false);
}

La función sigue siendo la misma:

function whichDirection(event){
  console.log(event + ' WheelEvent has all kinds of good stuff to work with');
  var scrollDirection = event.deltaY;
  if(scrollDirection === 1){
    console.log('meet me at the club, going down', scrollDirection);
  } else if(scrollDirection === -1) {
    console.log('Going up, on a tuesday', scrollDirection);
  }
}

Escribí un post más en profundidad sobre el mismo aquí


¿Se requiere jquery-wheel para usar la versión jquery?
Hastig Zusammenstellen

1
jquery-wheel no es necesario para esto @HastigZusammenstellen
CR Rollyson

2

Puede usar la opción de desplazamiento y la rueda del mouse para rastrear el movimiento hacia arriba y hacia abajo a la vez.

 $('body').bind('scroll mousewheel', function(event) {

if (event.originalEvent.wheelDelta >= 0) {
      console.log('moving down');   
    }
    else {
      console.log('moving up'); 
    }
});

Puede reemplazar 'cuerpo' con (ventana) también.


Parece funcionar bien en Chrome pero no en FF (55.0.2, Ubuntu)
Hastig Zusammenstellen

1

almacene un incremento en el .data ()elemento de desplazamiento, luego podrá probar la cantidad de veces que el desplazamiento alcanzó la parte superior.


1

¿Por qué nadie usa el eventobjeto devuelto por jQueryen scroll?

$window.on('scroll', function (event) {
    console.group('Scroll');
    console.info('Scroll event:', event);
    console.info('Position:', this.pageYOffset);
    console.info('Direction:', event.originalEvent.dir); // Here is the direction
    console.groupEnd();
});

Estoy usando chromiumy no verifiqué en otros navegadores si tienen la dirpropiedad.


1

Dado que bindha quedado en desuso en v3 ("reemplazado por on") y wheelahora es compatible , olvide wheelDelta:

$(window).on('wheel', function(e) {
  if (e.originalEvent.deltaY > 0) {
    console.log('down');
  } else {
    console.log('up');
  }
  if (e.originalEvent.deltaX > 0) {
    console.log('right');
  } else {
    console.log('left');
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 style="white-space:nowrap;overflow:scroll">
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
</h1>

wheelCompatibilidad del navegador del evento en MDN (2019-03-18) :

Compatibilidad del evento de rueda


El código anterior produce dos registros de consola, use lo siguiente para separar completamente arriba / abajo / izquierda / derecha: if(e.originalEvent.deltaY > 0) { console.log('down'); } else if(e.originalEvent.deltaY < 0) { console.log('up'); } else if(e.originalEvent.deltaX > 0) { console.log('right'); } else if(e.originalEvent.deltaX < 0) { console.log('left'); }
Don Wilson

Para touchmoveevento de uso móvil en su lugar.
CPHPython

1

Puedes usar esto también

$(document).ready(function(){

  var currentscroll_position = $(window).scrollTop();
$(window).on('scroll', function(){
Get_page_scroll_direction();
});

function Get_page_scroll_direction(){
  var running_scroll_position = $(window).scrollTop();
  if(running_scroll_position > currentscroll_position) {
      
      $('.direction_value').text('Scrolling Down Scripts');

  } else {
       
       $('.direction_value').text('Scrolling Up Scripts');

  }
  currentscroll_position = running_scroll_position;
}

});
.direction_value{
  position: fixed;
  height: 30px;
  background-color: #333;
  color: #fff;
  text-align: center;
  z-index: 99;
  left: 0;
  top: 0;
  width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="direction_value">
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>


0

en el .data()elemento puede almacenar un JSON y probar valores para lanzar eventos

{ top : 1,
   first_top_event: function(){ ...},
   second_top_event: function(){ ...},
   third_top_event: function(){ ...},
   scroll_down_event1: function(){ ...},
   scroll_down_event2: function(){ ...}
}

0

Esta es una detección simple y fácil para cuando el usuario se desplaza fuera de la parte superior de la página y cuando vuelve a la parte superior.

$(window).scroll(function() {
    if($(window).scrollTop() > 0) {
        // User has scrolled
    } else {
        // User at top of page
    }
});

0

Esta es una solución óptima para detectar la dirección justo cuando el usuario finaliza el desplazamiento.

var currentScrollTop = 0 ;

$(window).bind('scroll', function () {     

    scrollTop = $(this).scrollTop();

    clearTimeout($.data(this, 'scrollTimer'));
    $.data(this, 'scrollTimer', setTimeout(function() {

        if(scrollTop > currentScrollTop){
            // downscroll code
            $('.mfb-component--bl').addClass('mfbHide');
        }else{
            // upscroll code
            $('.mfb-component--bl').removeClass('mfbHide');
        }
        currentScrollTop = scrollTop;

    }, 250));

});

0

Deberías probar esto

var scrl
$(window).scroll(function(){
        if($(window).scrollTop() < scrl){
            //some code while previous scroll
        }else{
            if($(window).scrollTop() > 200){
                //scroll while downward
            }else{//scroll while downward after some specific height
            }
        }
        scrl = $(window).scrollTop();
    });

0

Tuve problemas con el desplazamiento elástico (desplazamiento de desplazamiento, bandas de goma). Ignorar el evento de desplazamiento hacia abajo si está cerca de la parte superior de la página funcionó para mí.

var position = $(window).scrollTop();
$(window).scroll(function () {
    var scroll = $(window).scrollTop();
    var downScroll = scroll > position;
    var closeToTop = -120 < scroll && scroll < 120;
    if (downScroll && !closeToTop) {
        // scrolled down and not to close to top (to avoid Ipad elastic scroll-problems)
        $('.top-container').slideUp('fast');
        $('.main-header').addClass('padding-top');
    } else {
        // scrolled up
        $('.top-container').slideDown('fast');
        $('.main-header').removeClass('padding-top');
    }
    position = scroll;
});

0

Esto funciona en todos los navegadores de PC o teléfonos, expandiéndose en las respuestas principales. Se puede construir una ventana de objeto de evento más compleja ["scroll_evt"] y luego llamarla en la función handleScroll (). Éste se dispara para 2 condiciones concurrentes, si ha transcurrido cierto retraso o se pasa cierto delta para eliminar algunos disparadores no deseados.

window["scroll_evt"]={"delta":0,"delay":0,"direction":0,"time":Date.now(),"pos":$(window).scrollTop(),"min_delta":120,"min_delay":10};
$(window).scroll(function() {

    var currentScroll = $(this).scrollTop();
    var currentTime = Date.now();
    var boolRun=(window["scroll_evt"]["min_delay"]>0)?(Math.abs(currentTime - window["scroll_evt"]["time"])>window["scroll_evt"]["min_delay"]):false;
    boolRun = boolRun && ((window["scroll_evt"]["min_delta"]>0)?(Math.abs(currentScroll - window["scroll_evt"]["pos"])>window["scroll_evt"]["min_delta"]):false);
    if(boolRun){
        window["scroll_evt"]["delta"] = currentScroll - window["scroll_evt"]["pos"];
        window["scroll_evt"]["direction"] = window["scroll_evt"]["delta"]>0?'down':'up';
        window["scroll_evt"]["delay"] =currentTime - window["scroll_evt"]["time"];//in milisecs!!!
        window["scroll_evt"]["pos"] = currentScroll;
        window["scroll_evt"]["time"] = currentTime;
        handleScroll();
    }
});


function handleScroll(){
    event.stopPropagation();
    //alert(window["scroll_evt"]["direction"]);
    console.log(window["scroll_evt"]);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.