Skip to content

Tout pour WordPress, le développement web — et plus encore

⚡ Critical CSS : qu'est-ce que c'est, comment le générer et accélérer votre site web

⚡ Critical CSS : qu'est-ce que c'est, comment le générer et accélérer votre site web

Votre page met 3 secondes à charger, et les visiteurs s’en vont. Vous ouvrez Google PageSpeed Insights, et le verdict s’affiche en rouge: «Éliminez les CSS qui bloquent le rendu». Cela vous rappelle quelque chose? Selon les données HTTP Archive pour 2025, la page médiane charge 7 feuilles de styles externes, et le poids moyen des CSS a dépassé 120 Ko. Chaque fichier dans le <head> est une barrière entre l’utilisateur et le contenu.

Le problème n’est pas le CSS «lourd». Le navigateur n’affichera pas un seul pixel tant qu’il n’aura pas téléchargé et analysé TOUTES les feuilles de styles. Même celles qui stylisent un pied de page situé au pixel 4000. La solution, c’est le Critical CSS: une technique qui extrait de votre feuille de styles complète uniquement ce qui est nécessaire pour la zone visible à l’écran et l’intègre directement dans le <head>. Le reste se charge de manière asynchrone et ne bloque rien.

Nous avons mis en place le Critical CSS sur l’ensemble des projets techblog et construit un flux de travail opérationnel: de la génération manuelle en 30 secondes à l’automatisation complète via Gulp et des extensions WordPress. Voici un guide pas à pas, sans superflu.

💡 Aperçu rapide:

  • Comprendre les mécanismes de blocage du rendu et pourquoi le navigateur attend le CSS même quand le HTML est prêt
  • Choisir le bon outil: un générateur en ligne gratuit en 10 secondes, Penthouse pour les projets npm, ou la combinaison WP Rocket / Autoptimize pour WordPress
  • Mettre en place un flux Gulp pour la régénération automatique du Critical CSS à chaque déploiement
  • Éviter les pièges courants: FOUC, contenu JS, problèmes de media queries

Qu’est-ce que le Critical CSS et pourquoi le navigateur ralentit

Le navigateur construit deux structures: le DOM à partir du HTML et le CSSOM à partir des styles. Tant que le CSSOM n’est pas prêt, le rendu est suspendu. C’est ce qu’on appelle le CSS bloquant le rendu: la page reste blanche jusqu’à ce que toutes les feuilles de styles du <head> soient chargées.

Google PageSpeed Insights diagnostique directement le problème:

Votre page contient 3 ressources CSS bloquantes. Cela entraîne un retard dans le rendu. Aucun contenu au-dessus de la ligne de flottaison ne peut être affiché sans attendre le chargement des ressources suivantes.

Le terme «above the fold» vient de la presse papier. Sur le web, il désigne la zone visible avant tout défilement: environ 600 px sur ordinateur de bureau, 900 px sur portable, 400 px sur smartphone. La plupart des développeurs visent des valeurs sûres de 1300 px de largeur et 900 px de hauteur.

Le Critical CSS est l’ensemble minimal de styles nécessaires pour afficher uniquement cette zone. Grille, navigation, polices, section hero. Tout le reste est différé et se charge de manière asynchrone: la page apparaît instantanément pendant que les styles supplémentaires se chargent en arrière-plan.

Les chiffres sont significatifs. Selon les données de Google, l’intégration du Critical CSS réduit le First Contentful Paint de 0,5 à 1,2 seconde sur les appareils mobiles. Pour l’e-commerce, cela a un impact direct sur la conversion: une étude de Portent a montré que les sites dont le FCP est inférieur à 1 seconde convertissent 3 fois mieux que ceux dont le FCP atteint 3 secondes.

Outils de génération: du gratuit en ligne à l’API commerciale

Générer du Critical CSS manuellement est impossible. Vous avez besoin d’un outil qui affiche la page dans un navigateur headless et extrait uniquement les styles utilisés. Voici trois options qui fonctionnent.

Outil

Type

Coût

Automatisation

Idéal pour

Critical Path CSS Generator

En ligne

Gratuit

Non

Pages uniques, prise en main

Penthouse

Package npm

Gratuit

Oui, via Gulp/scripts

Développeurs, traitement par lots

criticalcss.com

SaaS

À partir de 10 $/mois

