Skip to main content

First Contentful Paint (FCP)

First Contentful Paint (FCP) measures when the browser renders the first piece of content (text, image, or canvas) in the viewport. It's an early "sign of life": users can tell the page is responding, even if the main hero element (LCP) is not finished yet.

Quick Summary

FCP is influenced by TTFB and by render-blocking work in the critical rendering path (CSS, fonts, and JavaScript in the head). Improving FCP typically comes from reducing blocking CSS/JS and ensuring fonts don't prevent text from rendering.

FCP vs LCP Logic Context

Analytical AspectFirst Contentful Paint (FCP)Largest Contentful Paint (LCP)
Measurement ScopeThe absolute first visible fragment of HTML structureThe singularly largest contextual element (hero block)
Psychological WeightProvides "signs of life" that the server respondedConfirms the actual request is fully consumable
Primary Optimization TargetPurging the critical rendering path of blocking JS/CSSPrioritizing physical media payloads and network delivery

Objective Thresholds

Mobile Speed RatingFCP Threshold Boundary
Good≤ 1.8s
Needs Improvement1.8 – 3.0s
Poor> 3.0s

Key Impact Layers

Structural LayerDefining FCP BottleneckEngineering Solution
Backend TransmissionLatency ruins physical delivery (High TTFB)Tune the OS layer, ensure HTML page layer caching, enforce Cloudflare
Stylesheet ExecutionGigantic render-blocking CSS halts all DOM paintsImplement specific Critical CSS inlining via caching tools
Typography DiscoveryRemote web fonts stall text output entirely (FOIT)Enforce font-display: swap to display system fonts immediately
JavaScript CongestionDeep <head> parsing locks DOM compositionAdd native defer attributes aggressively

Step-by-Step Examples

Isolate FCP Timing via Filmstrip

  1. Open Chrome DevTools and go to the Performance tab.
  2. Select the Screenshots toggle option.
  3. Reload the page (optionally using CPU/network throttling).
  4. Scan the filmstrip: the first frame where content appears is your FCP point.

Inject Critical CSS for Dominant Speed

Generate Critical CSS asynchronously using LiteSpeed Cache or WP Rocket.

critical-css-config.txt
LSCache Operations → Page Optimization Block:
[Enabled] Generate Critical CSS
[Enabled] Load CSS Asynchronously

Mechanism: This extracts the CSS required for above-the-fold rendering and injects it into the HTML so the browser can paint sooner while loading the rest asynchronously.

Optimize Font Fetch Priority

typography-preload.html
<!-- Accelerate TCP connection to external API grids -->
<link rel="preconnect" href="https://fonts.googleapis.com">
typography-swap.css
/* Eliminate Flash of Invisible Text boundaries */
@font-face {
font-family: 'ModernFont';
src: url('/fonts/local-font.woff2') format('woff2');
font-display: swap;
}

Practical Bottleneck Scenarios

Bare-Metal Render Blocking

Problem: An FCP score collapses to 2.4s because a colossal 500kb monolithic theme stylesheet forces the browser to halt all visual rendering until it fully parses. Fix: Enable Critical CSS generation and async loading so above-the-fold content can paint sooner (example: FCP improves to ~1.2s).

JavaScript Overload

Problem: FCP is ~3.1s due to heavy scripts executing early in the <head>. Fix: Defer non-critical scripts and reduce third-party tags so the browser can render sooner (example: FCP improves to ~1.5s).

Common Mistakes & Troubleshooting

MistakeExplanationSolution
Ignoring TTFBThe browser can't start rendering if the server is slow to return HTML.Improve TTFB (caching + server health) before micro-optimizing front-end assets.
Forgetting font-display: swapWithout this declaration, browsers will deliberately hide native text elements until the remote typography asset confirms download.Hardcode swapping methodology across every typography block.
Too many scripts in the headEarly script execution can delay the first paint.Defer non-critical scripts and delay third-party tags where safe.

Target Quick Reference Checklist

FCP Benchmark Execution Target
  1. Reduce TTFB (typically with page caching and CDN caching where appropriate).
  2. Identify render-blocking CSS and inline only what's required above the fold.
  3. Defer non-critical JavaScript and minimize early third-party execution.
  4. Ensure fonts don't block rendering (use font-display: swap, preload key fonts if needed).

FCP Cascading Pipeline

What's Next