Como tratar carregamentos que demoram muito

Mostre que o sistema está trabalhando, represente o progresso quando possível e ofereça continuidade, cancelamento ou recuperação em esperas longas.

Wireframe minimalista de carregamento demorado com progresso visível e tarefa em segundo plano
Nível de impácto
Alto
Status
Recomendado
Nível de evidênica
Evidência moderada

Contexto

Quando uma resposta demora, a pessoa precisa entender se o sistema está trabalhando, quanto já avançou e o que pode fazer enquanto espera. O tratamento deve considerar duração esperada, progresso mensurável, escopo afetado e possibilidade de continuar sem bloqueio.

Escolha o indicador pelo tipo de espera e pelo escopo afetado. Para uma espera curta, evite fazer o indicador piscar. Para uma espera variável, use um estado indeterminado e contextualizado. Quando o avanço puder ser calculado, mostre progresso determinado. Em tarefas longas, preserve o trabalho e permita continuar em segundo plano, cancelar ou recuperar o resultado quando isso for seguro.

Em operações com menos de um segundo, normalmente não exiba um indicador para evitar um flash. Entre um e três segundos, use carregamento indeterminado e localizado se a espera for perceptível.

Acima de três segundos, prefira progresso determinado quando houver uma estimativa confiável. Caso contrário, mantenha o estado indeterminado com contexto. Acima de dez segundos, evite um spinner indefinido: informe o estado, preserve a tarefa e, quando possível, permita continuar, cancelar ou acompanhar depois.

Use skeleton quando a estrutura do conteúdo for conhecida e as partes puderem aparecer gradualmente. Substitua o carregamento por sucesso, erro ou cancelamento assim que o estado mudar.

Em envios, impeça cliques duplicados sem apagar dados nem esconder o estado da operação.

Base da recomendação

Os intervalos são heurísticas cruzadas de NN/g, Primer e Carbon, não limites universais. Baymard fornece evidência contextual de impaciência e cliques repetidos em fluxos lentos; o W3C define como comunicar mensagens de status sem exigir mudança de foco.

Componente Loading do Design System GOV.BR com estado determinado e indeterminado
Exemplo real: o Design System GOV.BR apresenta lado a lado um loading determinado, com progresso de 75% e opção de cancelar, e um loading indeterminado, que comunica processamento sem prometer duração. A captura demonstra quando representar avanço e quando apenas informar a espera. Fonte: Design System GOV.BR — Loading: https://www.gov.br/ds/components/loading

Porque isso importa?

Sem feedback, uma espera parece falha ou travamento. A pessoa pode repetir o clique, abandonar a tarefa ou perder a confiança no resultado.

A NN/g relaciona indicadores dinâmicos à redução da incerteza e à maior tolerância à espera. Em testes de checkout, a Baymard observou impaciência e cliques repetidos quando etapas demoravam vários segundos sem indicar que o sistema estava trabalhando. Um indicador claro não torna o processo mais rápido, mas ajuda a pessoa a decidir se deve esperar, continuar ou tentar outra ação.

O estado também precisa ser comunicado a tecnologias assistivas sem mover o foco. Quando existe avanço real, a porcentagem pode informar a situação; quando não existe, um status curto e atualizado é mais apropriado.

  • Buscas, filtros ou carregamento de dados que podem levar mais que alguns segundos.
  • Envios, salvamentos, importações, exportações e cálculos demorados.
  • Operações cujo tempo varia conforme a rede, o volume de dados ou um serviço externo.
  • Processos que podem continuar em segundo plano sem impedir a tarefa principal.
  • Operações tão rápidas que o indicador apenas pisca.
  • Spinner indefinido sem contexto, saída ou estado de erro.
  • Vários indicadores competindo na mesma tela.
  • Overlay de página inteira para uma área pequena.
  • Porcentagem que parece precisa, mas não representa avanço real.
  • Skeleton usado quando não se conhece a estrutura do conteúdo.
Barra de progresso do GitHub Primer em 33 por cento
Exemplo real: o GitHub Primer mostra uma barra de progresso determinada para uma tarefa em andamento. A imagem evidencia que o progresso deve estar associado a uma medida de avanço, enquanto o padrão Loading orienta usar indicadores indeterminados quando a duração é variável ou desconhecida. Fonte: GitHub Primer — Loading: https://primer.style/product/ui-patterns/loading/

