Sobes.tech
Middle

O que é o Flash of Unstyled Content (FOUC)?

sobes.tech IA

Resposta da IA

O Flash de Conteúdo Não Estilizado (FOUC) é a exibição temporária do conteúdo de uma página web no navegador antes da aplicação dos estilos CSS. Isso ocorre devido ao carregamento e processamento sequencial de recursos. O navegador primeiro analisa o HTML e começa a exibi-lo, depois carrega e aplica os estilos de ficheiros CSS externos ou da tag <style>. Nesse intervalo, o utilizador vê HTML "puro".

Razões para o FOUC:

  • Velocidade de rede baixa: Uma ligação lenta aumenta o tempo de carregamento do CSS.
  • Grande volume de CSS: Quanto maior o tamanho dos estilos, mais tempo levam a carregar e analisar.
  • Estilos bloqueantes: Se os estilos estiverem ligados após o HTML, o navegador pode começar a renderizar antes de serem totalmente carregados.
  • JavaScript que modifica CSS: Scripts que adicionam ou alteram estilos dinamicamente podem causar FOUC.

Cenários típicos de FOUC:

  • O texto é exibido com a fonte padrão do navegador e depois muda abruptamente para a definida no CSS.
  • Elementos redefinem seu posicionamento ou visibilidade.
  • A grelha de layout "desfaz-se" e depois reconstrói-se.

Formas de prevenir o FOUC:

  • Ligar CSS no <head>: É a forma mais eficaz. Os navegadores suspendem o renderizado até que todos os estilos definidos em <head> sejam carregados, se estiverem marcados como bloqueantes (por padrão para <link rel="stylesheet">).
    <!-- Correto: CSS no head -->
    <head>
        <link rel="stylesheet" href="styles.css">
        <title>Minha Página</title>
    </head>
    <body>
        <!-- Conteúdo -->
    </body>
    
    <!-- Incorreto: CSS no body (pode causar FOUC) -->
    <head>
        <title>Minha Página</title>
    </head>
    <body>
        <link rel="stylesheet" href="styles.css">
        <!-- Conteúdo -->
    </body>
    
  • Estilos críticos inline: Inserir os estilos principais diretamente na tag <style> em <head> permite aplicar rapidamente o layout básico antes do carregamento de folhas de estilo externas.
    <head>
        <style>
            body { font-family: sans-serif; }
            /* Estilos críticos */
        </style>
        <link rel="stylesheet" href="styles.css">
        <title>Minha Página</title>
    </head>
    <body>
        <!-- Conteúdo -->
    </body>
    
  • Usar font-display: swap: Para fontes, para evitar o flash de texto não estilizado (FOUT), mostra-se a fonte do sistema até que a fonte personalizada seja carregada.
    @font-face {
      font-family: 'MyCustomFont';
      src: url('mycustomfont.woff2') format('woff2');
      font-display: swap;
    }
    
  • Esconder conteúdo até que os estilos carreguem: Pode usar JavaScript para esconder o conteúdo principal até que todos os estilos estejam carregados (menos recomendado devido à dependência de JS e possível lentidão).
    <style>
      .hidden { display: none; }
    </style>
    <body class="hidden">
      <!-- Conteúdo -->
      <script>
        // Exemplo: mostrar o body após carregar estilos
        // Em condições reais, é necessário acompanhar mais de perto o carregamento do CSS
        document.addEventListener('DOMContentLoaded', function() {
            document.body.classList.remove('hidden');
        });
      </script>
    </body>
    

O FOUC afeta negativamente a experiência do utilizador e a perceção do site como "partido" ou lento, por isso a sua minimização é uma parte importante da otimização frontend.