0Pricing
HTML Academy · Aula

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

  1. API IntersectionObserver e limiares
  2. Carregamento tardio com IntersectionObserver
  3. Implementação de rolagem infinita
  4. Configuração de animações vinculadas à rolagem
← Voltar para HTML Academy