Sobes.tech
Middle

Czym jest Flash of Unstyled Content (FOUC)?

sobes.tech AI

Odpowiedź od AI

Fala nieuporządkowanej treści (FOUC) to tymczasowe wyświetlanie zawartości strony internetowej w przeglądarce przed zastosowaniem stylów CSS. Dzieje się tak z powodu sekwencyjnego ładowania i przetwarzania zasobów. Przeglądarka najpierw analizuje HTML i zaczyna go wyświetlać, a następnie ładuje i stosuje style z zewnętrznych plików CSS lub tagu <style>. W tym okresie użytkownik widzi "goły" HTML.

Przyczyny FOUC:

  • Niska prędkość sieci: Wolne połączenie zwiększa czas ładowania CSS.
  • Duży rozmiar CSS: Im większy rozmiar stylów, tym dłużej się ładują i analizują.
  • Blokujące style: Jeśli style są dołączone po HTML, przeglądarka może rozpocząć renderowanie przed ich pełnym załadowaniem.
  • JavaScript modyfikujący CSS: Skrypty, które dynamicznie dodają lub zmieniają style, mogą powodować FOUC.

Typowe scenariusze FOUC:

  • Tekst jest wyświetlany domyślną czcionką przeglądarki, a następnie nagle zmienia się na zdefiniowaną w CSS.
  • Elementy resetują swoje pozycjonowanie lub widoczność.
  • Siatka układu "rozpada się", a potem jest odbudowywana.

Sposoby zapobiegania FOUC:

  • Podłączenie CSS w <head>: To najskuteczniejsza metoda. Przeglądarki wstrzymują renderowanie do czasu załadowania wszystkich stylów zdefiniowanych w <head>, jeśli są oznaczone jako blokujące (domyślnie dla <link rel="stylesheet">).
    <!-- Poprawnie: CSS w head -->
    <head>
        <link rel="stylesheet" href="styles.css">
        <title>Moja strona</title>
    </head>
    <body>
        <!-- Zawartość -->
    </body>
    
    <!-- Niepoprawnie: CSS w body (może wywołać FOUC) -->
    <head>
        <title>Moja strona</title>
    </head>
    <body>
        <link rel="stylesheet" href="styles.css">
        <!-- Zawartość -->
    </body>
    
  • Krytyczne style inline: Wstawienie głównych stylów bezpośrednio w tag <style> w <head> pozwala szybko zastosować podstawowe formatowanie przed załadowaniem zewnętrznych arkuszy stylów.
    <head>
        <style>
            body { font-family: sans-serif; }
            /* Krytyczne style */
        </style>
        <link rel="stylesheet" href="styles.css">
        <title>Moja strona</title>
    </head>
    <body>
        <!-- Zawartość -->
    </body>
    
  • Użycie font-display: swap: Dla czcionek, aby uniknąć migotania tekstu bez stylu (FOUT), wyświetla się systemową czcionkę, dopóki nie załaduje się czcionka niestandardowa.
    @font-face {
      font-family: 'MyCustomFont';
      src: url('mycustomfont.woff2') format('woff2');
      font-display: swap;
    }
    
  • Ukrywanie treści do czasu załadowania stylów: Można użyć JavaScript, aby ukryć główną zawartość do czasu załadowania wszystkich stylów (mniej zalecane ze względu na zależność od JS i potencjalne spowolnienie).
    <style>
      .hidden { display: none; }
    </style>
    <body class="hidden">
      <!-- Zawartość -->
      <script>
        // Przykład: pokazanie body po załadowaniu stylów
        // W rzeczywistych warunkach trzeba dokładniej monitorować ładowanie CSS
        document.addEventListener('DOMContentLoaded', function() {
            document.body.classList.remove('hidden');
        });
      </script>
    </body>
    

FOUC negatywnie wpływa na doświadczenie użytkownika i postrzeganie strony jako "zepsutej" lub wolnej, dlatego jego minimalizacja jest ważną częścią optymalizacji front-end.