HTML CSS JAVASCRIPT SQL MYSQL PYTHON JAVA PHP C C++ C# PACKET TRACER CYBERSECURITY REACT TYPESCRIPT NODE.JS GIT & GITHUB DATA SCIENCE BOOTSTRAP GO KOTLIN JQUERY DJANGO VUE ANGULAR MONGODB POSTGRESQL SASS NUMPY PANDAS SCIPY DSA RUST SWIFT BASHXMLW3.CSSANGULARJSAIAWSPROGRAMMAZIONEEXCEL WORD POWERPOINT
Corso gratuito

Corso Sass / SCSS in italiano

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

SCSS vs Sass (sintassi indented)

SCSSSass (indented)
Estensione.scss.sass
SintassiCome CSS + supersetIndentazione, senza {}
Compatibilità CSS100% — qualsiasi CSS è SCSS validoNo — sintassi diversa
Popolarità🥇 Standard de factoMeno comune
Prima differenza SCSS vs Sass
SCSS
// SCSS — simile al CSS
$primary: #4f46e5;

.card {
  background: $primary;
  border-radius: 8px;

  h2 {
    color: white;
    font-size: 1.5rem;
  }
}
CSS compilato
.card {
  background: #4f46e5;
  border-radius: 8px;
}
.card h2 {
  color: white;
  font-size: 1.5rem;
}
💡 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
Flusso di lavoro Sass
// styles.scss (scrivi tu)
$brand-color: #4f46e5;
$radius: 8px;

.button {
  background: $brand-color;
  border-radius: $radius;
  padding: .6rem 1.2rem;
  color: white;

  &:hover {
    background: darken($brand-color, 10%);
  }
}
styles.css (generato automaticamente)
.button {
  background: #4f46e5;
  border-radius: 8px;
  padding: .6rem 1.2rem;
  color: white;
}
.button:hover {
  background: #3730a3;
}

Dove viene usato 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.

Variabili base
SCSS
// Definizione variabili
$primary:    #4f46e5;
$secondary:  #06b6d4;
$accent:     #f59e0b;
$gray-100:   #f8fafc;
$gray-900:   #0f172a;

$font-base:  'Inter', sans-serif;
$font-head:  'Poppins', sans-serif;

$radius-sm:  4px;
$radius-md:  8px;
$radius-lg:  16px;

$shadow:     0 4px 6px -1px rgba(0,0,0,.1);

// Utilizzo
.card {
  background:    $gray-100;
  border-radius: $radius-md;
  box-shadow:    $shadow;
  font-family:   $font-base;
}

.btn-primary {
  background: $primary;
  color:      white;
}
CSS compilato
.card {
  background: #f8fafc;
  border-radius: 8px;
  box-shadow: 0 4px 6px -1px rgba(0,0,0,.1);
  font-family: "Inter", sans-serif;
}
.btn-primary {
  background: #4f46e5;
  color: white;
}

Scope delle variabili

Variabili locali vs globali
SCSS
$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
}
CSS compilato
.elemento {
  color: red;
}
.altro {
  color: blue;
}
.dopo {
  color: green;
}

Default con !default

!default — valori sovrascrivibili (design system)
// _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.

Nesting base
SCSS
nav {
  background: #1e293b;
  padding: 1rem;

  ul {
    list-style: none;
    display: flex;
    gap: 1rem;
  }

  a {
    color: white;
    text-decoration: none;
    padding: .4rem .8rem;
    border-radius: 6px;

    &:hover {
      background: rgba(255,255,255,.15);
    }

    &.active {
      background: #4f46e5;
    }
  }
}
CSS compilato
nav {
  background: #1e293b;
  padding: 1rem;
}
nav ul {
  list-style: none;
  display: flex;
  gap: 1rem;
}
nav a {
  color: white;
  text-decoration: none;
  padding: .4rem .8rem;
  border-radius: 6px;
}
nav a:hover {
  background: rgba(255,255,255,.15);
}
nav a.active {
  background: #4f46e5;
}

