Главная Статьи Оптимизация

Критический CSS и рендер-блокировка

Бывает, что файлы сайта уже сжаты и облегчены, а страница всё равно показывается с задержкой — секунду висит белый экран. Чаще всего виновата рендер-блокировка: браузер не рисует страницу, пока не загрузит все стили и часть скриптов. Критический CSS — приём, который убирает эту задержку. Разберём, как он работает.

Что такое рендер-блокировка

Чтобы нарисовать страницу, браузеру нужны стили — иначе он покажет «голый» неоформленный текст, который тут же перерисуется. Поэтому по умолчанию браузер ждёт: сначала качает весь файл CSS, разбирает его, и только потом рисует. Пока CSS грузится — пользователь видит пустоту. То же с обычными скриптами в начале страницы: они тоже останавливают отрисовку. Это и есть рендер-блокировка — ресурсы, которые задерживают первое появление содержимого.

Идея критического CSS

Хитрость в том, что для показа первого экрана нужна лишь небольшая часть всех стилей — те, что оформляют шапку и видимый блок. Остальное (стили подвала, форм внизу, всплывающих окон) на старте не требуется. Критический CSS — это как раз стили первого экрана, которые встраивают прямо в код страницы, чтобы браузер нарисовал её сразу, не дожидаясь загрузки внешнего файла. А полный CSS подгружают следом, не блокируя отрисовку.

<!-- критичные стили сразу в странице -->
<style> /* стили первого экрана */ </style>
<!-- полный CSS грузится, не блокируя показ -->
<link rel="preload" as="style" href="full.css">

В итоге страница появляется почти мгновенно с правильным оформлением сверху, а остальные стили «доезжают» незаметно.

А что со скриптами

Скрипты блокируют отрисовку так же, как стили. Чтобы они не мешали, к ним добавляют атрибуты defer или async — тогда скрипт грузится, не останавливая показ страницы, и выполняется позже. Тяжёлый JavaScript — одна из главных причин медленной первой отрисовки, и перенос его «вниз» через defer обычно даёт заметный прирост.

⚠️ Не увлекайтесь. Встраивать в страницу весь CSS — плохая идея: код раздуется, потеряется кэширование, и каждая страница станет тяжёлой. В код выносят только критичные стили первого экрана (обычно небольшой объём), а основной файл оставляют внешним — его как раз выгодно кэшировать.

Как это сделать

Вручную выделять критический CSS трудоёмко, поэтому обычно используют автоматические инструменты и плагины оптимизации (на популярных CMS это часто галочка «оптимизировать загрузку CSS» / «устранить рендер-блокировку»). Они сами находят стили первого экрана, встраивают их и откладывают остальное. Это та оптимизация, которую PageSpeed прямо просит фразой «устраните ресурсы, блокирующие отображение».

Критический CSS работает в связке с минификацией и сжатием, а ускоряет он метрики Core Web Vitals — прежде всего время до первой отрисовки и LCP. Общий разбор — как ускорить загрузку сайта.

Коротко

Рендер-блокировка — это когда браузер не показывает страницу, пока не загрузит все стили и блокирующие скрипты, и пользователь видит белый экран. Критический CSS убирает задержку: стили первого экрана встраивают прямо в код, чтобы страница отрисовалась сразу, а полный CSS и скрипты грузят следом, не блокируя показ (скрипты — через defer/async). Главное — выносить в код только критичные стили, а не весь CSS. Делается это обычно автоматическими инструментами и плагинами оптимизации.

Частые вопросы

Что такое рендер-блокировка?
Это ресурсы, которые задерживают первое появление содержимого на экране. По умолчанию браузер не рисует страницу, пока не загрузит и не разберёт все стили (CSS) и блокирующие скрипты в начале страницы. Пока они грузятся, пользователь видит пустой белый экран — это и есть рендер-блокировка.
Что такое критический CSS?
Это стили, которые нужны для отрисовки только первого экрана страницы (шапки и видимого блока). Их встраивают прямо в код страницы, чтобы браузер показал содержимое сразу, не дожидаясь загрузки полного внешнего файла CSS. Остальные стили подгружаются следом, не блокируя отрисовку.
Как ускорить первую отрисовку страницы?
Вынести критический CSS (стили первого экрана) в код страницы, а полный файл стилей грузить асинхронно; добавить скриптам атрибуты defer или async, чтобы они не блокировали показ. Тяжёлый JavaScript — частая причина медленной отрисовки, и перенос его выполнения «вниз» обычно заметно помогает.
Можно ли встроить весь CSS в страницу?
Не стоит. Если встроить весь CSS, код страницы раздуется, пропадёт кэширование общего файла стилей, и каждая страница станет тяжёлой. В код выносят только небольшой критический CSS первого экрана, а основной файл оставляют внешним — его выгодно кэшировать, чтобы повторные визиты были быстрыми.
Как сделать критический CSS на практике?
Вручную это трудоёмко, поэтому обычно используют автоматические инструменты и плагины оптимизации. На популярных CMS есть настройки вроде «устранить рендер-блокировку» или «оптимизировать загрузку CSS» — они сами выделяют стили первого экрана, встраивают их и откладывают остальное. Эту же оптимизацию просит PageSpeed.