Impara il preprocessore CSS più popolare al mondo: variabili, nesting, mixin, moduli e funzioni avanzate. Ogni lezione mostra il codice SCSS affiancato al CSS compilato risultante.
Introduzione a SASS
Sass (Syntactically Awesome Style Sheets) è il preprocessore CSS più popolare al mondo. Aggiunge al CSS funzionalità mancanti come variabili, nesting, mixin, funzioni e moduli, permettendo di scrivere fogli di stile più organizzati, riutilizzabili e manutenibili.
Sass viene compilato in CSS standard: scrivi codice Sass, esegui il compilatore e ottieni un file .css pronto per il browser. Questo significa zero dipendenze a runtime — il browser riceve CSS normale.
Perché usare Sass?
Variabili — definisci colori, font e dimensioni una volta sola e riusali ovunque
Nesting — specchia la struttura HTML nel CSS, elimina la ripetizione dei selettori
Mixin — blocchi di stile riutilizzabili con parametri (come funzioni nel CSS)
@extend — condividi regole tra selettori senza duplicare il codice
Moduli — dividi i tuoi stili in file separati organizzati per componente
Funzioni built-in — manipola colori, stringhe, numeri e liste direttamente in Sass
Operatori — calcola dimensioni e valori con espressioni matematiche
💡 Sass vs SCSS: in questo corso usiamo SCSS (la sintassi moderna con le parentesi graffe), che è lo standard adottato da tutti i framework CSS moderni come Bootstrap, Tailwind e Angular Material.
Sass — Introduzione
Sass è stato creato nel 2006 da Hampton Catlin e Natalie Weizenbaum. Oggi è mantenuto da un team attivo e ha diventato lo standard per la gestione avanzata degli stili in progetti frontend di medie e grandi dimensioni.
Come funziona la compilazione
1️⃣ Scrivi i tuoi stili in file .scss
2️⃣ Il compilatore Sass legge i file e risolve variabili, mixin, nesting ecc.
3️⃣ Produce uno o più file .css standard
4️⃣ Il browser carica il CSS compilato — non conosce Sass
Bootstrap 5 — tutto il framework è scritto in SCSS
Angular — usa SCSS di default per i component styles
Vue CLI / Vite — supporto SCSS integrato con un semplice plugin
Create React App / Vite — npm install sass e sei pronto
WordPress — i temi professionali usano SCSS per la manutenibilità
Design system — Salesforce Lightning, IBM Carbon, Material Design tutti usano Sass
🚀 Ambiente per esercitarsi: usa SassMeister per provare il codice Sass online senza installare nulla — vedi subito il CSS compilato.
Sass — Installazione
Puoi installare Sass in tre modi principali: tramite npm (il più comune nei progetti moderni), tramite il package standalone o tramite Homebrew su macOS.
Via npm (consigliato)
Installa Sass con npm
# Installa Sass globalmente
npm install -g sass
# Verifica l'installazione
sass --version
# Dart Sass 1.x.x
# Oppure installalo nel progetto (dipendenza di sviluppo)
npm install --save-dev sass
Compila un file SCSS
Compilazione da riga di comando
# Compila una volta sola
sass input.scss output.css
# Modalità watch (ricompila automaticamente ad ogni salvataggio)
sass --watch input.scss output.css
# Watch su cartella intera
sass --watch scss/:css/
# Con source map (per il debug in browser DevTools)
sass --watch --source-map scss/:css/
# Output compresso (produzione)
sass --style=compressed input.scss output.min.css
Integrazione con Vite (React/Vue)
Sass in un progetto Vite
# Crea progetto Vite
npm create vite@latest my-app -- --template react
cd my-app
npm install
# Aggiungi Sass (nessuna configurazione aggiuntiva necessaria!)
npm install --save-dev sass
# Ora puoi importare file .scss direttamente nei componenti
# In React:
# import './styles.scss'
# In Vue SFC:
# <style lang="scss">
# .card { color: $primary; }
# </style>
VS Code — estensioni utili
Live Sass Compiler — compila automaticamente i file SCSS al salvataggio
SCSS IntelliSense — autocompletamento per variabili, mixin e funzioni Sass
Sass — syntax highlighting per file .sass e .scss
📌 Dart Sass vs LibSass: il compilatore ufficiale attuale è Dart Sass. LibSass (C++) è deprecato dal 2020. Alcuni strumenti vecchi usavano node-sass (basato su LibSass): se lo vedi in un progetto, aggiornalo a sass (Dart Sass).
Sass — Variabili
Le variabili Sass iniziano con $ e permettono di definire valori riutilizzabili — colori, font, spaziature, breakpoint — in un unico posto. Se cambi una variabile, l'intera UI si aggiorna automaticamente.
$colore: blue; // globale
.elemento {
$colore: red; // locale — non sovrascrive la globale
color: $colore; // red
}
.altro {
color: $colore; // blue — usa la globale
}
// !global forza la sovrascrittura globale
.modifica {
$colore: green !global;
}
.dopo {
color: $colore; // green
}
// _config.scss — valori di default modificabili
$primary: #4f46e5 !default;
$radius: 8px !default;
// main.scss — personalizza PRIMA di importare
$primary: #e11d48; // sovrascrive il default
@use 'config'; // usa $primary = #e11d48, $radius = 8px (default)
💡 Best practice: crea un file _variables.scss (o _tokens.scss) con tutte le variabili del progetto. Il trattino iniziale segnala che il file non deve essere compilato direttamente — viene importato dagli altri.
Sass — Nesting
Il nesting (annidamento) permette di scrivere selettori CSS figli all'interno del selettore genitore, rispecchiando la struttura HTML. Elimina la ripetizione dei selettori e rende il codice più leggibile.
⚠️ Non annidare troppo! Massimo 3-4 livelli di profondità. Annidamenti profondi generano selettori CSS troppo specifici (alta specificity) e difficili da mantenere. Segui la regola: se lo scrivi in CSS non lo annideresti, in Sass neanche.
Sass — @use, @forward e @import
Sass permette di dividere i tuoi stili in più file (chiamati partial) e combinarli. La regola moderna è @use (sostituisce il vecchio @import). I file partial iniziano con _ per indicare che non devono essere compilati da soli.
@use — la regola moderna
@use — importa un modulo Sass
SCSS
// _colors.scss
$primary: #4f46e5;
$accent: #f59e0b;
$muted: #64748b;
// _spacing.scss
$xs: .25rem;
$sm: .5rem;
$md: 1rem;
$lg: 2rem;
// main.scss
@use 'colors'; // accede con colors.$primary
@use 'spacing';
.card {
color: colors.$primary;
padding: spacing.$md;
margin: spacing.$lg;
}
// Alias per nomi più corti
@use 'colors' as c;
@use 'spacing' as s;
.btn {
background: c.$primary;
padding: s.$sm s.$md;
}
// _index.scss (barrel file)
@forward 'colors';
@forward 'spacing';
@forward 'typography';
@forward 'mixins';
// In qualsiasi altro file, importi tutto in una riga:
@use 'index' as *; // oppure: @use '.' as *;
.elemento {
color: $primary; // da colors
padding: $md; // da spacing
}
Struttura di un progetto Sass (7-1 pattern)
Architettura Sass consigliata
// Struttura 7-1 (7 cartelle + 1 main)
sass/
abstracts/
_variables.scss // variabili, tokens
_mixins.scss // mixin riutilizzabili
_functions.scss // funzioni custom
_index.scss // @forward di tutti gli abstracts
base/
_reset.scss // CSS reset
_typography.scss // stili tipografici
components/
_button.scss
_card.scss
_navbar.scss
layout/
_header.scss
_footer.scss
_grid.scss
pages/
_home.scss
_about.scss
themes/
_dark.scss
vendors/
_normalize.scss // librerie terze
main.scss // importa tutto con @use
⚠️ @import è deprecato: dal 2022 @import è ufficialmente deprecato in Sass e verrà rimosso in futuro. Usa sempre @use e @forward nei nuovi progetti. La differenza principale: @use crea uno scope isolato (no variabili globali tra file).
Sass — @mixin
I mixin sono blocchi di stile riutilizzabili che puoi includere in qualsiasi selettore con @include. Supportano argomenti (con valori di default), @content per blocchi annidati e sono il cuore della riusabilità in Sass.
@extend permette a un selettore di ereditare le regole di un altro. I placeholder (%nome) sono selettori speciali che esistono solo per essere estesi — non vengono compilati nel CSS se non usati.
Sass offre un set di funzioni built-in per le stringhe nel modulo sass:string. Permettono di manipolare testo, costruire selettori dinamici e generare nomi di classi.
Funzioni String principali
@use "sass:string";
// string.quote / string.unquote
$valore: string.quote(rosso); // "rosso"
$senza: string.unquote("Inter"); // Inter (senza virgolette)
// string.length — lunghezza in caratteri
$len: string.length("Sass"); // 4
// string.to-upper-case / to-lower-case
$up: string.to-upper-case("hello"); // "HELLO"
$low: string.to-lower-case("WORLD"); // "world"
// string.slice(str, start, end) — sottostringa (1-based)
$sub: string.slice("Sass CSS", 1, 4); // "Sass"
$end: string.slice("Sass CSS", 6); // "CSS"
// string.index — trova la posizione
$pos: string.index("Sass CSS", "CSS"); // 6 (o null se non trovato)
// string.insert — inserisce in una posizione
$ins: string.insert("SaCSS", "ss ", 3); // "Sass CSS"
// string.split — divide una stringa (Dart Sass 1.57+)
$parts: string.split("uno,due,tre", ","); // ["uno", "due", "tre"]
Il modulo sass:math fornisce funzioni matematiche e permette operazioni numeriche avanzate. Sass supporta anche gli operatori aritmetici direttamente nelle regole CSS.
Le liste in Sass sono sequenze di valori separati da spazio o virgola. Il modulo sass:list fornisce funzioni per accedere, modificare e iterare le liste.
Funzioni List principali
@use "sass:list";
$shadow-layers: 0 1px 3px rgba(0,0,0,.12),
0 1px 2px rgba(0,0,0,.24);
// list.length — numero di elementi
list.length($shadow-layers) // 2
// list.nth — accedi a un elemento (1-based, o negativo da fine)
list.nth($shadow-layers, 1) // 0 1px 3px rgba(0,0,0,.12)
list.nth($shadow-layers, -1) // ultimo elemento
// list.index — trova la posizione
$font-stack: 'Inter', 'Roboto', sans-serif;
list.index($font-stack, 'Roboto') // 2
// list.append — aggiunge un elemento
$new: list.append($font-stack, monospace); // aggiunge in fondo
// list.join — unisce due liste
$a: 1px 2px;
$b: 3px 4px;
list.join($a, $b) // 1px 2px 3px 4px
list.join($a, $b, $separator: comma) // 1px, 2px, 3px, 4px
// list.zip — crea lista di liste
list.zip(a b c, 1 2 3) // (a 1), (b 2), (c 3)
@each su liste — genera CSS
SCSS
// Lista di bordi per lati
$sides: top right bottom left;
@each $side in $sides {
.border-#{$side} {
border-#{$side}: 1px solid #e2e8f0;
}
}
// Lista di breakpoint
$bp-list: (sm 640px) (md 768px) (lg 1024px) (xl 1280px);
@each $name, $width in $bp-list {
.container-#{$name} {
max-width: $width;
margin: 0 auto;
}
}
Le mappe (map) in Sass sono coppie chiave-valore, simili agli oggetti JavaScript. Sono perfette per design token — colori, spaziature, breakpoint — e per generare classi utility sistematicamente.
Il modulo sass:selector permette di analizzare e manipolare selettori CSS in modo programmatico. Utile per creare mixin avanzati che gestiscono la specificity o costruiscono selettori complessi.
Funzioni Selector principali
@use "sass:selector";
// selector.nest — annida selettori
selector.nest(".parent", ".child")
// → .parent .child
selector.nest(".list", "li", "a")
// → .list li a
// selector.append — aggiunge senza spazio (concatena)
selector.append(".btn", ":hover")
// → .btn:hover
selector.append(".icon-", "star", "-lg")
// → .icon-star-lg (non standard, per illustrazione)
// selector.extend — equivalente di @extend
selector.extend(".a, .b", ".b", ".c")
// → .a, .b, .c
// selector.replace — sostituisce un componente
selector.replace("a.disabled", "a", ".link")
// → .link.disabled
// selector.unify — combina due selettori
selector.unify("a", ".active")
// → a.active
// selector.is-superselector — verifica se un sel. è più generico
selector.is-superselector("div", "div.active") // true
// "div" è un superselector di "div.active
Mixin che usa selector functions
SCSS
@use "sass:selector";
// Mixin che applica stili a :hover e :focus insieme
@mixin on-interact($selector: "&") {
$hover: selector.append($selector, ":hover");
$focus: selector.append($selector, ":focus-visible");
#{$hover}, #{$focus} {
@content;
}
}
.btn {
background: #4f46e5;
@include on-interact {
background: #4338ca;
outline: 2px solid #4f46e5;
}
}
Le funzioni di introspection del modulo sass:meta permettono di interrogare il tipo di un valore, verificare se una variabile o mixin esiste, e ottenere informazioni sul contesto di compilazione.
Funzioni Introspection principali
@use "sass:meta";
// meta.type-of — tipo del valore
meta.type-of(42) // number
meta.type-of("ciao") // string
meta.type-of(true) // bool
meta.type-of(#ff0000) // color
meta.type-of(1rem 2rem) // list
meta.type-of((a: 1)) // map
meta.type-of(null) // null
// meta.inspect — rappresentazione come stringa
meta.inspect(1rem 2rem 3rem) // "1rem 2rem 3rem"
// meta.variable-exists — controlla se $var è definita
meta.variable-exists(primary) // true/false (senza $)
// meta.mixin-exists
meta.mixin-exists(flex-center) // true/false
// meta.function-exists
meta.function-exists(darken, sass:color) // true
// meta.module-variables — tutte le variabili di un modulo
@use "sass:color";
meta.module-variables(color) // mappa con tutte le variabili di sass:color
// meta.content-exists (dentro un mixin)
@mixin wrapper {
@if meta.content-exists() {
.wrapper { @content; }
}
}
@if con type-of — validazione degli argomenti
SCSS
@use "sass:meta";
// Mixin con validazione del tipo
@mixin padding($value) {
@if meta.type-of($value) != number {
@error "padding richiede un numero, ricevuto: #{meta.type-of($value)}";
}
@if not unitless($value) and unit($value) == "px" {
// converte px in rem
padding: $value / 16px * 1rem;
} @else {
padding: $value;
}
}
.card {
@include padding(24px); // → 1.5rem
}
.btn {
@include padding(1rem); // → 1rem
}
Il modulo sass:color offre funzioni potenti per manipolare i colori — schiarire, scurire, saturare, mescolare, trasparenza — rendendo facile creare scale di colori e variazioni di tema.
Metti alla prova le tue conoscenze con questi esercizi pratici. Usa SassMeister online oppure un progetto locale con sass --watch.
Esercizio 1 — Design Tokens
🟢 Base
Crea un file _tokens.scss con:
Una mappa $colors con almeno 6 colori (primary, secondary, success, warning, danger, muted)
Una mappa $spacing con 6 valori (xs, sm, md, lg, xl, 2xl)
Variabili per font-family, border-radius e box-shadow
Un loop @each che genera le classi .bg-*, .text-* da $colors
Un loop che genera .p-* e .m-* da $spacing
Esercizio 2 — Componenti con Mixin
🟡 Intermedio
Scrivi un mixin respond-to($bp) con i breakpoint sm/md/lg/xl
Crea un componente .card responsive: 1 colonna su mobile, 2 su md, 3 su lg
Scrivi un mixin button-variant($bg, $text) che genera tutti gli stati (:hover, :focus, :active, :disabled) di un bottone calcolando i colori con le funzioni color
Usa il mixin per creare .btn-primary, .btn-success e .btn-danger
Esercizio 3 — Sistema completo
🔴 Avanzato
Struttura il progetto con l'architettura 7-1: abstracts/, base/, components/, layout/
Usa @use e @forward per un barrel file abstracts/_index.scss
Genera una scala tipografica modulare (ratio 1.25) con un @for loop
Crea un %placeholder per ogni tipo di alert (info, success, warning, error) e usalo con @extend
Implementa un sistema di dark mode: variabili CSS custom generate da mappe Sass, con .dark class toggle
Conclusione — E ora?
Complimenti! 🎉 Hai completato il corso Sass completo e gratuito in italiano: dalla sintassi SCSS e le variabili, al nesting e i moduli, fino ai mixin, @extend, placeholder e alle funzioni built-in per stringhe, numeri, liste, mappe, selettori, introspection e colori.
Sass è uno strumento che migliora immediatamente la qualità del tuo CSS: codice più organizzato, meno ripetizioni, design token centralizzati. Tutti i framework CSS moderni lo usano — imparare Sass significa leggere e contribuire a Bootstrap, Angular Material, Foundation e centinaia di altri progetti.
E ora?
Ora che sai scrivere CSS avanzato con Sass, il passo successivo naturale è Bootstrap — il framework CSS più usato al mondo, scritto interamente in SCSS e configurabile tramite le sue variabili Sass. In alternativa, approfondisci il CSS puro per capire le basi su cui Sass si costruisce.
🎯 La tua sfida finale
Costruisci da zero un design system in Sass: un file _tokens.scss con tutte le variabili, mixin per la tipografia e il layout responsive, palette di colori generata automaticamente con le funzioni color, e componenti (button, card, alert, badge, form) usando @extend e @mixin. Poi usalo per ricreare la UI di un sito che conosci. Pubblicalo su GitHub Pages: sarà una dimostrazione pratica e concreta delle tue competenze frontend avanzate.