LCP: как оптимизировать Largest Contentful Paint

Как найти элемент LCP, его ресурс и путь доставки, а затем проверить улучшения для затронутых страниц по полевым и лабораторным данным.

Largest Contentful Paint (LCP) — метрика Core Web Vitals, которая влияет на ранжирование в Google с 2021 года. Это не просто техническое число: оно показывает, как быстро пользователь воспринимает страницу как загруженную. Плохой LCP означает, что посетитель видит пустой экран или незагрузившееся главное изображение и уходит, так и не дождавшись контента.

Шкала загрузки: LCP фиксируется в момент, когда отрисовывается самый крупный элемент в области просмотра. Цель — зелёная зона: меньше 2,5 с.
По данным Google, переход LCP из статуса «плохой» в «хороший» снижает показатель отказов в среднем на 24%. В интернет-магазинах это напрямую влияет на конверсию.

Что такое LCP и почему это важно

LCP измеряет время от начала навигации до момента, когда самый крупный элемент контента (текст или изображение) появляется в области просмотра. По этому порогу Google считает загрузку «завершённой» с точки зрения пользовательского опыта.

В отличие от FCP (First Contentful Paint), который срабатывает на первом пикселе, LCP отслеживает именно значимый контент. Страница может показать спиннер на 0,3 с, но если главное изображение появится на 5 с, LCP будет 5 с.

< 2,5 с

Хороший LCP

Зелёная зона Google. Цель для большинства страниц

2,5–4 с

Нужно улучшить

Жёлтая зона — LCP заметен пользователю, нужна оптимизация

> 4 с

Плохой LCP

Красная зона — заметный ущерб для UX и позиций

75-й

Перцентиль CrUX

Google оценивает LCP по 75-му перцентилю реальных пользователей Chrome

Google использует данные Chrome User Experience Report (CrUX) — реальные замеры реальных пользователей Chrome. Лабораторная оценка в PageSpeed Insights может быть зелёной, а CrUX при этом покажет жёлтый. Смотрите полевые данные CrUX: по ним Google принимает решения о ранжировании.

Какие элементы браузер считает кандидатами на LCP

Браузер отслеживает не все элементы. Он смотрит на определённые типы и в момент завершения загрузки выбирает самый большой по площади в области просмотра.

Элементы <img>
Обычные изображения. Самый частый кандидат на LCP на большинстве страниц. Время — момент, когда декодированное изображение появляется в области просмотра.
<image> внутри SVG
Изображения внутри элементов SVG. Для LCP их считают так же, как обычные img.
CSS background-image
Фоновые изображения через CSS. Важный нюанс: браузер не начинает загружать background-image, пока не построен CSSOM. Это одна из главных причин задержки LCP.
Текстовые блоки
<p>, <h1>–<h6>, <div> и другие элементы с текстовым содержимым. Если текстовый блок больше любого изображения, он становится LCP.
<video> с poster
Кадр-заставка видеоэлемента (атрибут poster). Если видео занимает большую часть экрана, постер должен загружаться как можно быстрее.
Элементы внутри <iframe> и элементы без видимого размера (display: none, visibility: hidden, opacity: 0) в LCP не учитываются. Если главный баннер скрыт до инициализации JS, LCP может измериться по совсем другому элементу.

Из чего складывается время LCP

Google делит LCP на 4 составляющие. Чтобы правильно поставить диагноз и расставить приоритеты в оптимизации, нужно понимать каждую из них.

КомпонентЧто измеряетТипичная доля
TTFB (время до первого байта)Время до прихода первого байта HTML с сервера10–40%
Задержка загрузки ресурсаРазрыв между TTFB и моментом, когда начинается загрузка ресурса LCP10–30%
Длительность загрузки ресурсаВремя скачивания самого ресурса LCP (изображения, шрифта)30–60%
Задержка отрисовки элементаРазрыв между завершением загрузки ресурса и его появлением в области просмотра0–20%

