Como posso determinar a direção de um evento de rolagem jQuery?

Respostas:

699

Verificar atual scrollTopx anteriorscrollTop

var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st;
});
Josiah Ruddell
fonte
16
Alguma maneira de definir uma sensibilidade para isso?
Codificador de cacau
8
Eu fiz um exemplo neste codepen. Talvez eu atualize a atualização desta resposta com um plug-in jQuery devido à popularidade.
Josias Ruddell
3
Você já tentou isso se voltar para uma página anterior com esse código? Se você rolar a página, digamos 500PX. Vá para outra página e depois volte para a página inicial. Alguns navegadores mantêm a posição de rolagem e o levam de volta à página. Você começará lastScrollTopem 0 ou será inicializado corretamente?
TCHdvlp
7
@TCHdvlp - bem, na pior das hipóteses, o primeiro evento de rolagem atualizaria a variável e o segundo evento seria preciso (.. isso só importaria em um upscroll após a navegação de retorno). Isso pode ser corrigido através da configuração var lastScrollTop = $(window).scrollTop()após o navegador atualizar a posição de rolagem no carregamento da página.
precisa saber é o seguinte
2
Uma atualização sobre isso: tenha cuidado para que alguns navegadores, especialmente o IE 11 no Windows 8, possam disparar um evento de rolagem baseado em subpixel (rolagem suave). Mas como ele relata scrollTop como um número inteiro, seu valor de rolagem anterior pode ser o mesmo que o atual.
Renato
168

Você pode fazer isso sem ter que acompanhar a parte superior da rolagem anterior, pois todos os outros exemplos exigem:

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

Como não sou especialista nisso, sinta-se à vontade para pesquisar mais, mas parece que, quando você usa $(element).scroll, o evento que está sendo ouvido é um evento de 'rolagem'.

Mas se você ouvir especificamente um mousewheelevento usando bind, o originalEventatributo do parâmetro de evento no seu retorno de chamada conterá informações diferentes. Parte dessa informação é wheelDelta. Se for positivo, você moveu a roda do mouse para cima. Se for negativo, você moveu o botão do mouse para baixo.

Meu palpite é que os mousewheeleventos serão acionados quando a roda do mouse virar, mesmo que a página não role; um caso em que os eventos de 'rolagem' provavelmente não são acionados. Se desejar, você pode ligar event.preventDefault()na parte inferior do seu retorno de chamada para impedir a rolagem da página e usar o evento roda do mouse para algo diferente de uma rolagem da página, como algum tipo de funcionalidade de zoom.

cilphex
fonte
13
Bom, mas infelizmente o primeiro Firefox não o suporta developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/… (testado no FF v15). : C
nuala 17/09/12
8
Isso foi útil para mim: eu precisava detectar a rolagem, mesmo que a página em si não tenha rolado, e scrollTopnão foi atualizada. De fato, $(window).scroll()não disparou nada.
Martti Laine
13
É bom que você não precise do estado antigo. No entanto, esta técnica não funcionará em celulares ou tablets, pois eles não têm um mouse!
Joeytwiddle #
13
Essa abordagem não funcionará se eu rolar com o teclado. Definitivamente, é uma abordagem interessante para coisas como o zoom, mas acho que não aborda a questão da direção da rolagem.
chmac
6
$ ("html, body"). bind ({'roda do mouse DOMMouseScroll na roda do mouse touchmove scroll': function (e) {// ...}); trabalha para mim na detecção de todos os dados do navegador de rolagem
GoreDefex
31

Armazene o local de rolagem anterior e verifique se o novo é maior ou menor que isso.

Aqui está uma maneira de evitar qualquer variável global ( violino disponível aqui ):

(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
Skilldrick
fonte
29

Solução existente

Poderia haver 3 soluções desta postagem e outras respostas .

Solução 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;
    });

Solução 2

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

Solução 3

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

Teste Multi Navegador

Não pude testá-lo no Safari

chrome 42 (vitória 7)

  • Solução 1
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem
  • Solução 2
    • Para cima: Não está funcionando
    • Down: Não está funcionando
  • Solução 3
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem

Firefox 37 (versão 7)

  • Solução 1
    • Até: 20 eventos por 1 pergaminho
    • Down: 20 eventos por 1 pergaminho
  • Solução 2
    • Para cima: Não está funcionando
    • Abaixo: 1 evento por 1 rolagem
  • Solução 3
    • Para cima: Não está funcionando
    • Down: Não está funcionando

IE 11 (Vitória 8)

  • Solução 1
    • Acima: 10 eventos por 1 rolagem (efeito colateral: rolagem para baixo ocorrida no final)
    • Down: 10 eventos por 1 pergaminho
  • Solução 2
    • Para cima: Não está funcionando
    • Down: Não está funcionando
  • Solução 3
    • Para cima: Não está funcionando
    • Abaixo: 1 evento por 1 rolagem

IE 10 (vitória 7)

  • Solução 1
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem
  • Solução 2
    • Para cima: Não está funcionando
    • Down: Não está funcionando
  • Solução 3
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem

IE 9 (vitória 7)

  • Solução 1
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem
  • Solução 2
    • Para cima: Não está funcionando
    • Down: Não está funcionando
  • Solução 3
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem

IE 8 (vitória 7)

  • Solução 1
    • Para cima: 2 eventos por 1 rolagem (efeito colateral: rolagem para baixo ocorrida no final)
    • Abaixo: 2 a 4 eventos por 1 rolagem
  • Solução 2
    • Para cima: Não está funcionando
    • Down: Não está funcionando
  • Solução 3
    • Até: 1 evento por 1 rolagem
    • Abaixo: 1 evento por 1 rolagem

Solução combinada

Eu verifiquei que o efeito colateral do IE 11 e IE 8 é proveniente da if elsedeclaração. Então, substituí-o com a if else ifseguinte declaração.

No teste de vários navegadores, decidi usar a Solução 3 para navegadores comuns e a Solução 1 para o Firefox e o IE 11.

Eu indiquei esta resposta para detectar o 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');
            }
        });
    }