L'operatore & (parent selector)

& — selettore padre
SCSS
// & sostituisce il selettore genitore
.btn {
  background: #4f46e5;

  &:hover  { background: #4338ca; }   // .btn:hover
  &:focus  { outline: 2px solid #4f46e5; }
  &:active { transform: scale(.97); }

  &--primary { background: #4f46e5; } // .btn--primary (BEM)
  &--danger  { background: #dc2626; } // .btn--danger
  &--sm      { font-size: .85rem; }   // .btn--sm

  // & dopo: selettore genitore in contesto diverso
  .dark-mode & {
    background: #818cf8;              // .dark-mode .btn
  }
}
CSS compilato
.btn { background: #4f46e5; }
.btn:hover  { background: #4338ca; }
.btn:focus  { outline: 2px solid #4f46e5; }
.btn:active { transform: scale(.97); }
.btn--primary { background: #4f46e5; }
.btn--danger  { background: #dc2626; }
.btn--sm      { font-size: .85rem; }
.dark-mode .btn { background: #818cf8; }

Nesting delle proprietà

Property nesting (namespace)
SCSS
// Raggruppa proprietà con lo stesso prefisso
.testo {
  font: {
    family: 'Inter', sans-serif;
    size: 1rem;
    weight: 600;
    style: italic;
  }
  border: {
    top: 2px solid #e2e8f0;
    bottom: 2px solid #e2e8f0;
  }
}
CSS compilato
.testo {
  font-family: "Inter", sans-serif;
  font-size: 1rem;
  font-weight: 600;
  font-style: italic;
  border-top: 2px solid #e2e8f0;
  border-bottom: 2px solid #e2e8f0;
}
⚠️ 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;
}
CSS compilato
.card {
  color: #4f46e5;
  padding: 1rem;
  margin: 2rem;
}
.btn {
  background: #4f46e5;
  padding: .5rem 1rem;
}

@forward — esponi moduli

@forward — crea un punto di accesso unico
// _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.

Mixin base
SCSS
// Definizione mixin
@mixin flex-center {
  display: flex;
  align-items: center;
  justify-content: center;
}

@mixin truncate($width: 100%) {
  width: $width;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

// Utilizzo
.hero {
  @include flex-center;
  min-height: 100vh;
}

.card-title {
  @include truncate(250px);
}

.label {
  @include truncate;   // usa il default: 100%
}
CSS compilato
.hero {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
}
.card-title {
  width: 250px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.label {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

Mixin con argomenti multipli e default

Mixin responsive breakpoint
SCSS
// Mixin per media query responsive
@mixin respond-to($bp) {
  @if $bp == sm {
    @media (min-width: 640px)  { @content; }
  } @else if $bp == md {
    @media (min-width: 768px)  { @content; }
  } @else if $bp == lg {
    @media (min-width: 1024px) { @content; }
  } @else if $bp == xl {
    @media (min-width: 1280px) { @content; }
  }
}

// Utilizzo con @content
.container {
  padding: 1rem;

  @include respond-to(md) {
    padding: 2rem;
    max-width: 768px;
  }

  @include respond-to(lg) {
    padding: 3rem;
    max-width: 1024px;
  }
}
CSS compilato
.container {
  padding: 1rem;
}
@media (min-width: 768px) {
  .container {
    padding: 2rem;
    max-width: 768px;
  }
}
@media (min-width: 1024px) {
  .container {
    padding: 3rem;
    max-width: 1024px;
  }
}

Mixin avanzati — variadic args

Mixin con argomenti variadic e @content
// Argomenti multipli con ...
@mixin transition($properties...) {
  transition: $properties;
}

.btn {
  @include transition(background .2s, transform .15s, box-shadow .2s);
}

// Mixin che genera utility class
@mixin generate-colors($colors) {
  @each $name, $value in $colors {
    .bg-#{$name}   { background: $value; }
    .text-#{$name} { color: $value; }
    .border-#{$name} { border-color: $value; }
  }
}

$palette: (
  primary: #4f46e5,
  danger:  #dc2626,
  success: #16a34a,
);

@include generate-colors($palette);
// Genera: .bg-primary, .text-primary, .border-primary, .bg-danger, ...

Sass — @extend e %placeholder

@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.

@extend base
SCSS
// Classe base
.message {
  padding: 1rem 1.4rem;
  border-radius: 8px;
  font-size: .95rem;
  border-left: 4px solid;
}

// Estensioni
.success {
  @extend .message;
  border-color: #16a34a;
  background:   #f0fdf4;
  color:        #15803d;
}

.error {
  @extend .message;
  border-color: #dc2626;
  background:   #fef2f2;
  color:        #b91c1c;
}

.warning {
  @extend .message;
  border-color: #d97706;
  background:   #fffbeb;
  color:        #92400e;
}
CSS compilato
.message,
.success,
.error,
.warning {
  padding: 1rem 1.4rem;
  border-radius: 8px;
  font-size: .95rem;
  border-left: 4px solid;
}
.success {
  border-color: #16a34a;
  background: #f0fdf4;
  color: #15803d;
}
.error {
  border-color: #dc2626;
  background: #fef2f2;
  color: #b91c1c;
}
.warning {
  border-color: #d97706;
  background: #fffbeb;
  color: #92400e;
}

%placeholder — estensioni silenziose

%placeholder
SCSS
// %placeholder non genera CSS da solo
%card-base {
  background: white;
  border-radius: 12px;
  box-shadow: 0 4px 6px -1px rgba(0,0,0,.1);
  padding: 1.5rem;
}

%visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  clip: rect(0,0,0,0);
  overflow: hidden;
}

// Solo quando viene esteso appare nel CSS
.product-card { @extend %card-base; }
.user-card    { @extend %card-base; }

.sr-only { @extend %visually-hidden; }
CSS compilato
.product-card,
.user-card {
  background: white;
  border-radius: 12px;
  box-shadow: 0 4px 6px -1px rgba(0,0,0,.1);
  padding: 1.5rem;
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  clip: rect(0,0,0,0);
  overflow: hidden;
}

@extend vs @mixin — quando usare quale

@extend / %placeholder@mixin
Quando usareSelettori che condividono identiche regoleBlocchi con variazione (parametri)
Output CSSRaggruppa selettori (,)Duplica le regole in ogni classe
ArgomentiNoSì
@contentNoSì
Best forAlert, tag, badge, statiMedia query, flex helpers, animazioni

Sass — Funzioni String

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"]

Interpolazione di stringhe

Interpolazione #{} — costruisci selettori dinamicamente
SCSS
$tema: "dark";
$componente: "card";

// #{} inserisce un valore nella stringa
.#{$tema}-#{$componente} {
  background: #1e293b;
  color: white;
}

// Genera classi utility dinamicamente
$sizes: (sm: .5rem, md: 1rem, lg: 2rem, xl: 3rem);

@each $name, $value in $sizes {
  .p-#{$name}  { padding: $value; }
  .m-#{$name}  { margin: $value; }
  .gap-#{$name}{ gap: $value; }
}
CSS compilato
.dark-card {
  background: #1e293b;
  color: white;
}
.p-sm  { padding: .5rem; }
.p-md  { padding: 1rem; }
.p-lg  { padding: 2rem; }
.p-xl  { padding: 3rem; }
.m-sm  { margin: .5rem; }
/* ... e così via */

Sass — Funzioni Numeric

Il modulo sass:math fornisce funzioni matematiche e permette operazioni numeriche avanzate. Sass supporta anche gli operatori aritmetici direttamente nelle regole CSS.

Operatori aritmetici in Sass
@use "sass:math";

// Sass supporta +, -, *, /, % con unità compatibili
$base: 16px;
$scale: 1.25;

h1 { font-size: $base * $scale * $scale * $scale; }  // 31.25px
h2 { font-size: $base * $scale * $scale; }            // 25px
h3 { font-size: $base * $scale; }                     // 20px

// Divisione — usa math.div() (non / che è riservato in CSS)
.colonna {
  width: math.div(100%, 3);    // 33.333%
  padding: math.div(2rem, 2);  // 1rem
}

// Percentuali
.progress[data-value="75"] {
  width: math.div(75, 100) * 100%;  // 75%
}
Funzioni math principali
@use "sass:math";

// Arrotondamento
math.ceil(4.2)   // 5
math.floor(4.8)  // 4
math.round(4.5)  // 5
math.clamp(0, 5, 10)  // 5 (min, value, max)

// Valore assoluto e segno
math.abs(-15px)  // 15px
math.sign(-3)    // -1

// Potenza e logaritmo
math.pow(2, 10)  // 1024
math.sqrt(144)   // 12
math.log(100, 10) // 2

// Trigonometria (Dart Sass 1.65+)
math.sin(math.$pi * 0.5)  // 1
math.cos(0deg)             // 1

// Costanti
math.$pi     // 3.1415...
math.$e      // 2.7182...
Generatore di scala tipografica
SCSS
@use "sass:math";

$base: 1rem;
$ratio: 1.25;   // Major Third

// Genera scale tipografica modulare
@for $i from 1 through 6 {
  h#{$i} {
    font-size: $base * math.pow($ratio, 7 - $i);
  }
}
CSS compilato
h1 { font-size: 3.052rem; }
h2 { font-size: 2.441rem; }
h3 { font-size: 1.953rem; }
h4 { font-size: 1.563rem; }
h5 { font-size: 1.25rem; }
h6 { font-size: 1rem; }

Sass — Funzioni List

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;
  }
}
CSS compilato
.border-top    { border-top:    1px solid #e2e8f0; }
.border-right  { border-right:  1px solid #e2e8f0; }
.border-bottom { border-bottom: 1px solid #e2e8f0; }
.border-left   { border-left:   1px solid #e2e8f0; }

.container-sm  { max-width: 640px; margin: 0 auto; }
.container-md  { max-width: 768px; margin: 0 auto; }
.container-lg  { max-width: 1024px; margin: 0 auto; }
.container-xl  { max-width: 1280px; margin: 0 auto; }

Sass — Funzioni Map

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.

Definizione e accesso alle mappe
@use "sass:map";

// Definizione mappa (design tokens)
$colors: (
  primary:   #4f46e5,
  secondary: #06b6d4,
  success:   #16a34a,
  warning:   #d97706,
  danger:    #dc2626,
  muted:     #64748b,
);

$spacing: (
  xs: .25rem,
  sm: .5rem,
  md: 1rem,
  lg: 1.5rem,
  xl: 2rem,
  2xl: 3rem,
);

// Accesso con map.get
$p: map.get($colors, primary);   // #4f46e5
$m: map.get($spacing, md);       // 1rem

// map.has-key — verifica esistenza
map.has-key($colors, "purple")   // false

// map.keys e map.values
map.keys($colors)    // primary secondary success warning danger muted
map.values($spacing) // .25rem .5rem 1rem 1.5rem 2rem 3rem

// map.merge — unisce due mappe
$extra: (accent: #f59e0b, dark: #0f172a);
$all-colors: map.merge($colors, $extra);

// map.remove — rimuove una chiave
$no-muted: map.remove($colors, muted);
Genera utility classes da mappe
SCSS
@use "sass:map";

$colors: (primary:#4f46e5, success:#16a34a, danger:#dc2626);
$spacing: (sm:.5rem, md:1rem, lg:2rem);

// Genera bg-, text- per ogni colore
@each $name, $value in $colors {
  .bg-#{$name}   { background-color: $value; }
  .text-#{$name} { color: $value; }
}

// Genera p-, m- per ogni spaziatura
@each $name, $value in $spacing {
  .p-#{$name} { padding: $value; }
  .m-#{$name} { margin: $value; }
}
CSS compilato
.bg-primary    { background-color: #4f46e5; }
.text-primary  { color: #4f46e5; }
.bg-success    { background-color: #16a34a; }
.text-success  { color: #16a34a; }
.bg-danger     { background-color: #dc2626; }
.text-danger   { color: #dc2626; }
.p-sm { padding: .5rem; }
.p-md { padding: 1rem; }
.p-lg { padding: 2rem; }
/* ... */
map.deep-get — accesso annidato
@use "sass:map";

// Mappa annidata (design system complesso)
$theme: (
  colors: (
    brand: #4f46e5,
    text: (
      primary: #0f172a,
      muted:   #64748b,
    ),
  ),
  spacing: (base: 1rem, scale: 1.25),
);

// Accesso annidato
$brand: map.get(map.get($theme, colors), brand);          // #4f46e5
$muted: map.deep-get($theme, colors, text, muted);         // #64748b (Sass 1.x)

Sass — Funzioni Selector

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;
  }
}
CSS compilato
.btn {
  background: #4f46e5;
}
.btn:hover,
.btn:focus-visible {
  background: #4338ca;
  outline: 2px solid #4f46e5;
}

Sass — Funzioni Introspection

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
}
CSS compilato
.card {
  padding: 1.5rem;
}
.btn {
  padding: 1rem;
}

Sass — Funzioni Color

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.

Funzioni Color principali
@use "sass:color";

$primary: #4f46e5;

// Schiarisce / scurisce (0-100%)
color.lighten($primary, 20%)   // #8b84ef
color.darken($primary, 15%)    // #302a99

// Aumenta / riduce la saturazione
color.saturate($primary, 20%)
color.desaturate($primary, 20%)

// Opacità (mix con trasparente)
color.transparentize($primary, 0.5)  // rgba(79,70,229, 0.5)
color.opacify($primary, 0.3)

// Imposta o regola i componenti HSL
color.adjust($primary, $lightness: 10%, $saturation: -5%)
color.change($primary, $hue: 200deg)    // cambia solo l'hue
color.scale($primary, $lightness: 20%)  // scala in modo percentuale

// Mescola due colori
color.mix($primary, white, 80%)   // 80% primary + 20% white
color.mix($primary, black, 90%)   // quasi primary, lievemente più scuro

// Complementare / inverso
color.complement($primary)         // colore complementare
color.invert($primary)             // colore invertito

// Canali HSL e RGB
color.hue($primary)         // 243deg
color.saturation($primary)  // 73.7%
color.lightness($primary)   // 58.6%
color.red($primary)         // 79
color.green($primary)       // 70
color.blue($primary)        // 229
color.alpha($primary)       // 1
Genera una color palette automatica
SCSS
@use "sass:color";

$brand: #4f46e5;

// Crea scala di colori automaticamente
$palette: (
  50:  color.mix($brand, white, 10%),
  100: color.mix($brand, white, 20%),
  200: color.mix($brand, white, 40%),
  300: color.mix($brand, white, 60%),
  400: color.mix($brand, white, 80%),
  500: $brand,
  600: color.mix($brand, black, 85%),
  700: color.mix($brand, black, 70%),
  800: color.mix($brand, black, 55%),
  900: color.mix($brand, black, 40%),
);

@each $shade, $value in $palette {
  .brand-#{$shade} { background: $value; }
}
CSS compilato
.brand-50  { background: #eceafe; }
.brand-100 { background: #d9d8fc; }
.brand-200 { background: #b4b1f9; }
.brand-300 { background: #8e8af6; }
.brand-400 { background: #6963ec; }
.brand-500 { background: #4f46e5; }
.brand-600 { background: #433cca; }
.brand-700 { background: #3730a3; }
.brand-800 { background: #2b267e; }
.brand-900 { background: #1e1b58; }

Esercizi Sass

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.