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. Se vuoi un percorso guidato personalizzato, posso seguirti con ripetizioni di informatica in presenza a Roma.
🎯 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.