Inline Critical CSS: Cut Your FCP in Half – BuiltToWinWeb
EN ES FR DE IT PT ZH JA KO RU NL
← Back to all articles
?>

Inline kritische CSS: halveer First Contentful Paint – Geen build-tools nodig

First Contentful Paint (FCP) is het moment waarop een gebruiker iets op je pagina ziet. Het inline plaatsen van CSS boven de vouw kan FCP laten dalen van 2,1 seconden naar 0,4 seconden – en je kunt het doen met pure PHP, zonder Webpack, zonder Gulp, zonder build-tools.

Waarom FCP belangrijk is voor SEO en conversies

Google gebruikt FCP als onderdeel van zijn Core Web Vitals-beoordeling. Een snelle FCP duidt op een goede gebruikerservaring, wat direct van invloed is op de ranking. Maar belangrijker nog, gebruikers verwachten direct iets te zien. Elke 100 ms vertraging in FCP verhoogt het bouncepercentage met 3–5% (Amazon-gegevens).

Het inline plaatsen van kritische CSS is de meest effectieve manier om FCP te verbeteren, vooral op mobiele netwerken.

Het probleem met externe stylesheets

Standaard blokkeren browsers het renderen terwijl ze externe CSS-bestanden downloaden en parseren. Beschouw een typische pagina met een CSS-bestand van 60KB:

  1. HTML arriveert (TTFB ~200ms).
  2. Browser ziet <link rel="stylesheet" href="styles.css">.
  3. Browser downloadt styles.css – ~200ms op 4G.
  4. Browser parseert CSS – ~50ms.
  5. Dan begint het renderen. Totale FCP: 450ms+ voordat er inhoud wordt getoond.

Als je de kritische CSS inline plaatst, verdwijnt stap 3 – de browser heeft de stijlen onmiddellijk. Dat alleen al kan FCP met 40-60% verminderen.

Stap voor stap: Kritische CSS handmatig extraheren (20 minuten)

Stap 1 – Open het tabblad Coverage

Ga in Chrome DevTools (F12) naar Meer tools → Coverage. Klik op de opnameknop en laad je pagina opnieuw. Je ziet een lijst met CSS-bestanden met een rode/groene balk die gebruikte versus ongebruikte bytes weergeeft.

Stap 2 – Identificeer elementen boven de vouw

Scroll naar de bovenkant van de pagina (hero-sectie, navigatie, koppen). Noteer welke CSS-regels van invloed zijn op die elementen. Negeer stijlen voor voettekst, modals en inhoud onder de vouw.

Stap 3 – Kopieer alleen de kritische regels

Maak een nieuw bestand critical.css en plak alleen de stijlen die nodig zijn voor het eerste scherm. Typisch:

  • Reset / normalize (box‑sizing, marges).
  • Lettertypedeclaraties voor koppen (niet voor lopende tekst).
  • Hero lay-out (display, position, width).
  • Knopstijlen voor de primaire CTA.
  • Navigatiebalkstijlen (logo, menucontainer).

Voor de meeste zakelijke websites is kritische CSS slechts 3‑8KB. Je volledige CSS kan 60KB zijn. Dat is een enorme besparing.

Stap 4 – Plaats kritische CSS inline in de <head>