Programador químico
fonte
Se alguém pudesse adicionar resultado Safari browser, seria útil complementar a solução.
Chemical programador
Opa! Descobri que o navegador padrão Mobile Chrome e Android é coberto apenas pela solução 1. Portanto, seria melhor usar as soluções 1 e 3 juntas para cobrir vários navegadores.
Chemical programador
Não funcionará se o design for um layout fixo. Se você quiser detectar a direção de rolagem em um site estático não-scroll, Firefox e IE11 não vai funcionar
Shannon Hochkins
Eu acho que quando eu uso isso, ele usa os "Outros Navegadores" no chrome, isso não é muito útil quando você deseja detectar a rolagem pela roda do mouse e pela barra de rolagem. .scroll detectará os dois tipos de rolagem no chrome.
Sam
12

Entendo que já houve uma resposta aceita, mas queria postar o que estou usando, caso isso possa ajudar alguém. Eu recebo a direção como cliphexno evento mousewheel, mas com suporte ao Firefox. É útil fazê-lo dessa maneira, caso esteja fazendo algo como bloquear a rolagem e não conseguir obter o topo da rolagem atual.

Veja uma versão ao vivo aqui .

$(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
    }
});
souporserious
fonte
@ EtienneMartin, o código acima depende do jQuery, se foi o que estava causando o seu erro. Por favor, veja o violino em anexo para vê-lo funcionando.
souporserious 28/01
8

Evento de rolagem

O evento de rolagem se comporta de maneira estranha no FF (é disparado várias vezes devido à rolagem de suavidade), mas funciona.

Nota: O evento de rolagem é acionado ao arrastar a barra de rolagem, usando as teclas do cursor ou a roda do 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 roda

Você também pode dar uma olhada no MDN, que expõe ótimas informações sobre o evento Wheel .

Nota: O evento wheel é acionado apenas ao usar o mousewheel ; teclas do cursor e arrastar a barra de rolagem não acionam o evento.

Li o documento e o exemplo: Ouvindo esse evento no navegador
e depois de alguns testes com FF, IE, chrome, safari, acabei com este trecho:

//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);
});
jherax
fonte
2
Eu tenho uma vista de painel fixa que desativa a barra de rolagem real, então eu precisava detectar a direção da roda do mouse. Sua solução de roda do mouse funcionou perfeitamente em todos os navegadores, então muito obrigado por isso!
Shannon Hochkins
8

Caso você queira apenas saber se você rola para cima ou para baixo usando um dispositivo apontador (mouse ou track pad), pode usar a propriedade deltaY do 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>

Yuri
fonte
Esta ligação não diz contar com 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; 
} 

ou use a extensão da roda do mouse , veja aqui .

Adão
fonte
3

Eu já vi muitas versões de boas respostas aqui, mas parece que algumas pessoas estão tendo problemas entre navegadores, então essa é a minha correção.

