Critical CSS: cos’è e come velocizzarlo
Critical CSS — estrarre gli stili above-the-fold, inserirli inline e rimandare il resto per velocizzare il primo paint. Perché Google lo definisce avanzato e facoltativo, i compromessi reali (cache persa, rischio di manutenzione, condizioni di gara) e come capire se il CSS è davvero il collo di bottiglia.
Lingue
Il Critical CSS è una tecnica di performance: estrai il CSS necessario a renderizzare una viewport above-the-fold scelta, inseriscilo nel <head> e rimanda asincronamente il resto del foglio di stile. Funziona perché il CSS è render-blocking per impostazione predefinita: il browser non esegue il paint finché non costruisce il CSSOM. Non esiste un’altezza above-the-fold universale (dispositivo, orientamento, zoom e stato della pagina la cambiano), quindi considera la separazione una decisione, non un taglio fisso in pixel. La cosa più importante: Google presenta il Critical CSS come tecnica avanzata e facoltativa, non come consiglio predefinito — la sua documentazione dice che la maggior parte dei siti può raggiungere gli obiettivi di performance senza implementarla. I compromessi sono reali: il CSS inline non è in cache per le visite ripetute, la separazione critical/non-critical si rompe quando cambiano template o stati, una policy CSP style-src può bloccare il blocco inline e il defer preload/onload può entrare in gara o causare spostamenti del layout. Diagnostica prima: conferma che il CSS, non JavaScript o il tempo di risposta del server, sia il collo di bottiglia. L’impatto SEO è indiretto tramite Core Web Vitals/LCP, non un fattore di ranking diretto. Non esiste una guida specifica di Bing. Questa pagina è annidata sotto l’hub critical rendering path.
TL;DR — Il Critical CSS è una tecnica di velocità: prendi solo gli stili necessari alla parte della pagina visibile per prima, inseriscili direttamente nell’HTML e carica più tardi il resto del foglio di stile. Può far apparire una pagina più veloce, ma Google stesso dice che la maggior parte dei siti non ne ha bisogno e presenta svantaggi reali. Diagnostica prima di usarlo.
Che cos’è il Critical CSS
Quando un browser carica una pagina, non disegna nulla sullo schermo finché non ha letto il CSS. È intenzionale: altrimenti la pagina apparirebbe senza stili e poi si sposterebbe. Ma significa che un foglio di stile lento o pesante può ritardare tutto il primo paint.
Il Critical CSS è un modo per aggirare il problema. L’idea ha due parti:
- Inserisci gli stili importanti. Estrai solo il CSS necessario al contenuto above-the-fold (la parte visibile prima di scorrere) e inseriscilo direttamente nel
<head>della pagina. Il browser ha così ciò che serve per dipingere la parte alta senza aspettare un file separato. - Rimanda il resto. Carica l’intero foglio di stile in modo asincrono, così non blocca il primo paint. Arriva un momento dopo e applica gli stili al resto.
Il team web.dev di Google lo definisce come Critical CSS is a technique that extracts the CSS for above-the-fold content in order to render content to the user as fast as possible (in italiano: una tecnica che estrae il CSS del contenuto above-the-fold per renderizzare i contenuti all’utente il più rapidamente possibile).
Evidence for this claim Critical CSS extracts and inlines above-the-fold styles so the remaining CSS can load asynchronously. Scope: web.dev definition and implementation outline for critical CSS. Confidence: high · Verified: web.dev: Extract critical CSSL’errore che commette la maggior parte delle persone
La maggior parte degli articoli presenta il Critical CSS come qualcosa che dovresti fare. La documentazione Google dice il contrario per la maggior parte dei siti: La maggior parte dei siti dovrebbe riuscire a raggiungere tutti i nostri obiettivi di performance consigliati senza implementare questa tecnica. È un’ottimizzazione avanzata, da ultima risorsa, non una casella predefinita da spuntare.
Evidence for this claim web.dev presents critical CSS as an advanced technique that can cause bugs and says most sites can meet performance targets without it. Scope: web.dev codelab guidance; not a universal recommendation. Confidence: high · Verified: web.dev: Extract and inline critical CSSE non è gratis. Quando inserisci il CSS nell’HTML, il browser non può memorizzarlo nella cache per le altre pagine come farebbe con un foglio di stile normale: quindi la seconda visita di un utente al sito può essere persino più lenta. Anche la separazione tra “critical” e “resto” va mantenuta; se cambi il template può rompersi senza segnali evidenti.
Aiuta la SEO?
Solo indirettamente. Il CSS in sé non viene letto come segnale di ranking: Martin Splitt ha detto che i nomi delle classi CSS non gli interessano. Il Critical CSS può invece aiutare la velocità con cui appare la pagina, che alimenta i Core Web Vitals (in particolare LCP), e i Core Web Vitals sono un piccolo input di ranking. Il percorso è quindi: paint più veloce → LCP migliore → beneficio SEO modesto, non “il Critical CSS è un fattore di ranking”.
Vuoi la versione reale — come implementarlo, la posizione effettiva di Google, i compromessi e come capire se il CSS è davvero il tuo collo di bottiglia? Passa alla scheda Advanced.
TL;DR — Critical CSS = estrai gli stili above-the-fold, inseriscili nel
<head>e rimanda asincronamente il resto del foglio di stile (rel="preload"+ scambioonload, fallback<noscript>oloadCSS). Funziona perché il CSS è render-blocking per impostazione predefinita. Il punto centrale dell’accuratezza: Google lo presenta come avanzato e facoltativo, non come consiglio predefinito — “Most sites should be able to achieve all of our recommended performance targets without implementing this technique.” Mantieni piccolo il payload inserito. I compromessi sono reali: il CSS inline non viene memorizzato nella cache tra i caricamenti (le visite ripetute possono essere più lente), la separazione critical/non-critical si rompe quando cambiano i template e il defer può entrare in gara o causare FOUC/CLS. Diagnostica prima — conferma che il CSS, non JavaScript o il tempo di risposta del server, sia il vero collo di bottiglia. Fai attenzione alle insidie che una demo rapida non mostra: una policy CSPstyle-srcpuò bloccare del tutto il tuo blocco inline<style>, “unused at capture” non significa “safe to defer” tra temi/personalizzazione/stati e l’inlining non risolve i tempi di caricamento dei font. L’impatto SEO è indiretto tramite Core Web Vitals/LCP. Non esiste una guida specifica di Bing.
Che cos’è davvero il Critical CSS
Il problema che risolve è il CSS render-blocking. web.dev di Google è esplicito: Per impostazione predefinita, il CSS è trattato come una risorsa che blocca il rendering, cioè il browser non renderizza alcun contenuto elaborato finché non viene costruito il CSSOM. È l’intero motivo per cui esiste la tecnica: il browser rifiuta di eseguire il paint finché non ha gli stili, quindi tutto ciò che ritarda il CSS ritarda il primo paint. (Per la pipeline completa sottostante, consulta l’hub critical rendering path sotto cui questa pagina è annidata e il suo argomento gemello, render-blocking resources.)
Il Critical CSS affronta il problema dividendo il CSS in due.
La definizione di web.dev: “Critical CSS is a technique that extracts the CSS for above-the-fold content in
order to render content to the user as fast as possible.” E i meccanismi:
Inlining extracted styles in the head of the HTML document eliminates the need to make an additional request to fetch these styles. The remainder of the CSS can be loaded asynchronously (in italiano: inserire gli stili estratti nel <head> del documento HTML elimina la necessità di effettuare una richiesta aggiuntiva per recuperarli; il resto del CSS può essere caricato in modo asincrono).
Una cosa che web.dev dichiara apertamente e che molte guide secondarie sorvolano: non esiste un’unica altezza universale above-the-fold — dimensioni e orientamento del dispositivo, chrome del browser, livello di zoom e stato della pagina (menu aperto, personalizzazione caricata, stato di errore) cambiano tutto ciò che deve rientrare nell’insieme “critical”. Considera il Critical CSS una decisione su una specifica viewport/stato iniziale, non una soglia fissa in pixel, e convalidalo rispetto ai breakpoint e agli stati reali, non a un solo screenshot desktop.
Quindi i lavori sono due, in quest’ordine:
- Inserisci il CSS above-the-fold minimo nel
<head>— nessun round trip aggiuntivo prima del primo paint. - Rimanda il resto del foglio di stile — caricalo asincronamente perché non blocchi mai quel primo paint.
È esattamente così che l’ho diviso nei miei interventi sulla page experience. Nel deck What’s Next for Page Experience (SMX Next 2021) ho messo il lavoro CSS in due contenitori: un percorso early/critical (rimuovi CSS inutilizzato → minimizza CSS → inserisci il Critical CSS) e un percorso late/deferred (rimanda il CSS non critical). La forma è quella di web.dev, solo ordinata nel modo in cui la penso.
Come implementarlo
Passaggio 1 — inserisci il Critical CSS. Le indicazioni di Lighthouse dicono di inserire gli stili critical necessari al primo paint dentro un blocco <style> nell’head della pagina HTML.
Il target dimensionale di Google per quel payload inline, dalla stessa pagina, è mantenere il contenuto above-the-fold sotto i 14 KB (compresso), così entra nel primo round trip di rete. Considera il numero una guida storica al trasporto, non una specifica eterna: la pagina sorgente è del 2019 e precede l’ampia diffusione odierna di HTTP/2 e HTTP/3, che cambiano entrambi la matematica del primo round trip. È ancora il numero citato dalla documentazione Google, ma se stai ottimizzando in modo serrato verificalo rispetto al protocollo e al comportamento attuali del server invece di trattare 14 KB come un dogma.
Passaggio 2 — rimanda il resto. Il pattern che web.dev raccomanda per rimandare il CSS non critical è un preload con scambio onload più un fallback <noscript>:
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>Per la produzione, web.dev consiglia di usare funzioni che rimandano il CSS, come loadCSS, che incapsulano questo comportamento e funzionano bene tra i browser invece di costruire lo scambio a mano. Se rimandi con JavaScript, web.dev nota che aspettare l’esecuzione di JavaScript prima di caricare il CSS non critical può ritardare il rendering quando gli utenti scorrono, motivo per cui si usa preload per avviare prima il download.
Strumenti. Raramente si estrae il Critical CSS a mano. L’implementazione di riferimento di Google è il pacchetto npm critical (Addy Osmani), “a tool that extracts, minifies and inlines above-the-fold CSS.” Tra le alternative ci sono Penthouse e CriticalCSS, oltre a numerosi generatori SaaS/plugin per WordPress e Shopify. Per individuare le regole critical, Google rimanda alla scheda Coverage in Chrome DevTools per identificare CSS e JS non critical.
Se usi un plugin o un generatore (WP Rocket, Autoptimize e simili), non prendere un walkthrough dell’interfaccia del vendor o uno screenshot del punteggio prima/dopo come garanzia per la piattaforma: quelle pagine mescolano liberamente versioni del prodotto e risultati di siti specifici, e le differenze di punteggio non sono riprodotte in modo indipendente. Prima di fidarti in produzione, conferma il comportamento nella documentazione e nel numero di versione attuali del plugin e sottoponilo alla stessa matrice di test che useresti per un’implementazione manuale: caricamenti a freddo e ripetuti, breakpoint/temi/stati reali e policy CSP, se ne usi una.
Nota che il Critical CSS è solo una delle correzioni al CSS render-blocking. Le altre sono limitare i fogli di stile con l’attributo media (così vengono scaricati ma non bloccano il paint) e inviare semplicemente meno CSS in primo luogo: l’articolo di web.dev sul render-blocking punta in realtà sull’approccio dell’attributo media invece che sull’inlining, quindi Google ha più di una prescrizione ufficiale a seconda del documento che leggi.
La posizione effettiva di Google (il filo dell’accuratezza)
È la parte che quasi ogni articolo concorrente nasconde, ed è il motivo per cui ho voluto scrivere questo. Google non presenta il Critical CSS come consiglio predefinito. Il suo codelab è netto sul rischio: Questo codelab descrive una tecnica avanzata di performance che può migliorare le prestazioni, ma può anche causare bug se non viene implementata correttamente. E, in due punti della documentazione, Google dice che la maggior parte dei siti non dovrebbe preoccuparsene: La maggior parte dei siti dovrebbe riuscire a raggiungere tutti i nostri obiettivi di performance consigliati senza implementare questa tecnica.
Evidence for this claim web.dev presents critical CSS as an advanced technique that can cause bugs and says most sites can meet performance targets without it. Scope: web.dev codelab guidance; not a universal recommendation. Confidence: high · Verified: web.dev: Extract and inline critical CSSAnche il vantaggio ha un avvertimento. web.dev segnala che l’inlining ha anche alcuni svantaggi perché impedisce al browser di memorizzare il CSS nella cache per riutilizzarlo nei caricamenti successivi, quindi è meglio usarlo con parsimonia — e, quando si esagera, se tutto ha la priorità, nulla ce l’ha. Inserisci troppo CSS inline e gonfi l’HTML che stai cercando di consegnare rapidamente.
La formulazione onesta è quindi: il Critical CSS è una tecnica reale, documentata e talvolta potente, ma è avanzata, facoltativa e da ultima risorsa; Google dice che la maggior parte dei siti non ne ha bisogno per raggiungere i propri obiettivi. Trattalo come tale.
I compromessi reali
Gli ingegneri indipendenti delle performance sono stati le voci più insistenti su questo punto e le loro osservazioni coincidono con le cautele di Google.
Cache persa nelle visite ripetute. Matt Zeunert di DebugBear lo afferma chiaramente: il Critical CSS non può essere riutilizzato tra diversi caricamenti di pagina sul sito, quindi le visite successive possono essere effettivamente più lente di quanto sarebbero senza Critical CSS. Un foglio di stile esterno normale viene memorizzato una volta e riutilizzato ovunque; il CSS inline viene scaricato di nuovo dentro ogni risposta HTML.
Rischio di manutenzione e regressioni. Il pezzo controcorrente di Harry Roberts è il punto di vista più citato e il suo avvertimento è che adattare il Critical CSS a posteriori è difficile e soggetto a errori: una volta identificato il CSS come collo di bottiglia, “you need to keep it that way… One wrong decision can undo everything.” Non esiste una rivalidazione automatica: una modifica al template o al design può rompere silenziosamente la separazione critical/non-critical.
Condizioni di gara nel defer. Roberts osserva anche che lo scambio preload/onload può ritorcersi contro sul piano dei tempi: se servono 1s per analizzare il tuo <head> e 0,5s per recuperare asincronamente il CSS non-Critical, il CSS tornerà a essere un file sincrono 0,5s prima che tu sia comunque pronto a partire. E quando il CSS non critical arriva tardi, rischi un flash di contenuto senza stile e uno spostamento del layout.
Spesso non è affatto il collo di bottiglia. La tesi centrale di Roberts è: il Critical CSS aiuta solo se il CSS è il tuo più grande collo di bottiglia nel blocco del rendering, e molto spesso non lo è. DebugBear concorda: prima dell’inlining, controlla che il CSS sia davvero il problema, perché se hai ancora codice JavaScript render-blocking, è improbabile che l’inlining del CSS aiuti, e “often it’s not the most impactful optimization.”
Insidie di produzione: CSP, stato e font
Tre ulteriori modalità di errore che non emergono in una demo rapida ma colpiscono quando la tecnica è online:
Una policy CSP può bloccare del tutto il tuo blocco inline <style>. Una policy Content-Security-Policy style-src può bloccare un blocco critical inline <style> se la policy non lo autorizza esplicitamente, di solito tramite nonce o hash corrispondente. MDN documenta i casi di violazione e i meccanismi nonce/hash. Ricorrere a unsafe-inline per far sparire l’errore della console indebolisce la policy sull’intero sito e non è una correzione predefinita: collega la generazione di nonce/hash allo strumento che estrae il Critical CSS e controlla la console del browser per le violazioni dopo il rilascio.
“Unused at capture” non significa “safe to defer”. La scheda Coverage mostra quale CSS è stato eseguito durante una registrazione. Una separazione sicura deve preservare l’ordine della cascata e le regole necessarie per breakpoint responsive, varianti del tema, contenuti personalizzati, stati di focus, menu/modali aperti e stati di errore, non solo ciò che è stato renderizzato in quel singolo passaggio. Roberts pone la stessa domanda da un’altra prospettiva: quale viewport e quali elementi fuori schermo o non interagiti (dropdown, flyout) deve effettivamente coprire la tua estrazione?
Non risolve il problema dei font e può aggiungere lavoro al rendering. Inserire gli stili degli elementi non rende di per sé un web font scopribile prima né garantisce che il testo venga renderizzato in tempo: scoperta del font, preload, font-display e metriche di fallback sono dipendenze separate che il Critical CSS non tocca. E applicare un sottoinsieme inline seguito da un foglio di stile più grande può significare ricalcolo aggiuntivo degli stili, layout e paint; ridurre il ritardo di recupero non significa automaticamente ridurre il lavoro totale di rendering. Misura entrambi, non solo il waterfall di rete.
Come diagnosticare se ti serve davvero
Dato tutto questo, non iniziare con “aggiungi Critical CSS”: inizia con “conferma che il CSS sia il mio collo di bottiglia nel rendering” e non fermarti lì. Ci sono quattro cancelli e tutti devono essere superati prima che valga la pena farlo:
1. Il CSS è un blocco dimostrato, non un’ipotesi.
- Apri il report PageSpeed Insights / Lighthouse. A partire da Lighthouse 13, il vecchio audit “Eliminate render-blocking resources” è confluito nell’insight Render-blocking requests: gli articoli più vecchi che citano il vecchio nome dell’audit sono obsoleti.
- Usa la scheda Coverage in Chrome DevTools per vedere quanto del tuo CSS (e JS) è davvero inutilizzato al primo paint.
- Separa le cause. Se il collo di bottiglia è JavaScript render-blocking o una risposta lenta del server (TTFB), inserire il CSS inline non risolverà il problema: ottimizzeresti la cosa sbagliata.
2. Puoi costruire una copertura di estrazione davvero stabile — attraverso breakpoint, temi, personalizzazione e stati interattivi reali, non un solo screenshot desktop (vedi le insidie sopra).
3. Il costo delle visite ripetute e della CSP è accettabile. Il CSS inline non viene memorizzato nella cache, quindi soppesa il costo rispetto alla profondità della sessione tipica. Se usi una policy CSP style-src, la generazione di nonce/hash deve essere collegata alla pipeline prima del rilascio, non scoperta dopo.
4. Lo manterrai davvero. Rigeneralo a ogni modifica di template o design e riesegui la matrice di test completa — caricamenti a freddo e ripetuti, ogni route/viewport/stato supportato — non un singolo controllo a occhio dopo il deploy.
Se tutti e quattro i cancelli tengono, il Critical CSS vale il costo di manutenzione. Se anche uno solo non tiene, le correzioni più economiche — rimuovere CSS inutilizzato, minimizzare, limitare i fogli di stile non critical con media — sono la scelta migliore.
Un problema attuale del 2026
C’è una complicazione attuale da segnalare: esiste un report aperto e non risolto secondo cui l’esatto pattern <link rel="preload" as="style"> che la documentazione Google raccomanda per rimandare il CSS ha ricominciato a essere segnalato come render-blocking dopo un aggiornamento dei punti Lighthouse/PSI.
L’issue #17031 su GitHub documenta CSS precaricato che appare verde in Lighthouse 13.0.1 e poi viene segnalato come render-blocking in 13.3.0. Al momento non esiste una risoluzione Google pubblica, quindi trattalo come un tema in sviluppo, ma la lezione pratica resta: se PSI segnala il tuo CSS correttamente rimandato, l’audit può essere sbagliato; leggi il report criticamente invece di presumere che l’implementazione sia rotta.
Il Critical CSS aiuta la SEO?
Indirettamente e in misura modesta. Occorre separare due cose:
- Il CSS non è un segnale di ranking diretto. Martin Splitt ha detto dei nomi delle classi CSS: “I don’t think we care because the CSS class names are just that.” Si riferisce nello specifico ai nomi delle classi, ma smentisce il mito più ampio secondo cui le tue scelte CSS vengono lette come input di ranking.
- La velocità è un segnale piccolo, tramite i Core Web Vitals. Il Critical CSS può migliorare il primo paint, che può migliorare LCP, una metrica dei Core Web Vitals che alimenta i segnali di page experience di Google. Questo è tutto il collegamento SEO: un paint più veloce, non un bonus per la tecnica in sé.
Il caso SEO del Critical CSS è esattamente forte quanto il suo impatto sull’LCP del tuo sito, che, secondo Google e la comunità delle performance, è spesso più piccolo di quanto suggeriscano i tool dei vendor che lo vendono.
E Bing?
Niente di specifico per Bing. A differenza di Google, che ha più pagine web.dev e un codelab sulla tecnica, non ho trovato alcun documento Bing/Microsoft dedicato al Critical CSS. Si applicano le indicazioni generali di Bing su performance e UX (mantieni le cose veloci e i contenuti critical raggiungibili), ma non esiste un equivalente Bing del codelab Critical CSS di web.dev. Chi sostiene che Bing abbia una raccomandazione specifica sul Critical CSS la sta inventando.
Dove si colloca
Questa pagina è annidata sotto l’hub critical rendering path: il Critical CSS è una tattica per accorciare quel percorso — ed è il fratello pratico di render-blocking resources. Il beneficio, quando c’è, appare in Largest Contentful Paint (LCP), First Contentful Paint (FCP) e nell’insieme più ampio dei Core Web Vitals. Per il quadro più ampio della performance, vedi il cluster web performance.
Riepilogo AI
Una sintesi della versione Advanced:
- Critical CSS = estrai + inserisci + rimanda. Estrai il CSS above-the-fold, inseriscilo nel
<head>e carica asincronamente il resto del foglio di stile. Funziona perché il CSS è render-blocking per impostazione predefinita (“the browser won’t render any processed content until the CSSOM is constructed”). Non esiste un’altezza above-the-fold universale: dispositivo, orientamento, zoom e stato della pagina cambiano ciò che è “critical”. - Implementazione: inserisci gli stili critical in un blocco
<style>; rimanda il resto con scambiorel="preload"+onloade fallback<noscript>(oppureloadCSS). Mantieni il payload inline sotto circa 14 KB compresso — guida datata 2019 di Google, ancora citata spesso ma da verificare rispetto al protocollo attuale. Strumenti:critical(Addy Osmani), Penthouse e generatori plugin (verifica in modo indipendente le dichiarazioni specifiche della versione). Trova le regole critical con la scheda Coverage di DevTools. - Posizione di Google (filo dell’accuratezza): tecnica avanzata e facoltativa, non consiglio predefinito. Google: “Most sites should be able to achieve all of our recommended performance targets without implementing this technique,” e il codelab avverte che “can also lead to bugs if not implemented properly.”
- Compromessi: il CSS inline non viene memorizzato nella cache tra caricamenti (le visite ripetute possono essere più lente — DebugBear); la separazione critical/non-critical si rompe quando cambiano template, temi o stati (Harry Roberts: “One wrong decision can undo everything”); una policy CSP
style-srcpuò bloccare il blocco inline senza nonce/hash; lo scambio preload/onload può entrare in gara o causare FOUC/CLS; e da solo non risolve i tempi di caricamento dei font. - Diagnostica prima, quattro cancelli: conferma che il CSS, non JavaScript o il tempo di risposta del server, sia il vero collo di bottiglia render-blocking (Roberts, DebugBear); conferma che la copertura di estrazione sia stabile tra breakpoint/temi/stati; conferma che il costo di visite ripetute e CSP sia accettabile; conferma che lo manterrai e lo testerai di nuovo. Se JS blocca, inserire CSS inline non aiuta.
- Impatto SEO indiretto: il CSS non è un segnale di ranking diretto (Martin Splitt sui nomi delle classi); l’unica leva è paint più veloce → LCP → Core Web Vitals.
- Non esiste una guida specifica di Bing. Nota inoltre una regressione Lighthouse 13.3.0 del 2026 (issue #17031) che segnala come render-blocking CSS correttamente rimandato.
Documentazione ufficiale
Documentazione primaria sul Critical CSS e sulle risorse render-blocking.
Google / web.dev
- Extract critical CSS — definizione centrale, meccanismi inline e defer, target di circa 14 KB e avvertenza sull’uso parsimonioso per via della cache.
- Extract and inline critical CSS with Critical (codelab) — guida pratica allo strumento
critical; avvertenze sulla “advanced technique… can also lead to bugs” e sul fatto che la maggior parte dei siti può farcela “without implementing this technique”. - Defer non-critical CSS — pattern di defer
rel="preload"+onloade raccomandazione diloadCSS. - Preload critical assets — perché precaricare il CSS rimandato e avvertenza sul ritardo di scroll causato dal defer JavaScript.
- Render-blocking CSS — perché il CSS blocca il rendering; inquadra la correzione intorno all’attributo
mediainvece che all’inlining. - Understand the critical path — dove si colloca il Critical CSS nel quadro più ampio del critical rendering path.
Google / Chrome for Developers (Lighthouse)
- Eliminate render-blocking resources — l’audit dietro questo lavoro: inserisci gli stili critical, rimanda il CSS non critical e usa la scheda Coverage. (Nota: da Lighthouse 13 è confluito nell’insight “Render-blocking requests”).
- Optimize CSS Delivery (legacy/deprecato) — il documento originale di PageSpeed Insights che ha reso popolare il consiglio sul Critical CSS; utile per la storia, non per le indicazioni attuali.
MDN
- Content-Security-Policy: style-src — documenta come una policy CSP
style-srcblocchi i blocchi inline<style>senza nonce o hash corrispondente e perchéunsafe-inlinenon è la correzione. È l’insidia di produzione che la maggior parte delle guide sul Critical CSS salta.
Bing / Microsoft
- Non esiste documentazione Bing specifica sul “Critical CSS”. Si applicano le indicazioni generali di Bing su performance e UX (vedi Bing Webmaster Tools Site Scan), ma non esiste un equivalente Bing del codelab Critical CSS di web.dev.
Citazioni dalla fonte
Dichiarazioni pubbliche di Google/web.dev, Martin Splitt di Google ed esperti di performance del settore nominati. Ogni link web.dev/Chrome che supporta un frammento di testo è un deep link al passaggio citato.
Google / web.dev — cos’è e come funziona
- “Critical CSS is a technique that extracts the CSS for above-the-fold content in order to render content to the user as fast as possible.” Vai alla citazione
- “Inlining extracted styles in the
<head>of the HTML document eliminates the need to make an additional request to fetch these styles. The remainder of the CSS can be loaded asynchronously.” Inlining extracted styles in the head of the HTML document eliminates the need to make an additional request to fetch these styles. The remainder of the CSS can be loaded asynchronously - “By default, CSS is treated as a render-blocking resource, which means that the browser won’t render any processed content until the CSSOM is constructed.” Vai alla citazione
Google / web.dev — è avanzato e facoltativo (il filo dell’accuratezza)
- “Most sites should be able to achieve all of our recommended performance targets without implementing this technique.” — web.dev, codelab Extract and inline critical CSS. Leggi il codelab
- “This codelab describes an advanced performance technique that can improve performance, but can also lead to bugs if not implemented properly.” Leggi il codelab
- Sull’inlining eccessivo: “If everything is prioritized then nothing is.” — web.dev, Extract critical CSS. Leggi l’articolo
Google / Chrome (Lighthouse) — la prescrizione dell’audit
- “Inline critical styles required for the first paint inside a
<style>block at theheadof the HTML page.” Leggi l’audit
Martin Splitt, Google Search Relations (tramite Search Engine Journal)
- Sul fatto che i nomi delle classi CSS siano un segnale di ranking: “I don’t think it does. I don’t think we care because the CSS class names are just that.” Leggi la copertura
Harry Roberts, consulente indipendente di web performance (csswizardry.com)
- “Critical CSS only helps if CSS is your biggest render-blocking bottleneck, and quite often, it isn’t.” Leggi l’articolo
- “Retrofitting Critical CSS is difficult and error prone.” — e, sulla manutenzione, “One wrong decision can undo everything.” Leggi l’articolo
Matt Zeunert, fondatore di DebugBear
- “critical CSS can’t be re-used between different page loads on your website. So subsequent page views can actually be slower than they would be without critical CSS.” Leggi l’articolo
- “Before deciding to inline critical CSS, check if it’s actually the bottleneck for rendering content on your website. For example, if you still have render-blocking JavaScript code, inlining CSS is unlikely to help.” Leggi l’articolo
#:~:text=. La frase di Martin Splitt è riportata attraverso la copertura di Search Engine Journal, non una trascrizione primaria di Google, e riguarda nello specifico i nomi delle classi CSS. Conferma ogni citazione contro la fonte live prima di considerarla definitiva. Dovresti implementare il Critical CSS?
Poiché Google, Harry Roberts e DebugBear dicono tutti che “most sites don’t need this”, l’artefatto utile è un albero decisionale dovrei farlo?, non una guida operativa. Percorrilo dall’alto verso il basso.
1. PageSpeed Insights / Lighthouse segnala risorse render-blocking?
- No → Non farlo. Stai risolvendo un problema che non hai.
- Sì → Continua.
2. La risorsa render-blocking è CSS oppure JavaScript / un server lento (TTFB)?
- JavaScript o TTFB → Correggi quello per primo. Inserire CSS inline non aiuta se il JS blocca o il server è lento (DebugBear). Torna qui solo se il CSS resta il collo di bottiglia.
- CSS → Continua.
3. Puoi raggiungere gli obiettivi di performance prima con correzioni CSS più economiche? Prova queste, prima dell’inlining, in ordine:
- Rimuovi il CSS inutilizzato (scheda Coverage).
- Minimizza e comprimi il foglio di stile.
- Limita i fogli non critical con l’attributo
mediacosì vengono scaricati ma non bloccano il paint (la correzione preferita da web.dev nel documento sul CSS render-blocking). - Gli obiettivi non sono ancora raggiunti? → Continua.
4. Puoi impegnarti a mantenere la separazione critical/non-critical tra temi, stati e CSP?
Il Critical CSS si rompe silenziosamente quando cambiano i template (“one wrong decision can undo everything”), e “unused at capture” durante un test non equivale a “safe to defer” tra varianti del tema, contenuti personalizzati e stati aperti/focus/errore. Se usi una policy CSP style-src, la generazione di nonce/hash deve far parte della pipeline, non essere un ripensamento.
- No / il template cambia rapidamente, oppure non puoi coprire la matrice degli stati → Il costo di manutenzione probabilmente supera il beneficio. Preferisci le correzioni più economiche sopra.
- Sì, il template è stabile, puoi coprire gli stati reali e rigenererai alle modifiche → Continua.
5. Hai molti visitatori ripetuti per sessione? Il CSS inline non viene memorizzato nella cache, quindi la seconda/terza pagina perde il vantaggio della cache e può essere più lenta (DebugBear).
- Sì, sessioni profonde su più pagine → Pesa la penalità delle visite ripetute; considera di inserire il CSS inline solo nei template di ingresso/landing.
- Ingressi soprattutto su una sola pagina (per esempio contenuti/landing page) → Continua.
Se sei ancora qui: hai confermato che il CSS è il collo di bottiglia, esaurito le correzioni più economiche, verificato un template stabile e un traffico a ingresso singolo. Ora il Critical CSS vale la pena. Generalo con uno strumento (critical, Penthouse o un plugin), mantieni il payload inline sotto circa 14 KB compresso e rivalidalo dopo ogni modifica al template.
Checklist di implementazione del Critical CSS
Inizia solo dopo aver confermato (scheda Coverage / PageSpeed) che il CSS è davvero il tuo collo di bottiglia render-blocking.
- Ho confermato che il collo di bottiglia è il CSS, non JavaScript render-blocking o una risposta lenta del server (TTFB).
- Ho provato prima le correzioni più economiche — rimosso il CSS inutilizzato, minimizzato/compresso e limitato i fogli non critical con
media— ma non raggiungo ancora gli obiettivi. - Ho estratto il CSS critical above-the-fold (con
critical, Penthouse o un generatore), non l’intero foglio di stile, usando breakpoint, temi e stati reali, non un solo screenshot desktop. - Ho inserito il CSS critical in un blocco
<style>dentro il<head>. - Se uso una policy CSP
style-src, ho collegato la generazione nonce/hash alla pipeline e confermato l’assenza di violazioni della console con la policy reale di produzione. - Ho mantenuto il payload inline sotto circa 14 KB compresso — guida Google datata 2019, ancora citata ma da verificare rispetto al protocollo attuale (entra nel primo round trip).
- Ho rimandato asincronamente il foglio di stile completo (
rel="preload"+ scambioonloadoppureloadCSS). - Ho aggiunto il foglio di stile di fallback
<noscript>per gli utenti con JS disattivato. - Ho controllato FOUC / spostamento del layout mentre arriva il CSS rimandato (osserva CLS).
- Ho rieseguito PageSpeed/Lighthouse e letto criticamente il risultato render-blocking (un file CSS correttamente rimandato può essere segnalato erroneamente; vedi issue #17031).
- Ho impostato un promemoria di rivalidazione: rigenerare il Critical CSS dopo ogni modifica a template o design, perché la separazione si rompe silenziosamente.
- Ho controllato le performance delle visite ripetute: il CSS inline non è in cache, quindi ho verificato che la seconda visita non sia peggiorata.
Anti-pattern del Critical CSS
Gli errori ricorrenti: la maggior parte deriva dal trattare una tecnica avanzata e facoltativa come una scelta predefinita.
Usarlo prima di diagnosticare. È l’errore più comune. Se il tuo render-blocker è JavaScript o un server lento, inserire il CSS inline non fa nulla: se hai ancora codice JavaScript render-blocking, è improbabile che l’inlining del CSS aiuti. Conferma prima che il CSS sia il collo di bottiglia.
Inserire tutto inline. Scaricare l’intero foglio di stile nell’HTML gonfia proprio ciò che stai cercando di consegnare rapidamente. web.dev: se tutto ha la priorità, nulla ce l’ha. Il Critical CSS è CSS above-the-fold minimo, non “tutto, inline”.
Ignorare il costo delle visite ripetute. Il CSS inline non viene memorizzato nella cache, quindi le visite successive possono essere effettivamente più lente di quanto sarebbero senza Critical CSS. Applicarlo a livello di sito in un percorso profondo su più pagine può rendere più lenta la sessione complessiva, non più veloce.
Impostarlo e dimenticarsene. Non esiste una rivalidazione automatica. Come avverte Harry Roberts, una decisione sbagliata può annullare tutto: una modifica al template rompe silenziosamente la separazione e ora stai distribuendo CSS above-the-fold errato o incompleto.
Trattare un flag PSI come prova che il problema sia il CSS. L’audit segnala risorse render-blocking; non dimostra che il CSS sia il tuo collo di bottiglia e può perfino segnalare erroneamente CSS correttamente rimandato (vedi la regressione Lighthouse 13.3.0, issue #17031). Leggi il report, non reagire soltanto al punteggio.
Aspettarsi un aumento SEO diretto. Il Critical CSS non è un fattore di ranking. Il CSS non viene letto come segnale di ranking (Martin Splitt); l’unica leva è paint più veloce → LCP → Core Web Vitals, e solo se la tecnica migliora davvero il tuo LCP.
Distribuirlo senza controllare la CSP. Se il sito usa un header Content-Security-Policy style-src, un blocco inline <style> senza nonce o hash corrispondente viene bloccato del tutto: ricorrere a unsafe-inline per silenziare l’errore indebolisce la policy dell’intero sito invece di correggere la pipeline.
Estrarlo da un solo tema, stato o route e considerarlo finito. “Unused” in una registrazione della scheda Coverage non equivale a “safe to defer” tra tema scuro, contenuti personalizzati o modale aperto: una separazione che considera solo lo stato predefinito distribuirà stili above-the-fold rotti a tutti gli altri.
Strumenti per il Critical CSS
Estrazione / generazione
critical(Addy Osmani) — pacchetto npm di riferimento di Google; “extracts, minifies and inlines above-the-fold CSS.” È quello usato dal codelab Google.- Penthouse — generatore del CSS critical path molto usato, spesso collegato alle pipeline di build.
- CriticalCSS e vari generatori SaaS / plugin — per implementatori non tecnici su WordPress, Shopify e simili (WP Rocket, corewebvitals.io e altri). Sono comodi, ma restano gli stessi compromessi e rischi di manutenzione.
Diagnostica (da fare prima)
- Chrome DevTools — scheda Coverage — la raccomandazione di Google per identificare CSS e JS non critical; mostra quanto di ogni file è inutilizzato al primo paint.
- PageSpeed Insights / Lighthouse — l’audit render-blocking (ora insight “Render-blocking requests” in Lighthouse 13). Indica se hai un problema render-blocking, non automaticamente che la causa sia il CSS.
- WebPageTest — leggi il waterfall e la riga “Start Render” per vedere quali risorse ritardano esattamente il primo paint.
- DebugBear — monitoraggio e spiegazione chiara dei compromessi tra cache e collo di bottiglia.
Diagnostica dei problemi di Critical CSS per sintomo
La pagina mostra un flash di contenuto senza stili
Causa probabile: l’insieme critical estratto è incompleto o il foglio di stile rimandato arriva troppo tardi. Correzione: ripristina le regole di layout e tipografia necessarie alla prima viewport, poi rigenera rispetto allo stato reale del template. Conferma: una filmstrip a freddo e con throttling è stilizzata dal primo paint.
La viewport iniziale sembra corretta ma il contenuto più in basso si rompe
Causa probabile: il bundle non critical non è stato caricato oppure il suo pattern di caricamento entra in gara con l’inizializzazione della pagina. Correzione: verifica la richiesta del foglio di stile e il comportamento di fallback senza affidarti solo al percorso onload. Conferma: scorrimento e navigazione mostrano contenuti completamente stilizzati con JavaScript ritardato.
Il Critical CSS aiuta un template e danneggia un altro
Causa probabile: un insieme generato è stato riutilizzato tra layout con contenuti diversi nella prima vista. Correzione: limita l’estrazione per template oppure rimuovi l’ottimizzazione dove il costo di manutenzione supera il beneficio. Conferma: ogni template supportato supera lo stesso test visivo a freddo.
Le visite ripetute diventano più lente
Causa probabile: troppo CSS è stato inserito in ogni risposta HTML e ha perso la cache normale del foglio di stile. Correzione: riduci l’insieme critical e confronta i benefici della prima vista con il trasferimento e il costo di parsing delle visite ripetute. Conferma: migliorano sia i percorsi a freddo sia quelli caldi, oppure il compromesso viene accettato esplicitamente.
Manca il blocco di stile inline o la console mostra una violazione CSP
Causa probabile: una policy Content-Security-Policy style-src blocca il blocco inline <style> perché manca un nonce o un hash corrispondente. Correzione: collega la generazione nonce/hash alla pipeline di estrazione invece di allentare la policy con unsafe-inline. Conferma: la console del browser non mostra violazioni CSP e il blocco inline viene renderizzato con la policy reale di produzione, non con una policy locale allentata.
Un tema, una variante personalizzata o uno stato interattivo viene renderizzato senza stili
Causa probabile: l’estrazione ha catturato un solo tema, un solo stato disconnesso/predefinito o una sola route e le regole della cascata necessarie agli altri stati sono state scartate come “unused”. Correzione: riestrai rispetto a stati rappresentativi — tema scuro/chiaro, contenuti personalizzati, stati focus/aperto/errore — e conserva l’ordine della cascata. Conferma: ogni stato supportato supera lo stesso test visivo a freddo, non solo quello predefinito.
Usa il framework diagnostica, estrai, distribuisci, mantieni
- Diagnostica: dimostra che il CSS è sul percorso critico con waterfall, registrazione Coverage e trace. Fermati se tempo del server o JavaScript sono il vincolo maggiore.
- Estrai: includi solo le regole necessarie a renderizzare la viewport iniziale reale. Testa stati responsive e contenuti dinamici invece di presumere che uno screenshot copra il template.
- Distribuisci: inserisci il piccolo insieme critical inline e carica il foglio completo con un pattern sicuro in caso di errore. Preserva CSP, ordine della sorgente e comportamento della cache.
- Mantieni: rigenera quando cambiano template o token di design, poi esegui controlli visivi e di performance. Un Critical CSS obsoleto è un difetto di produzione, non un costo di setup una tantum.
Il framework rende il Critical CSS un sistema basato sull’evidenza. Saltare la manutenzione è il modo in cui un guadagno iniziale di velocità diventa più tardi una regressione visiva.
Scheda decisionale del Critical CSS
| Domanda | Segnale | Azione |
|---|---|---|
| Il CSS ritarda il primo paint? | I fogli di stile sono sul percorso critico misurato | Continua la diagnosi |
| Un’altra fase è più grande? | Dominano TTFB o JavaScript | Correggi prima quella |
| L’insieme critical è piccolo e stabile? | Poche regole della prima vista sono condivise dal template | Considera l’estrazione |
| Il primo paint lampeggia o si sposta? | Filmstrip o traccia Layout Shifts mostra una regressione | Ripristina le regole mancanti critiche per il layout |
| Il bundle rimandato fallisce in modo sicuro? | La pagina resta utilizzabile durante il caricamento ritardato | Valida nei percorsi supportati |
| Il team può rigenerarlo? | L’estrazione fa parte delle release del template o del CSS | Mantieni l’ottimizzazione |
| La manutenzione è manuale e fragile? | Output obsoleto distribuito dopo modifiche al design | Preferisci una riduzione o separazione CSS più semplice |
Dimostra che una modifica al Critical CSS ha funzionato
Test visivo del primo paint
Test da eseguire: cattura una filmstrip a freddo e con throttling prima e dopo la modifica nei breakpoint supportati. Risultato previsto: il contenuto above-the-fold utile appare prima ed è stilizzato correttamente dal primo frame. Interpretazione del fallimento: l’insieme critical è incompleto o il CSS non era il vero collo di bottiglia. Finestra di monitoraggio: immediata su esecuzioni ripetute. Trigger di rollback: flash, contenuti mancanti o nuovi spostamenti del layout.
Test del foglio di stile rimandato
Test da eseguire: controlla i pannelli Network e Performance mentre viene caricato il foglio di stile completo. Risultato previsto: il bundle non critical non blocca più il primo paint e continua ad applicarsi in modo affidabile dopo. Interpretazione del fallimento: il pattern di caricamento blocca ancora o entra in gara con l’inizializzazione. Finestra di monitoraggio: immediata, inclusa una richiesta volutamente lenta. Trigger di rollback: gli stili completi non si applicano o i controlli della pagina diventano inutilizzabili.
Test di regressione del template
Test da eseguire: esegui confronti visivi per ogni template e breakpoint che usa l’insieme critical generato. Risultato previsto: nessuna regola mancante o obsoleta della prima vista. Interpretazione del fallimento: la copertura dell’estrazione non corrisponde alle varianti del template di produzione. Finestra di monitoraggio: a ogni release CSS o template rilevante. Trigger di rollback: qualsiasi template di produzione viene renderizzato in modo errato.
Risorse che valgono il tuo tempo
I miei interventi
- What’s Next for Page Experience — SMX Next 2021 (SlideShare) — dove divido il lavoro CSS in un contenitore early/critical (rimuovi inutilizzato → minimizza → inserisci Critical CSS) e uno late/deferred, con il pattern defer preload/onload. Il nucleo del “come si inserisce tutto” per questa pagina.
- Page Experience Update — TMC June 2021 (SlideShare) — deck più ampio su page experience/Core Web Vitals che copre prioritize-critical-resources, lazy-loading e inlining del Critical CSS.
- Google’s Search Signals For Page Experience — SMX Advanced 2021 (SlideShare) — contesto page experience/Core Web Vitals relativo a questo periodo di indicazioni.
I miei contenuti correlati
- What Are Core Web Vitals & How To Improve Them — la mia guida generale ai CWV (LCP/CLS/INP). Non tratta il Critical CSS per nome, che è esattamente la lacuna colmata da questa pagina: leggile insieme per il lato render-blocking dell’LCP.
- The Beginner’s Guide to Technical SEO — dove performance e rendering si inseriscono nel quadro più ampio.
Ufficiale
- web.dev — Extract critical CSS, il codelab Critical, Defer non-critical CSS e Render-blocking CSS.
- Chrome for Developers — Eliminate render-blocking resources (Lighthouse).
Dal settore
- Critical CSS? Not So Fast! (Harry Roberts, csswizardry.com) — la lettura controcorrente essenziale: quando il Critical CSS aiuta, quando non aiuta e le insidie di manutenzione/condizioni di gara.
- Inlining Critical CSS: Does It Make Your Website Faster? (Matt Zeunert, DebugBear) — il compromesso della cache e l’argomento “diagnostica prima il collo di bottiglia”, con misurazioni.
- How To Identify & Reduce Render-Blocking Resources (Abby Hamilton / Dentsu, tramite Search Engine Journal) — il flusso operativo per leggere l’audit render-blocking.
- Google Confirms CSS Class Names Don’t Influence SEO (Matt G. Southern, Search Engine Journal) — Martin Splitt sul perché il CSS non sia un segnale di ranking diretto.
- Lighthouse issue #17031 (GitHub) — il report live del 2026 sul CSS precaricato segnalato come render-blocking dopo un aggiornamento di PSI; utile quando il CSS correttamente rimandato viene segnalato.
- Understanding Critical CSS (Smashing Magazine, 2015) — il classico articolo esplicativo, datato ma utile per il contesto storico della tecnica.
Mettiti alla prova: Critical CSS
Cinque domande rapide su cos’è il Critical CSS, quando usarlo e quali sono i suoi compromessi. Scegli una risposta per ciascuna e poi controlla.
Cronologia modifiche
Aggiornato il 17 lug 2026.
Riepilogo editoriale e dettagli registrati delle modifiche.Dettagli delle modifiche
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
-
Le note dettagliate sulle modifiche sono attualmente disponibili in inglese.
Confronto completo non disponibile — non è stata archiviata alcuna istantanea precedente per questa revisione.