Uno strumento potente per controllare in modo esplicito l'ordine di applicazione degli stili, rendendo il nostro codice più prevedibile e manutenibile.

I CSS Cascade Layers sono una funzionalità che permette di definire esplicitamente l'ordine di priorità dei nostri stili CSS. Invece di affidarci alla specificità e all'ordine di dichiarazione, possiamo organizzare il CSS in "livelli" (layers) con priorità definite.
@layer reset {
/* Definiamo l'ordine dei layer */
@layer reset, base, components, utilities;
/* Reset layer - priorità più bassa */
@layer reset {
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
}
/* Base layer */
@layer base {
body {
font-family: system-ui, sans-serif;
line-height: 1.6;
}
}
/* Components layer */
@layer components {
.button {
background: blue;
color: white;
padding: 0.5rem 1rem;
}
}
/* Utilities layer - priorità più alta */
@layer utilities {
.text-center {
text-align: center;
}
}
La priorità dei layer segue queste regole:
@layer A, B, C;
@layer A {
.element { color: red; } /* Priorità 1 */
}
@layer B {
.element { color: blue; } /* Priorità 2 */
}
@layer C {
.element { color: green; } /* Priorità 3 - vince */
}
/* Questo vince su tutti i layer */
.element { color: purple; }
@layer
reset,
base,
tokens,
components,
patterns,
utilities,
overrides;
@layer reset {
/* Reset CSS */
}
@layer base {
/* Stili base per HTML elements */
}
@layer tokens {
/* Design tokens e custom properties */
}
@layer components {
/* Componenti riutilizzabili */
}
@layer patterns {
/* Pattern di layout complessi */
}
@layer utilities {
/* Utility classes */
}
@layer overrides {
/* Override specifici quando necessario */
}
@layer framework {
@layer reset, base, components;
@layer reset {
/* Reset styles */
}
@layer base {
/* Base styles */
}
@layer components {
@layer buttons, forms, cards;
@layer buttons {
.btn { /* button styles */ }
}
@layer forms {
.form { /* form styles */ }
}
@layer cards {
.card { /* card styles */ }
}
}
}
/* Per React/Vue components */
@layer components {
.header-component {
background: var(--header-bg);
padding: 1rem;
}
}
/* Per utility frameworks come Tailwind */
@layer base, components, utilities;
@layer base {
/* Base styles */
}
@layer components {
/* Custom components */
}
@layer utilities {
/* Tailwind utilities o custom utilities */
}
@layer themes {
@layer light, dark, high-contrast;
@layer light {
:root {
--bg-color: white;
--text-color: black;
}
}
@layer dark {
:root[data-theme="dark"] {
--bg-color: black;
--text-color: white;
}
}
@layer high-contrast {
:root[data-theme="high-contrast"] {
--bg-color: black;
--text-color: yellow;
}
}
}
@layer responsive {
@layer mobile, tablet, desktop;
@layer mobile {
.container {
padding: 1rem;
}
}
@layer tablet {
@media (min-width: 768px) {
.container {
padding: 2rem;
}
}
}
@layer desktop {
@media (min-width: 1024px) {
.container {
padding: 3rem;
}
}
}
}
/* Importiamo Bootstrap in un layer specifico */
@layer third-party {
@import url('bootstrap.css');
}
/* I nostri stili hanno priorità più alta */
@layer third-party, custom;
@layer custom {
.btn {
/* Questo sovrascrive Bootstrap senza !important */
border-radius: 8px;
}
}
/* ✅ Buona pratica */
@layer reset, base, components, utilities;
/* ❌ Evitare - ordine implicito */
@layer utilities {
/* ... */
}
@layer base {
/* ... */
}
/* ✅ Nomi chiari */ @layer reset, typography, layout, components, utilities; /* ❌ Nomi generici */ @layer a, b, c, d;
/** * Layer Strategy: * 1. reset - CSS reset * 2. base - Base HTML elements * 3. tokens - Design tokens * 4. components - UI components * 5. utilities - Utility classes * 6. overrides - Necessary overrides */ @layer reset, base, tokens, components, utilities, overrides;
/* ✅ Usa i layer invece di !important */
@layer overrides {
.special-case {
color: red; /* Vince senza !important */
}
}
/* ❌ Evita quando possibile */
.special-case {
color: red !important;
}
I browser moderni mostrano i layer nei DevTools, rendendo più facile capire perché un certo stile viene applicato.
// postcss.config.js
module.exports = {
plugins: [
require('postcss-cascade-layers')({
// Opzioni per validazione layer
})
]
}
styles/ ├── layers/ │ ├── reset.css │ ├── base.css │ ├── components.css │ └── utilities.css ├── main.css └── layer-order.css
I CSS Cascade Layers non hanno impatto negativo sulle performance. Anzi, possono migliorare la manutenibilità riducendo la necessità di specificità complesse e
!important.
# Analizza l'uso di !important
grep -r "!important" src/styles/
# Verifica la specificità
npx css-analyzer src/styles/
/* Inizia con una struttura semplice */
@layer base, components, utilities;
/* Sposta gradualmente i file esistenti */
@layer base {
@import url('./base.css');
}
@layer components {
@import url('./components.css');
}
I CSS Cascade Layers rappresentano un'evoluzione fondamentale nella gestione delle priorità CSS. Nel 2025, con il supporto universale dei browser, non c'è motivo di non utilizzarli per:
L'adozione dei CSS Cascade Layers non è solo una best practice, ma una necessità per progetti CSS scalabili e manutenibili nel panorama dello sviluppo web moderno.