Eu usei isso com sucesso para detectar a direção no FF, IE e Chrome ... Não testei no safari, pois normalmente uso o 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");
        }
    }
});

Lembre-se de que eu também uso isso para interromper a rolagem. Portanto, se você deseja que a rolagem ainda ocorra, remova o e.preventDefault(); e.stopPropagation();

GoreDefex
fonte
11
sempre retorna para baixo em GS5 android
SISYN
Isso funcionou muito bem! Eu tive um problema com a resposta mais votada no IE. Isso não tem esse problema! +1 de mim.
Radmation
3

Para ignorar qualquer pressão / momento / retorno na parte superior e inferior da página, aqui está uma versão modificada da resposta aceita 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;
});
Andrew Tibbetts
fonte
3

Você pode determinar a direção do 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');
    }
});
J. Kovacevic
fonte
3

Use isso para encontrar a direção da rolagem. Isso é apenas para encontrar a direção do Rolagem Vertical. Suporta todos os 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");
        }

    }

Exemplo

Vasi
fonte
3

este código funciona bem com o IE, Firefox, Opera e Chrome:

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

'wheel mousewheel' e a propriedade deltaY devem ser usadas na função bind () .

Lembre-se: seu usuário deve atualizar o sistema e os navegadores por motivos de segurança. Em 2018, as desculpas de "Eu tenho o IE 7" são um absurdo. Nós devemos educar os usuários.

Tenha um bom dia :)

Cyril Morales
fonte
11
Eu tentei o seu código e é o contrário. O primeiro é acionado ao rolar para baixo e o segundo ao rolar para cima.
AlexioVay
Oi :) Obrigado AlexioVay. Eu editei meu código (Sobre o tempo também!) ^^. Claro que "console.log ('.......')" é apenas um exemplo do que podemos fazer.
Cyril Morales
2

Mantenha super simples:

Caminho do jQuery Event Listener:

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

Maneira de ouvinte de evento do Vanilla JavaScript:

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

A função permanece a mesma:

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);
  }
}

Eu escrevi um post mais aprofundada sobre ele aqui

CR Rollyson
fonte
O jquery-wheel é necessário para usar a versão jquery?
Hastig Zusammenstellen
11
jquery-wheel não é necessário para isso @HastigZusammenstellen
CR Rollyson 26/09/17
2

Você pode usar as opções de rolagem e roda do mouse para rastrear o movimento para cima e para baixo ao mesmo tempo.

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

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

Você pode substituir 'corpo' por (janela) também.

Zeeshan Rasool
fonte
Parece funcionar bem no Chrome, mas não no FF (55.0.2, Ubuntu)
Hastig Zusammenstellen
1

Para estocar um incremento no .data ()elemento rolado, você poderá testar o número de vezes que o rolagem alcançou o topo.

Spacefrog
fonte
1

Por que ninguém usa o eventobjeto retornado pelo jQueryscroll?

$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();
});

Estou usando chromiume não verifiquei em outros navegadores se eles têm a dirpropriedade.

Jiab77
fonte
1

Como bindfoi preterido na v3 ("substituído por on") e wheelagora é suportado , esqueça 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>

wheelCompatibilidade do navegador do evento nos MDNs (2019-03-18) :

Compatibilidade do evento da roda

CPHPython
fonte
O código acima produz dois logs do console, use o seguinte para separar totalmente a parte superior / inferior / esquerda / direita: 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óvel .
CPHPython
1

Você pode usar isso também

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

arvinda kumar
fonte
0

no .data()elemento você pode armazenar um JSON e testar valores para ativar eventos

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

Essa é uma detecção simples e fácil para quando o usuário rolar para fora da parte superior da página e para quando voltar para o topo.

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

Esta é uma solução ideal para detectar a direção exatamente quando o usuário termina a rolagem.

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

});
Mahmoud
fonte
0

Você deve tentar isso

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();
    });
thakurdev
fonte
0

Tive problemas com a rolagem elástica ( deslocamento da rolagem, bandas de borracha). Ignorar o evento de rolagem para baixo, se próximo ao topo da página, funcionou para mim.

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;
});
uggeh
fonte
0

Isso funciona em todos os navegadores de PC ou telefone, expandindo as principais respostas. Pode-se construir uma janela de objeto de evento mais complexa ["scroll_evt"] e chamá-la na função handleScroll (). Este dispara para 2 condições simultâneas, se um certo atraso tiver passado ou um certo delta for passado para eliminar alguns disparos indesejados.

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"]);
}
Dexterial
fonte