Implementação de rolagem infinita
Carregue mais conteúdo automaticamente enquanto o usuário rola a página.
Implementação de rolagem infinita é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
O padrão
A rolagem infinita carrega mais conteúdo à medida que o usuário se aproxima do fim da lista. A implementação mais simples usa IntersectionObserver: coloque um elemento "sentinel" no fim da lista e observe-o. Quando o sentinel entrar na área visível, busque a próxima page.
Elemento sentinel
Anexe um <div> invisível (ou um marcador de "carregando...") após o último item da lista. Observe-o com IntersectionObserver. Quando houver interseção, isso indica que o usuário rolou para perto do fim — é hora de buscar mais conteúdo.
<ul id="feed">
<li>Post 1</li>
<li>Post 2</li>
</ul>
<div id="sentinel" aria-hidden="true"></div>O ciclo do observador
Ao ocorrer uma interseção: busque a próxima page, renderize os novos itens e reposicione o sentinel (ele permanece automaticamente no fim da lista se os itens forem anexados antes dele). Não é necessário deixar de observar e observar novamente — o sentinel continua sendo observado.
const sentinel = document.getElementById("sentinel");
const feed = document.getElementById("feed");
let page = 1;
let loading = false;
const observer = new IntersectionObserver(async (entries) => {
if (!entries[0].isIntersecting || loading) return;
loading = true;
const items = await fetchPage(page++);
items.forEach((it) => feed.insertAdjacentHTML("beforeend", renderItem(it)));
loading = false;
});
observer.observe(sentinel);Proteção do estado de carregamento
Uma variável booleana loading impede o acúmulo de solicitações se o usuário rolar rapidamente e provocar várias interseções antes da chegada da primeira resposta. Sem ela, a mesma page é buscada repetidamente e os itens aparecem duplicados.
Fim dos dados
Quando o servidor retornar uma page vazia (ou indicar "não há mais"), deixe de observar o sentinel e substitua-o por uma mensagem de fim de lista. Interseções futuras não iniciarão buscas; o usuário verá que chegou ao fim.
Tratamento de erros
Envolva a busca em try/catch. Em caso de erro, mantenha loading = true para que novas tentativas não sejam disparadas automaticamente; mostre um botão "Tentar novamente" que redefina loading e acione o carregamento outra vez. Sem isso, falhas de rede provocam ondas de novas tentativas.
rootMargin para carregamento antecipado
rootMargin: "500px" inicia a próxima busca 500 pixels antes de o usuário chegar ao sentinel. Ajuste o valor com base na altura dos itens e na velocidade média de rolagem — se for pequeno demais, os usuários encontrarão a mensagem "nenhum conteúdo ainda"; se for grande demais, você buscará conteúdo antes de precisar dele.
Restauração da posição de rolagem
Quando o usuário sair da página e voltar, a posição de rolagem deverá ser preservada AND os itens carregados anteriormente deverão ser renderizados novamente. Armazene os itens em sessionStorage ou em um armazenamento no estilo Zustand; restaure-os na montagem e use scrollTo para retornar ao deslocamento lembrado.
Considerações sobre memória
Rolagens infinitas longas acumulam milhares de nós do DOM. Para um feed muito longo (Twitter, Facebook), combine com janelamento: remova do DOM os itens acima da área visível e restaure-os ao rolar para cima. Bibliotecas como react-virtual ou @tanstack/virtual fazem isso com eficiência.
Acessibilidade
A rolagem infinita é hostil a usuários de teclado e leitores de tela que não conseguem chegar facilmente ao rodapé. Ofereça um botão alternativo "Carregar mais" como alternativa e garanta que a página tenha um rodapé real acessível pelas teclas Início/Fim. Uma região aria-live que anuncie os novos itens também ajuda.
Rolagem com efeito de elástico em dispositivos móveis
A rolagem com efeito de elástico do iOS pode provocar várias interseções perto do fim. A proteção de carregamento lida com a maioria dos casos; também pode ser útil aplicar uma espera antirruído de 300 ms para filtrar a sequência de interseções durante o efeito de elástico.
Alternativa: paginação baseada em cursor
As APIs do servidor devem retornar um "próximo cursor" em vez de depender de números de page controlados pelo cliente — uma abordagem resistente a inserções e exclusões de itens durante a rolagem. O cliente envia o cursor em cada solicitação e para quando o servidor não retorna um cursor.
Verificação de conhecimentos
Por que um indicador de "carregamento" é necessário em um callback de rolagem infinita do IntersectionObserver?
Resumo
A rolagem infinita usa um IntersectionObserver em um elemento sentinela no final da lista. Ao ocorrer a interseção, busque a próxima página, renderize-a e continue observando. Proteja com um indicador de carregamento, trate o fim dos dados e os erros de forma adequada e ajuste rootMargin para a distância de pré-busca. Ofereça alternativas de teclado (botão "Carregar mais") e considere o uso de janelas para feeds muito longos.
Perguntas Frequentes
A aula “Implementação de rolagem infinita” é grátis?
Sim — o texto completo de “Implementação de rolagem infinita” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “Implementação de rolagem infinita”?
Carregue mais conteúdo automaticamente enquanto o usuário rola a página. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Implementação de rolagem infinita”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- API IntersectionObserver e limiares
- Carregamento tardio com IntersectionObserver
- Implementação de rolagem infinita
- Configuração de animações vinculadas à rolagem