Правило: сначала займитесь составляющей с самой большой долей. Если из 5 секунд LCP 3 приходятся на TTFB, оптимизация изображений почти ничего не даст. Сначала исправьте время ответа сервера.

Основные причины медленного LCP

90% плохих оценок LCP имеют одни и те же корневые причины. Диагностика занимает 15 минут в DevTools или PageSpeed Insights.

Медленный TTFB

Сервер отвечает дольше 600 мс. Причины: нет кэширования, слабый хостинг, тяжёлые запросы к базе, нет CDN. При TTFB больше 800 мс добиться LCP меньше 2,5 с почти невозможно без других оптимизаций.

Неоптимизированные изображения

LCP-изображение весит 500 КБ+ в JPEG вместо 80 КБ в WebP/AVIF. Нет fetchpriority="high", нет preload. Браузер находит изображение поздно и грузит его медленно.

Ресурсы, блокирующие отрисовку

CSS и JS в <head> без async/defer блокируют отрисовку. Пока браузер их не загрузит и не выполнит, элемент LCP не появится. Каждый лишний скрипт в head добавляет задержку.

Медленная загрузка шрифтов

Если LCP — текстовый блок, а шрифт грузится 2 и более секунд, браузер показывает FOIT (невидимый текст) или FOUT (системный шрифт). Время до появления нужного текста равно LCP.

Ленивая загрузка на элементе LCP

Атрибут loading="lazy" на главном изображении — одна из самых частых ошибок. Браузер намеренно откладывает загрузку, и это напрямую бьёт по LCP.

LCP при клиентском рендеринге

В SPA (React, Vue, Angular) без SSR контент строится в браузере через JavaScript. Браузер получает пустой HTML → загружает JS → отрисовывает контент. Вся эта цепочка складывается в LCP.

Как оптимизировать LCP: пошаговый план

Оптимизация LCP — не один приём, а набор связанных улучшений. Работайте по порядку, начиная с самых эффективных.

Шаг 1: снизьте TTFB до 200–400 мс

TTFB — фундамент. Если сервер медленный, все остальные оптимизации упираются в этот потолок.

  1. Настройте HTTP-кэширование: Cache-Control: max-age=31536000 для статики, s-maxage для CDN-прокси.
  2. Включите сжатие: Brotli (предпочтительно) или gzip для HTML, CSS и JS. Brotli даёт файлы на 15–25% меньше, чем gzip.
  3. Подключите CDN: Cloudflare, Fastly, BunnyCDN. Для статичных сайтов кэширование на периферии сети снижает TTFB до 20–50 мс.
  4. Оптимизируйте базу данных: индексы по часто запрашиваемым полям, кэширование запросов через Redis или Memcached.
  5. Используйте HTTP/2 или HTTP/3: несколько запросов идут по одному соединению без head-of-line blocking.
Цель по TTFB: меньше 200 мс при связке сервера и CDN. С Nginx, статическим HTML и CDN это достижимо. Если у вас PHP или Node без кэширования и живые запросы к базе, сначала нужна оптимизация на уровне приложения.

Шаг 2: оптимизируйте изображение LCP

Если элемент LCP — изображение (баннер, фото товара), эта группа мер окупается лучше всего.

  • Переведите изображения в современные форматы: WebP (экономия 25–35% против JPEG) или AVIF (40–55% против JPEG). Используйте <picture> с запасным вариантом.
  • Добавьте fetchpriority="high" к изображению LCP — браузер загрузит его с наивысшим приоритетом.
  • Уберите loading="lazy" с элемента LCP. Ленивая загрузка нужна только для изображений ниже первого экрана.
  • Добавьте <link rel="preload" as="image"> в <head> для изображения LCP — браузер начнёт загрузку до разбора body.
  • Задайте атрибуты width и height, чтобы не допустить CLS. Браузер резервирует место до загрузки изображения.
  • Настройте srcset и sizes для адаптивной загрузки: на мобильных грузится изображение 400 px вместо 1600 px.