Oui, API + WordPress

Production, sites volumineux

Critical Path CSS Generator: en ligne, en 10 secondes

Critical Path CSS Generator de Jonas Ohlsson est un outil gratuit par lequel il vaut la peine de commencer. L’interface est simple: collez l’URL de la page, collez votre CSS COMPLET (même 200 Ko minifiés), cliquez sur le bouton, et obtenez les styles pour la partie visible.

Avantages: aucune barrière à l’entrée. Pas besoin de Node.js, npm ou de scripts. Inconvénients: un travail purement manuel. Vous traitez chaque page séparément, et quand les styles changent, vous recommencez tout. Cela fonctionne pour un site de 5 pages, mais devient vite pénible pour 50 pages.

Le créateur du générateur a ensuite lancé le service commercial criticalcss.com, une évolution de la même idée avec mises à jour automatiques, validation par capture d’écran et une API pour le traitement par lots.

Penthouse: générateur en ligne de commande pour Gulp

Penthouse (plus de 2680 étoiles sur GitHub) est un package npm du même auteur. Sous le capot: Puppeteer et Chromium headless. Il ouvre la page, détermine le CSS utilisé pour un viewport donné et supprime le reste.

Installation:

1npm install --save-dev penthouse

Appel minimal depuis un script Node:

1const penthouse = require('penthouse');
2const fs = require('fs');
3
4penthouse({
5 url: 'https://example.com',
6 cssString: fs.readFileSync('./style.css', 'utf8'),
7 width: 1300,
8 height: 900
9}).then(criticalCss => {
10 fs.writeFileSync('./critical.css', criticalCss);
11});

Les valeurs 1300 pour la largeur et 900 pour la hauteur sont empiriquement sûres. Les media queries plus larges que le viewport critique sont supprimées par défaut. Pour les conserver, utilisez le flag keepLargerMediaQueries: true.

Remarque importante: Penthouse s'exécute avec JavaScript désactivé. Si le contenu above-the-fold est généré par un framework JS, le HTML avant hydratation est vide et Penthouse ne trouvera aucun style. La solution: le rendu côté serveur (SSR) ou le paramètre forceInclude avec des sélecteurs à préserver de force.

WP Rocket et Autoptimize: deux plugins WordPress

Si votre site tourne sous WordPress, la génération manuelle de CSS critique est une complication inutile. Nombreuses pages, templates qui se multiplient, styles qui changent. Deux plugins règlent complètement le problème.

WP Rocket est un plugin premium (59 €/an pour 1 site, 119 € pour 3, 299 € pour 50). L'option intégrée «Remove Unused CSS» génère automatiquement le CSS critique pour chaque page, l'injecte dans le <head> et charge le reste de manière asynchrone. Deux cases à cocher, et la recommandation «Éliminer les ressources bloquant le rendu» est résolue. Bonus: le hub intégré Rocket Insights, basé sur GTmetrix, affiche les métriques directement depuis l'administration WordPress.

Autoptimize est un plugin gratuit avec une option «Inline and Defer CSS». La version de base génère UN seul fichier de CSS critique pour tout le site, ce qui ne fonctionne pas en pratique (pages différentes, contenu above-the-fold différent). La solution: l'intégration avec le service criticalcss.com (plan WordPress, à partir de 10 $/mois). Le plugin demande automatiquement le CSS critique via l'API, l'injecte et le met à jour en cas de modifications.

Pour la plupart des utilisateurs WordPress, la combinaison WP Rocket ou Autoptimize + criticalcss.com résout entièrement le problème. La suite de cet article s'adresse à ceux qui construisent des sites sur mesure.

Développeur à son poste de travail avec un éditeur de code et un éclairage studio tamisé

Workflow manuel: génération, insertion, vérification

Si vous construisez un site sans CMS, le processus tient en quatre étapes.

Étape 1. Copiez TOUT votre CSS. Regroupez tous les styles du site dans UN seul fichier. Si vous écrivez du Sass, compilez-le. Si vous utilisez un framework comme Bootstrap ou Tailwind, incluez intégralement son CSS. Ne cherchez pas à deviner ce qui n'est «probablement pas nécessaire»; le générateur s'en chargera.

Étape 2. Générez le CSS critique via le générateur en ligne ou Penthouse. Le résultat est un bloc de styles minifié responsable uniquement de la partie above-the-fold.

