Exclua suas funções de tempo limite e remova os bugs. Este é o evento de que você realmente precisa: o botão de rolagem.
Antes do evento scrollend
, não havia uma maneira confiável de detectar que uma rolagem
estava concluída. Isso significa que os eventos eram acionados com atraso ou enquanto o dedo de um usuário
ainda estava na tela. Essa falta de confiabilidade em saber quando a rolagem
realmente terminou levou a bugs e uma experiência ruim para o usuário.
document.onscroll = event => { clearTimeout(window.scrollEndTimer) window.scrollEndTimer = setTimeout(callback, 100) }
A melhor estratégia que essa estratégia setTimeout()
pode fazer é saber se a rolagem parou por
100ms
. Isso faz com que o evento pareça mais com um evento de rolagem pausada, não um evento de rolagem
finalizada.
Após o evento
scrollend
,
o navegador faz toda essa avaliação difícil para você.
document.onscrollend = event => {…}
Isso é bom. Temporizado perfeitamente e cheio de condições significativas antes da emissão.
Faça um teste
Detalhes do evento
O evento scrollend
é disparado quando:
- O navegador não está mais animando nem traduzindo rolagem.
- O toque do usuário foi liberado.
- O ponteiro do usuário liberou o polegar de rolagem.
- O pressionamento de tecla do usuário é liberado.
- A rolagem para o fragmento foi concluída.
- O ajuste de rolagem foi concluído.
- scrollTo()
foi concluído.
- O usuário rolou a janela de visualização visual.
O evento scrollend
não é acionado quando:
- O gesto de um usuário não resulta em nenhuma mudança de posição de rolagem (nenhuma tradução ocorreu).
- scrollTo()
não resultou em nenhuma tradução.
Uma das razões para esse evento demorar tanto para chegar à plataforma da Web foi devido aos muitos
pequenos detalhes que precisavam de especificações. Uma das áreas mais complexas
foi articular os detalhes de scrollend
para o Visual Viewport
em comparação com o documento. Considere uma página da Web em que você aplica zoom. Você pode rolar
neste estado com zoom, e não necessariamente rolando
documento. Tenha certeza de que mesmo essa rolagem visual orientada pelo usuário
interação vai emitir o evento scrollend
quando ele for concluído.
Como usar o evento
Assim como outros eventos de rolagem, é possível registrar listeners de duas maneiras.
addEventListener("scrollend", (event) => {
// scroll ended
});
aScrollingElement.addEventListener("scrollend", (event) => {
// scroll ended
});
ou use a propriedade do evento:
document.onscrollend = (event) => {
// scroll ended
};
aScrollingElement.onscrollend = (event) => {
// scroll ended
};
Polipreenchimentos e aprimoramento progressivo
Se você quiser usar esse novo evento agora, confira nossas recomendações. Você pode continuar usando sua estratégia atual de fim de rolagem (se tiver uma) e, no início dela, verificar o suporte com:
'onscrollend' in window
// true, if available
Isso vai informar "verdadeiro" ou "falso", dependendo se o navegador oferece o evento. Com é possível ramificar o código:
if ('onscrollend' in window) {
document.onscrollend = callback
}
else {
document.onscroll = event => {
clearTimeout(window.scrollEndTimer)
window.scrollEndTimer = setTimeout(callback, 100)
}
}
Esse é um bom começo para melhorar progressivamente seu evento scrollend
quando ele
está disponível. Você também pode tentar
polyfill (em inglês)
(NPM) Fiz isso da melhor forma possível.
o navegador pode:
import {scrollend} from "scrollyfills"
// then use scrollend as if it's existed this whole time
document.onscrollend = callback
O polyfill será aprimorado progressivamente para usar o navegador integrado scrollend
se disponível. Se ele não estiver disponível, o script vai monitorar os eventos do ponteiro e
rolar para fazer a melhor estimativa do término do evento possível.
Casos de uso
É uma boa prática evitar trabalhos computacionalmente pesados enquanto a rolagem está
acontecendo. Essa prática garante que a rolagem seja livre para usar o máximo de memória e
processamento possível para manter a experiência suave. Usar um evento scrollend
oferece o momento perfeito para chamar e fazer o trabalho pesado, porque a rolagem não
está mais acontecendo.
O evento scrollend
pode ser usado para acionar várias ações. Um caso de uso comum
é sincronizar elementos de IU associados com a posição em que a rolagem
foi interrompida. Por exemplo:
- Sincronização de uma posição de rolagem do carrossel com um indicador de ponto.
- Sincronizar um item da galeria com os metadados.
- Buscar dados depois que um usuário rolar para uma nova guia.
Imagine um cenário como um usuário arrastando um e-mail para fora. Depois que o usuário terminar de deslizar, você poderá realizar a ação com base no local para onde ele rolou.
Você também pode usar esse evento para sincronizar após eventos programáticos ou rolagem ou ações, como a Análise de dados de registros.
Este é um bom exemplo em que vários elementos, como setas, pontos e foco, precisam ser atualizados com base na posição de rolagem. Confira como criei este carrossel no YouTube. Além disso, teste a demonstração ao vivo.
Agradecemos a Mehdi Kazemi pelo trabalho de engenharia e a Robert Flack pelas orientações sobre API e implementação.