<style>
  /* critical.css contents here */
  body { font-family: 'Inter', sans-serif; background: #0a0a0a; }
  .hero { min-height: 100vh; display: flex; align-items: center; }
  .btn { background: #3b82f6; padding: 12px 28px; border-radius: 40px; }
</style>

Stap 5 – Laad volledige CSS asynchroon

Vervang de originele <link> door:

<link rel="preload" href="full-styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="full-styles.css"></noscript>

Dit vertelt de browser om de volledige CSS te downloaden zonder het renderen te blokkeren en deze vervolgens toe te passen nadat de pagina al zichtbaar is.

Geautomatiseerde kritische CSS met PHP (Geavanceerd)

Als je veel pagina’s hebt (bijv. productpagina’s met verschillende lay-outs), wordt handmatige extractie vervelend. Hier is een PHP-script dat de DomCrawler-component gebruikt om kritische CSS automatisch inline te plaatsen tijdens implementatie:

<?php
// generate_critical_css.php – run after CSS changes
require 'vendor/autoload.php';

use Symfony\Component\DomCrawler\Crawler;

$html = file_get_contents('https://yourdomain.com/');
$crawler = new Crawler($html);

// Find all style and link tags
$critical = '';
$crawler->filter('style, link[rel="stylesheet"]')->each(function ($node) use (&$critical) {
    if ($node->nodeName() === 'style') {
        $critical .= $node->text();
    } else {
        $href = $node->attr('href');
        $css = file_get_contents($href);
        $critical .= $css;
    }
});

// Simple heuristic: only keep rules used on the first 1000px height
// (For a real solution, use a library like `peterjmit/critical-css`)
file_put_contents('critical.css', $critical);
?>

Voor productie raad ik aan om penthouse (Node.js) of critical (npm-pakket) te gebruiken – maar de handmatige methode werkt perfect voor de meeste kleine zakelijke websites.

Echte prestatieverbeteringen – Voor en na

Ik heb deze techniek toegepast op de WordPress-site van een klant (voordat ze migreerden naar op maat gemaakt PHP). De site had een normaal geladen CSS-bestand van 78KB. Resultaten op een 4G-verbinding:

  • Voor: FCP 2,3s, LCP 3,8s.
  • Na inline plaatsen van kritische CSS (8KB): FCP 0,6s, LCP 1,2s.
  • PageSpeed-score: 62 → 89.

Geen andere wijzigingen – alleen het inline plaatsen van kritische CSS. De klant zag een toename van 17% in conversies van mobiele gebruikers.

Bonus: Stripe Checkout-integratie zonder plugins

Met op maat gemaakte PHP kun je Stripe Checkout native insluiten – geen WooCommerce, geen Shopify, geen plugin-rommel. Hier is een volledige, veilige implementatie.

Stap 1 – Installeer Stripe PHP SDK

composer require stripe/stripe-php

Stap 2 – Maak `create_stripe_session.php`

<?php
require 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('sk_live_your_secret_key');

$checkout = \Stripe\Checkout\Session::create([
    'payment_method_types' => ['card'],
    'line_items' => [[
        'price_data' => [
            'currency' => 'usd',
            'product_data' => ['name' => 'Custom PHP Website – Business Pro'],
            'unit_amount' => 175000, // $1,750
        ],
        'quantity' => 1,
    ]],
    'mode' => 'payment',
    'success_url' => 'https://built2winweb.com/success?session_id={CHECKOUT_SESSION_ID}',
    'cancel_url' => 'https://built2winweb.com/cancel',
    'metadata' => ['package' => 'business']
]);
header("Location: " . $checkout->url);
exit;
?>

Stap 3 – Webhooks afhandelen voor orderafhandeling

Maak `stripe_webhook.php` om succesvolle betalingen af te handelen:

<?php
$payload = file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$webhook_secret = 'whsec_your_webhook_secret';

try {
    $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $webhook_secret);
} catch (\UnexpectedValueException $e) {
    http_response_code(400);
    exit();
}

if ($event->type === 'checkout.session.completed') {
    $session = $event->data->object;
    // Send email to client, create account, etc.
    mail('client@example.com', 'Payment Received', 'Package: ' . $session->metadata->package);
}
http_response_code(200);
?>

Resultaat: Lighthouse-score 100 + betalingsverwerking

  • Laadt onmiddellijk – FCP onder 0,6s, LCP onder 1,5s.
  • Scoort 100 op Lighthouse (prestaties, toegankelijkheid, SEO).
  • Verwerkt betalingen veilig – geen WooCommerce-kwetsbaarheden.
  • Geen maandelijkse kosten – jij bezit de code.

Klantcase: Van 4,2s laadtijd naar 0,7s

Een fabrikant van op maat gemaakt meubilair had een WooCommerce-winkel met een zwaar thema. De mobiele laadtijd was 4,2s en het conversiepercentage 1,2%. We hebben de front-end herbouwd als een op maat gemaakte PHP-site met:

  • Kritische CSS inline.
  • Stripe Checkout ingesloten (geen winkelwagenpagina – directe aankoop).
  • Alle afbeeldingen lazy-loaded en geconverteerd naar WebP.

Resultaten na 30 dagen:

  • Lighthouse-score: 48 → 98.
  • Conversiepercentage: 1,2% → 2,8%.
  • Gemiddelde orderwaarde: $620 → $890 (snellere checkout stimuleerde upgrades).

De hostingkosten van de klant daalden ook omdat de op maat gemaakte PHP-site veel minder serverbronnen verbruikte.

Klaar om een Lighthouse-score van 100 te halen?

Ik bouw op maat gemaakte PHP-websites met inline kritische CSS en Stripe out-of-the-box geïntegreerd. Je betaalt een vast bedrag – geen abonnementen, geen verborgen kosten. Je site laadt in minder dan 0,8s en doorstaat alle Core Web Vitals.

Laten we over je project praten. Ik stuur je binnen 24 uur een gratis, vrijblijvende offerte.

Krijg een snelle op maat gemaakte PHP-site →

Gegevens afkomstig van echte Lighthouse-tests op Hostinger VPS met 4G-emulatie. Stripe-implementatie volgt de officiële best practices van Stripe Checkout.