Étape 3. Insérez le CSS critique dans une balise <style> à l'intérieur du <head>. C'est crucial: les styles inline ne génèrent aucune requête HTTP supplémentaire et sont traités immédiatement par le navigateur. Le résultat ressemble à ceci:

1<!DOCTYPE html>
2<html lang="ru">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <style>@charset "UTF-8";*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15}body{margin:0;font-family:'Inter',Helvetica,Arial,sans-serif;font-size:1rem;line-height:1.5;color:#222;background:#fff}nav{display:block}.container{max-width:1200px;margin:0 auto;padding:0 20px}</style>
7 <title>Page Title</title>
8</head>

Étape 4. Déplacez les CSS et JS externes du <head> vers le bas de la page, avant la balise </body> de fermeture. Oui, un <link rel="stylesheet"> dans le pied de page n'est techniquement pas valide selon la spécification, mais en pratique cela fonctionne dans tous les navigateurs et résout le problème de blocage. L'alternative consiste à utiliser loadCSS de Filament Group pour un chargement asynchrone des styles sans les déplacer dans le pied de page.

Enfin, vérifiez via Google PageSpeed Insights. La recommandation «Éliminer les ressources qui bloquent le rendu» a-t-elle disparu? Vous avez tout fait correctement.

Gulp + Penthouse: automatisation pour les projets sans WordPress

Chaque modification de style nécessite une régénération du CSS critique. Le faire manuellement est d’un ennui mortel. Gulp automatise le processus.

Notre workflow de production:

1// gulpfile.js
2const gulp = require('gulp');
3const penthouse = require('penthouse');
4const fs = require('fs');
5const urlList = require('./criticalcss-pagelist.json');
6
7gulp.task('criticalcss', function () {
8 urlList.urls.forEach(function (item) {
9 penthouse({
10 url: item.link,
11 css: './css/style.min.css',
12 width: 1300,
13 height: 900,
14 keepLargerMediaQueries: false,
15 renderWaitTime: 100,
16 timeout: 30000
17 }).then(function (criticalCss) {
18 fs.writeFileSync(item.output, criticalCss);
19 console.log('✓ Critical CSS generated: ' + item.link);
20 }).catch(function (err) {
21 console.error('✗ Error for ' + item.link + ': ' + err.message);
22 });
23 });
24});

Le fichier criticalcss-pagelist.json avec la liste des URL et des fichiers de sortie:

1{
2 "urls": [
3 { "link": "https://example.com", "output": "./critical/home.php" },
4 { "link": "https://example.com/about", "output": "./critical/about.php" },
5 { "link": "https://example.com/contact", "output": "./critical/contact.php" }
6 ]
7}

Nous écrivons la sortie dans des fichiers PHP qui encapsulent le CSS et sont insérés via include dans le <head> du template correspondant. Adaptez à votre stack: écrivez dans des .css, insérez via une inclusion côté serveur, tout ce qui fonctionne.

Lancez: gulp criticalcss, et toutes les pages sont traitées en une seule passe. Intégrez la tâche dans la CI/CD au moment du déploiement, et le CSS critique reste à jour.

Problèmes que vous allez rencontrer

Le CSS critique n’est pas sans aspérités. Voici ce que nous avons constaté en pratique.

Flash de contenu sans style (FOUC). Le CSS critique ne couvrait pas un élément, et l’utilisateur voit un saut visuel au chargement des styles complets. Cause: un contenu positionné hors de la fenêtre d’affichage via absolute ou transform, que le générateur a manqué. Correction: l’option forceInclude avec le sélecteur de l’élément problématique.

Contenu généré par JavaScript. Presque tous les générateurs (Penthouse, outil en ligne) s’exécutent avec JavaScript désactivé. Si votre landing page est construite avec React, Vue ou Angular sans rendu côté serveur, le HTML est vide et le générateur n’a rien à analyser. La seule solution fiable: activer le SSR au niveau du framework. L’alternative consiste à spécifier manuellement les sélecteurs via forceInclude, mais c’est fragile.

Media queries. Par défaut, Penthouse supprime les règles dont la min-width dépasse la fenêtre d’affichage spécifiée. Si vous ne définissez pas keepLargerMediaQueries: true, les styles desktop sont perdus et le site casse sur les écrans larges. Vérifiez toujours les résultats aux résolutions réelles.

Mise en cache. Vous avez généré le CSS critique, déployé, modifié le style de l’en-tête une semaine plus tard, mais l’ancienne version reste dans le <head>. Sans automatisation CI/CD, vous oublierez de régénérer. La tâche Gulp au déploiement résout cela complètement.

⁉️🤔 Questions fréquentes

Le CSS critique est-il obligatoire pour chaque site?

Non, pas pour tous les sites. Si votre site a un seul fichier CSS de 20 Ko et que le FCP est déjà sous la seconde, le bénéfice sera négligeable. Mais si le <head> contient 3 ou 4 feuilles de styles totalisant environ 100 Ko, le CSS critique apportera une amélioration mesurable. Pour une simple landing page, l’outil en ligne prend 10 minutes. Pour une boutique WordPress, WP Rocket avec deux cases à cocher le fait. Vérifiez PageSpeed Insights: si «Éliminer les ressources bloquant le rendu» arrive en tête, faites-le.

Puis-je simplement déplacer toutes les balises <link> dans le pied de page et m’éviter ces complications?

Techniquement non. La spécification HTML exige <link rel="stylesheet"> uniquement dans le <head>. En pratique, les navigateurs affichent les pages avec <link> dans le pied de page, mais vous obtenez un flash de contenu sans style (FOUC) jusqu’au chargement des styles. Acceptable pour un simple site vitrine, pas pour un projet commercial. La bonne approche: CSS critique inline dans le <head>, chargement asynchrone du reste via loadCSS ou media="print" avec onload="this.media='all'". Le déplacement dans le pied de page est une solution de contournement qui fonctionne au prix d’un saut visuel.

Qu’est-ce qui a changé avec HTTP/3 et les Early Hints?

HTTP/3 et les 103 Early Hints permettent au navigateur de commencer à charger les ressources critiques avant de recevoir la réponse complète du serveur. Cela réduit la latence mais n’élimine pas le blocage du rendu: les styles doivent toujours être téléchargés et analysés. Early Hints et CSS critique fonctionnent ensemble, pas l’un à la place de l’autre: Early Hints accélère la livraison, le CSS critique accélère le premier rendu. Les deux techniques se renforcent mutuellement.

Penthouse n’a pas été mis à jour depuis 4 ans. Est-il encore pertinent?

La dernière version de Penthouse (v2.3.3) date de 2022, mais le package reste fonctionnel: il s’appuie sur Puppeteer et Chromium, qui sont stables. La fonctionnalité principale (générer le CSS utilisé pour une fenêtre d’affichage donnée) ne nécessite pas de mises à jour fréquentes. Une alternative est Critical d’Addy Osmani (plus de 12 000 étoiles), qui bénéficie de mises à jour plus actives et s’intègre également avec Gulp/Grunt.

Comment gérer les pages dynamiques où le contenu dépend de l’utilisateur?

Pour les pages avec personnalisation (tableau de bord utilisateur, panier, panneau d’administration), le CSS critique est généré non pas pour un utilisateur spécifique mais pour la structure générale: en-tête, barre latérale, grille. Le contenu dynamique va dans la partie asynchrone. Si les styles d’un bloc au-dessus de la ligne de flottaison propre à l’utilisateur sont essentiels, ajoutez les sélecteurs correspondants via forceInclude. Générez le CSS critique basé sur la structure générale de la page, et laissez les blocs personnalisés au chargement asynchrone avec forceInclude pour les éléments critiques.

Faut-il implémenter le CSS critique sur votre projet

Si votre site charge plus d’un fichier CSS dans le <head>, le CSS critique apportera des gains de vitesse mesurables. Pour une landing page de trois pages, l’outil en ligne prend 10 minutes. Pour un blog ou une boutique WordPress, deux cases à cocher dans WP Rocket. Pour un projet sur mesure, une heure de configuration de Gulp et Penthouse est rentabilisée dès le premier déploiement.

La barrière à l’entrée est plus basse qu’il n’y paraît. Prenez le générateur en ligne gratuit, copiez le CSS de votre page, collez-le, et en 30 secondes vous verrez les résultats. Quand vous voudrez automatiser, revenez à la section sur le workflow Gulp: elle résout le problème complètement. Doubler la vitesse de chargement avec quelques heures de travail est une affaire difficile à refuser.