Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Detectar a direção do scroll é uma necessidade comum em interfaces modernas, principalmente para implementar comportamentos dinâmicos e melhorar a experiência do usuário. Apesar de a maioria dos exemplos tradicionais recorrerem ao jQuery, é perfeitamente possível fazer isso com JavaScript puro, o que traz benefícios de desempenho e menor dependência de bibliotecas externas.
---
Quando se trabalha com scroll, a questão de saber se o usuário está descendo ou subindo a página é fundamental para diversas funcionalidades: esconder ou mostrar elementos, carregar conteúdo assíncrono, ou ajustar a navegação.
No entanto, muitos desenvolvedores ainda enfrentam dificuldades ao tentar fazer essa detecção de forma confiável usando apenas JavaScript nativo. O código que tenta comparar o valor atual do scroll com um valor anterior muitas vezes não funciona como esperado, especialmente em diferentes navegadores ou dispositivos móveis. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
---
O erro mais frequente é tentar usar propriedades como scrollTop de document.body ou document.documentElement sem considerar as diferenças entre navegadores e o contexto de scroll (seja na janela ou em elementos específicos). Além disso, esquecer de atualizar uma variável que armazena o último valor de scroll faz com que a detecção seja sempre incorreta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Outro ponto é a dificuldade de lidar com scroll horizontal versus vertical, o que pode causar confusão na implementação.
Por fim, há também o risco de executar funções demais em cada evento de scroll, causando lentidão ou travamentos na interface. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
---
A técnica mais recomendada é armazenar o valor de scrollTop da última leitura e, ao escutar o evento de scroll, comparar esse valor com o atual. Assim, consegue-se determinar a direção: A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
var lastScrollTop = 0. window.addEventListener("scroll", function() {
var st = window.pageYOffset || document.documentElement.scrollTop. if (st > lastScrollTop) {
// Scroll para baixo
console.log("Desceu")
} else if (st < lastScrollTop) {
// Scroll para cima
console.log("Subiu")
}
lastScrollTop = st <= 0 ? 0 : st. // para mobile ou scroll negativo
}).
Esse método é confiável e simples, além de fácil de adaptar para diferentes elementos de scroll.
---
Apesar de eficiente, essa abordagem exige que você gerencie o armazenamento de lastScrollTop corretamente, evitando bugs de comparação ou atualização incorreta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Se o seu site tem muitos elementos com scroll independente, será necessário aplicar esse método para cada um, o que pode impactar na performance. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Além disso, para cenários de rolagem muito rápida ou com animações suaves, essa detecção pode ficar menos precisa, exigindo ajustes finos ou debounce para limitar a frequência das verificações. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Outro ponto que pesa é a acessibilidade e a experiência do usuário: detectar a direção do scroll deve sempre estar alinhado ao contexto de uso, para evitar ações que possam confundir ou frustrar o usuário. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
---
requestAnimationFrame ou debounce para limitar a quantidade de chamadas ao evento de scroll.Se sua aplicação precisa de uma solução robusta para múltiplos elementos, talvez valha a pena explorar bibliotecas leves que encapsulam essa lógica, mas sempre com atenção ao custo de performance. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
---
Concluindo, a detecção manual da direção do scroll com JavaScript nativo é viável, confiável e bastante direta. O segredo está em manter o controle do último valor e fazer comparações inteligentes. Quando bem implementada, essa técnica evita dependências extras e pode melhorar a responsividade da sua interface. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Eu faria um debounce na função de scroll, ajuda a evitar chamadas excessivas. E também tes tar em vários navegadores, pq cada um tem suas nuances. Mas, no geral, essa técnica é sólida.
Gostei da explicação, ajuda bastante pra quem precisa evitar dependências. Mas no meu time, a gente sempre testa em dispositivos móveis, e às vezes o scroll fica estranho. Alguma dica pra melhorar essa detecção nesses casos?
No meu caso, usar
requestAnimationFramedeu uma melhoria na responsividade.