Связка fetchpriority="high" + preload + WebP/AVIF + правильный srcset даёт в среднем улучшение LCP на 1–2 секунды в реальных проектах интернет-магазинов.

Шаг 3: уберите ресурсы, блокирующие отрисовку

Каждый ресурс, блокирующий отрисовку, добавляет задержку LCP. Цель — ноль блокирующих ресурсов в критическом пути (critical path).

Тип ресурсаПроблемаРешение
JavaScript в <head>Браузер останавливает разбор HTML и выполняет скриптdefer или async для всех некритичных скриптов
CSS в <head>Браузер ничего не отрисовывает, пока весь CSS не загруженКритичный CSS inline + асинхронный loadCSS для остальных стилей
Сторонние скриптыАналитика, чат-боты и пиксели грузятся в headПеренесите в body или загружайте с задержкой (setTimeout 3000)
Шрифты без preloadБраузер находит шрифт только после разбора CSS<link rel="preload" as="font"> + font-display: swap

Шаг 4: оптимизируйте шрифты (если LCP — текст)

Если элемент LCP — текстовый блок (заголовок, лид), причина часто в задержке отрисовки шрифта.

  1. Добавьте font-display: swap или optional в @font-face. Браузер сразу покажет системный шрифт и заменит его нужным после загрузки.
  2. Используйте <link rel="preload" as="font" type="font/woff2" crossorigin> для критичных шрифтов в <head>.
  3. Ограничьте набор символов: сабсеттинг (subsetting), чтобы грузить только нужные глифы (латиница, кириллица).
  4. Хостите шрифты у себя вместо Google Fonts: так убирается лишний DNS-запрос и соединение.
  5. Задайте size-adjust, ascent-override и descent-override в @font-face, чтобы уменьшить CLS при подмене шрифта.

Шаг 5: SSR/SSG для JavaScript-фреймворков

Если сайт работает на React, Vue или Next.js без SSR, LCP будет высоким по умолчанию: браузер должен скачать JavaScript, выполнить его и только потом отрисовать контент.

Server-Side Rendering (SSR)
HTML формируется на сервере для каждого запроса. Браузер получает готовый HTML, разбирает его, и элемент LCP появляется, не дожидаясь JS. Лучший вариант для динамического контента.
Static Site Generation (SSG)
HTML формируется на этапе сборки. Сервер отдаёт готовый файл — максимальная скорость TTFB и LCP. Идеально для блогов, лендингов и неперсонализированных страниц.
Incremental Static Regeneration (ISR)
SSG с периодической регенерацией (Next.js). Совмещает скорость статичных файлов со свежестью данных. Оптимально для большинства контента CMS.
Streaming SSR
Сервер начинает отправлять HTML до того, как рендеринг завершён, и браузер постепенно показывает контент. React 18 и Next.js 13+ поддерживают это из коробки.
Частичная гидратация (Partial Hydration) и архитектура островов (Islands Architecture, Astro, Qwik) — ещё более эффективный подход: гидрируются только интерактивные компоненты, статичный контент отрисовывается мгновенно. Для контентных сайтов это даёт выигрыш LCP 0,5–1 с.

Шаг 6: CSS background-image как элемент LCP

Если элемент LCP использует CSS background-image, браузер не может начать его загрузку, пока не построен CSSOM. Это одна из самых коварных причин медленного LCP.

  • Замените CSS background-image на <img fetchpriority="high"> — браузер найдёт его уже при разборе HTML.
  • Если замена невозможна, используйте <link rel="preload" as="image">, чтобы запустить загрузку вручную.
  • Для адаптивных фонов используйте imagesrcset и imagesizes в теге preload.
  • Вынесите CSS с фоновым изображением LCP в inline-тег <style>: это убирает один сетевой запрос.

Инструменты для измерения и диагностики LCP

Точный диагноз важнее слепой оптимизации. Используйте оба типа инструментов: Lab (синтетические тесты) и Field (реальные пользователи).