Recomendações

Faça

Práticas recomendadas
  • Indique o escopo da espera.
  • Mostre progresso mensurável.
  • Preserve contexto e dados.
  • Ofereça recuperação.
Wireframe de carregamento localizado com progresso mensurável e tarefa preservada
Exemplo correto: o carregamento está limitado à área afetada, mostra avanço mensurável e mantém o restante da interface estável. Ilustração didática criada para a CamaraUX com base em NN/g, Baymard, Primer, Carbon e W3C.

Evite

Práticas a evitar
  • Spinner sem explicação.
  • Bloqueio desnecessário.
  • Cliques duplicados.
  • Promessas de tempo imprecisas.
Wireframe de carregamento demorado com múltiplos spinners e tela bloqueada
Exemplo incorreto: a tela inteira parece bloqueada, há vários indicadores competindo e não existe contexto claro nem recuperação visível. Ilustração didática criada para a CamaraUX.
Loading grande do IBM Carbon em uma interface de produto
Exemplo real: o IBM Carbon demonstra um loading grande em contexto de produto. A documentação orienta usar esse estado para recuperar dados ou executar cálculos demorados, preferindo skeleton quando o conteúdo aparece progressivamente e evitando múltiplos loaders simultâneos. Fonte: IBM Carbon Design System — Loading: https://carbondesignsystem.com/components/loading/usage/

Acessibilidade

Associe o estado a um texto compreensível, como “Carregando resultados”, e exponha as mudanças sem exigir que a pessoa mova o foco. Use role="status" ou aria-live="polite" para mensagens apropriadas ao contexto e aria-busy="true" na região afetada quando fizer sentido. Use a semântica de barra de progresso somente quando houver valor atual e, se possível, valor máximo; não invente aria-valuenow para um progresso indeterminado. Não dependa de cor, movimento ou som e respeite a preferência de reduzir movimento. Informe conclusão, falha e cancelamento de forma perceptível e programaticamente determinável.

Checklist

  • O estado informa o que está carregando?
  • O indicador aparece no escopo correto?
  • A espera curta evita um piscar desconfortável?
  • A porcentagem representa avanço real?
  • O skeleton corresponde à estrutura esperada?
  • A pessoa pode continuar, cancelar ou acompanhar depois?
  • O carregamento termina em sucesso, erro ou cancelamento?
  • O sistema evita envios duplicados?
  • O status é percebido sem mover o foco?
  • O comportamento foi testado com teclado, zoom e leitor de tela?

Referências

Nielsen Norman Group — Progress Indicators Make a Slow System Less Insufferable. Relaciona feedback de espera à visibilidade do estado do sistema, à redução da incerteza e à tolerância a processos demorados. A orientação de indicador para esperas longas embasa o princípio de não deixar a pessoa sem retorno. Consultar a pesquisa.

Baymard Institute — Online Grocery UX: 4 Best Practices. Em testes de comércio eletrônico, relata impaciência e cliques repetidos quando etapas lentas não mostram que o sistema está trabalhando; sustenta feedback de carregamento e prevenção de envios duplicados. Consultar o estudo.

GitHub Primer — Loading. Diferencia esperas curtas, carregamento indeterminado, progresso determinado e tarefas longas; também orienta quando não bloquear outras interações e quando trocar o estado por conteúdo ou erro. Consultar o padrão Loading.

IBM Carbon Design System — Loading. Orienta usar loading para operações demoradas, preferir skeleton quando o conteúdo aparece progressivamente, escolher o escopo do indicador e evitar vários loaders simultâneos. Consultar a orientação de uso.

W3C/WAI — WCAG 2.2, Status Messages. Base normativa para que progresso, espera, sucesso e erro sejam determináveis por programa sem exigir que a pessoa mova o foco. Consultar o critério 4.1.3.

As fontes foram cruzadas: Baymard e NN/g fornecem evidência de usabilidade e percepção; Primer e Carbon documentam padrões de produto; W3C define o requisito de acessibilidade. Os intervalos de tempo são heurísticas de projeto, não uma regra universal de nenhum Design System isolado.

Veja também

Esta recomendação foi útil para você?