FrontEnd

FOUC(Flash of Unstyled Content) 현상과 해결방법

범데이 2025. 9. 24. 23:30

웹 페이지를 개발하다 보면 페이지가 로드될 때 잠깐 스타일이 적용되지 않은 채 기본 브라우저 스타일로 보였다가 이후 CSS가 적용되면서 확 달라지는 경험을 느껴본 적이 있을 것이다.

 

이를 흔히 FOUC(Flash of Unstyled Content, 스타일 미적용 콘텐츠 깜빡임) 이라고 부른다.

 

 

왜 FOUC가 발생할까?

FOUC는 주로 CSS가 늦게 적용되면서 발생한다.

  1. 브라우저는 HTML을 먼저 파싱하고 DOM을 만든다.
  2. CSS 파일은 외부 리소스로, 네트워크를 통해 추가로 다운로드해야 한다.
  3. CSS가 아직 로드되지 않았는데도 브라우저는 일단 기본 스타일로 화면을 그린다.
  4. CSS가 로드되면 스타일이 다시 적용되면서 레이아웃과 디자인이 "훅" 바뀐다.

즉, 렌더링과 CSS 로딩 시점이 맞지 않아서 발생하는 문제이다.

 

 

 

실무에서 쓰는 해결책

1. Cirtical CSS 인라인

  • 페이지 로딩에 반드시 필요한 핵심 스타일(Critical CSS)을 <head> 에 직접 <style> 태그로 작성.
  • 나머지 부가 스타일은 별도의 CSS 파일로 defer/async 로딩.
  • 초기 렌더 시 꼭 필요한 스타일은 즉시 적용되므로 FOUC가 거의 사라짐.
<head>
  <style>
    body { font-family: sans-serif; }
    .btn { display: inline-block; padding: 8px 12px; }
  </style>
  <link rel="stylesheet" href="/css/app.css">
</head>

 

 

2. CSS 파일을 최대한 빠르게 로드

<link rel="stylesheet"> 를 반드시 <head> 안 가장 위쪽에 배치.

@import 문법은 CSS 로딩을 지연시키므로 피하는게 좋음.

 

 

3. HTML 요소에 width/height 같은 초기 속성 지정

- 특히 이미지/아이콘의 크기를 HTML 속성이나 인라인 스타일로 고정해두면 CSS가 늦게 와도 갑자기 줄어드는 현상을 막을 수 있음.

<img src="/img/icon.png" width="18" height="18" alt="">

 

 

4. 폰트 FOUT(Flash of Unstyled Text) 해결

  • 웹폰트 로딩 지연 시 기본 폰트가 깜빡이는 문제도 유사한 케이스.
  • font-display: swap; 또는 preload(<link rel="preload" as="font">)로 해결.

 

 

정리

오늘 개발 중 이미지 크기가 뒤늦게 적용되면서 화면이 깜빡이는 문제를 직접 겪으면서, 이게 바로 FOUC 현상이라는 걸 알게 되었다. 이런 현상은 DOM이 먼저 로드되고, CSS나 이미지 같은 정적 리소스가 뒤늦게 다운로드되면서 발생하는 문제이다.

 

따라서 실무에서는 단순히 스타일만 다루는 것이 아니라, 브라우저가 완성된 웹페이지를 표시하기까지 어떤 순서로 DOM과 정적 파일을 처리하는지, 그 타이밍과 원리를 숙지하는 것이 이런 깜빡임 문제를 예방하고 해결하는 데 훨씬 더 도움이 된다.

728x90
반응형