ИнструментТип данныхЧто показываетКогда использовать
PageSpeed InsightsLab + Field (CrUX)Оценку LCP, разбивку по составляющим, конкретные рекомендацииПервичный аудит, проверка изменений
Chrome DevTools PerformanceLabВодопад загрузки, точную причину задержки LCP, flame chartГлубокая диагностика конкретной проблемы
Lighthouse CILabАвтоматические проверки в CI/CD, историю LCP по релизамКонтроль регрессий
WebPageTestLabТесты из разных регионов, сравнение видео, filmstrip, водопадПроверка CDN, региональный LCP
Google Search Console (CWV)Field (CrUX)Реальный LCP по группам URL, страницы с проблемамиМониторинг в продакшене
web-vitals.jsFieldJavaScript API для сбора LCP реальных пользователей в собственную аналитикуСобственный мониторинг, RUM

Как диагностировать LCP в Chrome DevTools

DevTools — самый точный инструмент, чтобы понять, что именно тормозит LCP на конкретной странице.

  1. Откройте DevTools → Performance, нажмите Record, перезагрузите страницу и остановите запись.
  2. В Timings найдите маркер LCP: он показывает точное время и элемент.
  3. Изучите водопад: найдите ресурс элемента LCP и проверьте, когда началась его загрузка относительно TTFB.
  4. Ищите красные полосы — это ресурсы, блокирующие отрисовку. Они идут прямо перед LCP.
  5. Вкладка Network → фильтр по типу Image: найдите изображение LCP и проверьте его приоритет (должен быть High).
  6. Вкладка Coverage показывает неиспользуемые CSS и JS. Большой объём неиспользуемого кода = задержка LCP.
В Network DevTools у изображения LCP должно быть: Priority: High, Initiator: Preload или Parser (не скрипт). Если инициатор — скрипт или XHR, изображение найдено слишком поздно.

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

LCP «зелёный» в PageSpeed Insights, но «красный» в Search Console. Почему?
PageSpeed Insights показывает и лабораторные данные (Lighthouse), и полевые (CrUX). Если там зелёный, вы, скорее всего, смотрите оценку Lighthouse. CrUX в PSI и Search Console отражает реальных пользователей Chrome, у которых могут быть медленное соединение, старые устройства или другая геолокация. Всегда ориентируйтесь на CrUX и полевые данные: по ним Google принимает решения о ранжировании.
Можно ли улучшить LCP без изменения кода?
Частично — да. Подключение CDN, настройка HTTP-кэширования и включение Brotli — это изменения конфигурации сервера. Конвертация изображений в WebP/AVIF и их сжатие тоже не требуют правок кода на сайте. А вот fetchpriority, preload, удаление lazy load с главного баннера и SSR требуют изменений в коде.
Что делать, если LCP — это текст, а не изображение?
Займитесь шрифтами и TTFB. Добавьте preload для веб-шрифта, используйте font-display: swap, хостите шрифты у себя. Если текст находится в большом блоке без критичного CSS, убедитесь, что CSS, влияющий на этот блок, не блокирует отрисовку. Проверьте и TTFB: даже без изображений медленный сервер даёт высокий LCP.
Влияет ли LCP напрямую на ранжирование?
Да. LCP входит в Core Web Vitals — сигнал Page Experience, который Google официально использует как фактор ранжирования с 2021 года. Плохой LCP не обрушит позиции за одну ночь, но при прочих равных у сайта с хорошим LCP есть преимущество. Заметнее всего это на мобильных устройствах.
Нужно ли оптимизировать LCP на всех страницах или только на главной?
Начните со страниц с высоким органическим трафиком и посадочных страниц платной рекламы. Google Search Console покажет URL с плохим LCP — начните с них. В интернет-магазинах в первую очередь обычно идут главная, категории и карточки товаров. Технические улучшения (шрифты, CDN, Brotli) действуют на весь сайт.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it