Sintassi & Cascade
Come è strutturata una regola CSS, come si collega all'HTML, e come funziona la cascata
Struttura di una regola CSS
FONDAMENTALE
Ogni regola CSS è composta da: selettore + blocco { } con coppie proprietà: valore; — ogni dichiarazione deve terminare con il punto e virgola. I commenti si scrivono tra /* */.
CSS
RISULTATO
▶ HTML usato in questo esempio
<h1>Titolo principale</h1>
<p>Paragrafo normale di testo.</p>
<p class="speciale">Paragrafo con classe speciale!</p>
Come si collega il CSS all'HTML — 3 metodi
COLLEGAMENTO
1. Foglio esterno (✓ consigliato) — file separato .css collegato con <link> nell'<head>
2. Interno — tag <style> nell'<head>
3. Inline — attributo style="" sul singolo tag. Specificità massima. Da evitare perché difficile da mantenere.
CSS
RISULTATO
▶ HTML con i 3 metodi di collegamento
<!-- METODO 1 — foglio esterno (nell'<head>) -->
<link rel="stylesheet" href="stile.css">

<!-- METODO 2 — stile interno (nell'<head>) -->
<style>
  p { color: red; }
</style>

<!-- METODO 3 — inline (da evitare) -->
<p style="color: tomato; font-size: 16px;">testo</p>

<!-- Nel demo: -->
<p class="esterno">Stile da foglio esterno (simulato)</p>
<p class="interno">Stile interno (<style>)</p>
<p style="color:tomato;font-family:sans-serif;font-size:15px">Stile inline (color:tomato)</p>
La Cascata — chi vince quando ci sono conflitti
IMPORTANTE
"CSS" sta per Cascading Style Sheets. In caso di conflitto tra regole vince quella con:
  • 1. !important — sovrascrive tutto (usalo il meno possibile)
  • 2. Specificità più alta — inline > ID > Classe > Tag
  • 3. Ordine nel codice — a parità di specificità vince l'ultima
  • 4. Origine — inline > interno > esterno > browser default
CSS
RISULTATO
▶ HTML usato in questo esempio
<p>Solo tag p → blu</p>
<p class="rosso">Classe .rosso → rosso</p>
<p id="speciale">ID #speciale → verde</p>
<p class="rosso override">!important → viola</p>
Ereditarietà CSS
Quali proprietà si "trasmettono" automaticamente dai genitori ai figli
Proprietà ereditate vs non ereditate
CONCETTO
Alcune proprietà si ereditano automaticamente dai genitori — non servono da riscrivere su ogni elemento.

✓ SI ereditano✗ NON si ereditano
color, font-family, font-size, font-weight, font-style, line-height, letter-spacing, text-align, text-transform, visibility, cursor, list-style margin, padding, border, width, height, background, display, position, float, overflow, box-shadow, border-radius
La keyword inherit forza l'ereditarietà anche per proprietà che di default non si ereditano.
CSS
RISULTATO
▶ HTML usato in questo esempio
<p>Testo body — eredita font e colore</p>
<div class="contenitore">
  Contenitore blu (border NON si eredita)
  <p>Figlio → eredita il colore blu</p>
  <span>Anche span eredita il blu</span>
  <div class="figlio-bordo">
    border: inherit → eredita il bordo!
  </div>
</div>
<p class="reset">color:initial → torna al default browser</p>
Colori in CSS
Tutti i formati colore: nome, hex, rgb, rgba, hsl, hsla, transparent, currentColor
Tutti i formati del colore a confronto
COLORI
nome — 140 parole chiave: red, blue, tomato, royalblue, goldenrod…
#hex 6 cifre — coppie RR GG BB in esadecimale (00–FF): #ff0000 = rosso puro
#hex 3 cifre — versione breve quando ogni coppia è uguale: #f00 = #ff0000
rgb(r,g,b) — valori 0–255 per rosso, verde, blu
rgba(r,g,b,a) — come rgb + alpha 0–1 (trasparenza)
hsl(h,s%,l%) — Hue 0–360°, Saturazione %, Luminosità %. Intuitivo per variare tonalità
hsla(h,s%,l%,a) — come hsl + trasparenza
transparent — completamente trasparente
currentColor — usa il valore corrente di color (utile per border, outline, fill SVG)
CSS
RISULTATO
▶ HTML usato in questo esempio
<p class="nome1">Nome: tomato</p>
<p class="nome2">Nome: royalblue</p>
<p class="hex6">Hex 6: #1a73e8</p>
<p class="hex3">Hex 3: #f00 = #ff0000</p>
<p class="rgb">rgb(34, 197, 94)</p>
<p class="rgba">rgba con sfondo trasparente</p>
<p class="hsl1">hsl(280,80%,55%) — viola</p>
<p class="hsl3">hsl(220,80%,30%) — blu scuro</p>
<p class="hsl4">hsl(220,80%,60%) — blu chiaro</p>
<p class="transp">transparent + bordo rgba</p>
<p class="current">currentColor — border usa il colore del testo</p>
Unità di misura
px, em, rem, %, vw, vh, ch, vmin, vmax — assolute vs relative
Tutte le unità a confronto
UNITÀ
UnitàRelativa aUso tipico
pxpixel fisicobordi, shadow, icone
%contenitore padrewidth, height fluidi
emfont-size del genitorepadding, margin relativi al font
remfont-size di <html>font-size, spaziatura globale ✓
vw1% larghezza viewportsezioni full-width, font fluidi
vh1% altezza viewporthero a schermo intero (height:100vh)
vminil minore tra vw e vhelementi quadrati adattivi
vmaxil maggiore tra vw e vhraro
chlarghezza del carattere "0"width righe di testo (60ch = leggibile)
Attenzione con em: si accumula nei tag annidati! Se padre=16px e figlio=1.5em → 24px, nipote=1.5em → 36px. rem è stabile perché punta sempre all'<html>.
CSS
RISULTATO
▶ HTML usato in questo esempio
<label>Larghezze</label>
<div class="box px">180px fisso</div>
<div class="box perc">70% del contenitore</div>
<div class="box vw">60vw (viewport width)</div>
<div class="box ch">40ch (larghezza ottimale per leggere)</div>
<label>Font-size: em vs rem</label>
<div class="box em-box">1.3em (relativo al padre)</div>
<div class="box rem-box">1.3rem (relativo ad html, stabile)</div>
<label>Accumulo em nei tag annidati</label>
<div class="padre">Padre 1em=16px
  <div class="figlio">Figlio 1.5em=24px
    <div class="nipote">Nipote 1.5em=36px! (accumulo)</div>
  </div>
</div>
Testo & Tipografia
Titoli h1–h6, paragrafi, font, allineamento, decorazioni — tutto il CSS per il testo
Tag HTML per il testo — h1, h2, h3, h4, h5, h6, p
HTML + CSS
I tag di intestazione h1–h6 hanno valori di default diversi impostati dal browser. Con CSS puoi sovrascrivere tutto.
h1 — titolo principale (uno solo per pagina, importante per SEO)
h2 — sottotitolo di sezione
h3–h6 — sottosezioni di livello crescente
p — paragrafo. Ha margin top e bottom di default.
span — elemento inline senza significato semantico, utile per stilare parti di testo
CSS — stila i titoli!
RISULTATO
▶ HTML — struttura gerarchica h1→h6
<h1>Titolo principale h1</h1>
<p>Paragrafo introduttivo con testo descrittivo.</p>
<h2>Sezione principale h2</h2>
<p>Paragrafo della sezione.</p>
<h3>Sottosezione h3</h3>
<h4>Gruppo h4</h4>
<h5>Dettaglio h5</h5>
<h6>Nota h6</h6>
Tutte le proprietà tipografiche
FONT
ProprietàValoriNota
font-familyArial, sans-serif…Elenco fallback separati da virgola
font-size16px, 1rem, 1.2emPreferire rem per consistenza
font-weightnormal(400), bold(700), 100–900Dipende dal font disponibile
font-stylenormal, italic, oblique
font-variantnormal, small-capsMaiuscoletto
line-height1.6, 24px, 150%Senza unità = moltiplicatore. 1.5–1.8 ideale
letter-spacing0.5px, -1pxNegativo avvicina le lettere
word-spacing4pxSpazio tra parole
text-alignleft, right, center, justifyjustify → testo giustificato
text-decorationnone, underline, line-through, overlinePuò avere colore e stile: underline red wavy
text-transformuppercase, lowercase, capitalize, nonecapitalize → Prima lettera maiuscola
text-indent20px, 2emRientro prima riga
text-shadowx y blur coloreOmbra del testo. Più valori separati da virgola
CSS
RISULTATO
▶ HTML usato in questo esempio
<h2>Tipografia CSS</h2>
<p class="f-bold">font-weight: bold (700)</p>
<p class="f-300">font-weight: 300 (leggero)</p>
<p class="f-italic">font-style: italic</p>
<p class="f-sc">font-variant: small-caps</p>
<p class="align-c">text-align: center</p>
<p class="align-r">text-align: right</p>
<p class="deco-ul">text-decoration: underline</p>
<p class="deco-lt">text-decoration: line-through</p>
<p class="deco-col">underline red wavy</p>
<p class="upper">text-transform uppercase</p>
<p class="capital">ogni parola maiuscola</p>
<p class="lh-tight">line-height: 1.1 (interlinea stretta)</p>
<p class="lh-loose">line-height: 2.2 (molto spaziato)</p>
<p class="ls-wide">letter-spacing: 6px</p>
<p class="shadow1">text-shadow base</p>
<p class="shadow2">text glow effect</p>
<p class="indent">text-indent: rientro della prima riga</p>
<p class="justify">text-align justify: Testo giustificato che va a capo per mostrare l'effetto di allineamento ai margini.</p>
Box Model
Ogni elemento HTML è una "scatola" composta da 4 strati sovrapposti
I 4 strati: content → padding → border → margin
FONDAMENTALE
content — il contenuto vero (testo, immagine…). Si controlla con width e height.
padding — spazio interno tra contenuto e bordo. Ha il colore di sfondo dell'elemento.
border — il bordo visibile. Fa parte delle dimensioni (tranne con box-sizing: border-box).
margin — spazio esterno tra l'elemento e gli altri. È trasparente (vedi lo sfondo del padre).
margin
border
padding
content
CSS — modifica i valori!
RISULTATO
▶ HTML + shorthand margin/padding spiegato
<div class="scatola">
  Sono una scatola!<br>
  width: 220px | padding: 20px 30px | border: 3px
</div>

<!-- SHORTHAND margin e padding: -->
<!-- 1 valore:  tutti e 4 i lati uguali        -->
<!-- 2 valori:  top/bottom | left/right         -->
<!-- 3 valori:  top | left/right | bottom       -->
<!-- 4 valori:  top | right | bottom | left (senso orario) -->
Sfondi & Bordi
background-color, immagini, gradienti, bordi, border-radius, box-shadow
Sfondo: colore, immagine e gradiente
SFONDO
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="col">background-color solido</div>
<div class="grad-lin">linear-gradient 135deg</div>
<div class="grad-top">linear-gradient to right</div>
<div class="grad-rad">radial-gradient</div>
<div class="img-bg">background-image + cover</div>
<div class="multi"></div>
Bordi, border-radius, box-shadow
BORDI
border: spessore stile colore — stili: solid, dashed, dotted, double, none
border-radius: arrotonda gli angoli. Con 50% su un quadrato → cerchio
box-shadow: offset-x offset-y blur spread colore — con inset → ombra interna
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="b-solid">border solid</div>
<div class="b-dashed">border dashed</div>
<div class="b-dotted">border dotted</div>
<div class="b-lati">solo top e bottom</div>
<div class="r-small">border-radius: 6px</div>
<div class="r-large">border-radius: 20px</div>
<div class="r-cerchio">50%</div>
<div class="r-asimm">border-radius asimmetrico</div>
<div class="shadow1">box-shadow base</div>
<div class="shadow2">box-shadow morbida</div>
<div class="shadow-c">anello colorato</div>
<div class="shadow-i">inset shadow</div>
<div class="shadow-m">shadow multipla</div>
Outline vs Border
Differenze importanti tra i due — spesso confusi!
border vs outline — le differenze
CONFRONTO
Sembrano uguali ma sono molto diversi:

border: occupa spazio (fa parte del box model), può avere border-radius, può essere impostato lato per lato
outline: NON occupa spazio (non sposta gli altri elementi), non supporta border-radius, va tutto intorno all'elemento

L'outline si vede di default sui link e input quando ricevono :focusnon rimuoverla mai per accessibilità!
CSS
RISULTATO — clicca sull'input!
▶ HTML usato in questo esempio
<div class="con-border">Con border (occupa spazio, ha border-radius)</div>
<div class="con-outline">Con outline (non occupa spazio)</div>
<input type="text" placeholder="Clicca qui — vedi :focus">
Tutti i Selettori CSS
Come selezionare esattamente gli elementi da stilare
Selettori base + combinatori + attributo
SELETTORI
tag — seleziona tutti gli elementi di quel tipo
.classe — elementi con quell'attributo class
#id — elemento con quell'attributo id (deve essere unico nella pagina)
* — universale, seleziona tutto
A B — B discendente di A (anche annidato in profondità)
A > B — B figlio diretto di A (non nipoti)
A + B — B fratello adiacente (il primo subito dopo A)
A ~ B — tutti i fratelli B che vengono dopo A
[attr] — ha l'attributo attr
[attr="val"] — attributo con valore esatto
[attr^="val"] — valore che inizia con "val"
[attr$="val"] — valore che finisce con "val"
[attr*="val"] — valore che contiene "val"
CSS
RISULTATO
▶ HTML usato in questo esempio
<p>Tag p (grigio)</p>
<p class="blu">Classe .blu</p>
<p id="unico">ID #unico</p>
<div class="cont">Contenitore: <span>span giallo</span></div>
<ul class="lista">
  <li>Figlio diretto (verde)</li>
  <li><ul><li>Nipote (NON verde)</li></ul></li>
</ul>
<h3>Titolo h3</h3>
<p>Subito dopo h3 → viola + sottolineato (h3+p e h3~p)</p>
<p>Altro paragrafo dopo h3 → solo sottolineato (h3~p)</p>
<input type="text" placeholder="[type=text] → blu">
<input type="email" placeholder="[type=email] → rosso">
<p><a href="https://esempio.com">https → verde</a></p>
<p><a href="doc.pdf">.pdf → rosso</a></p>
Specificità (Cascata)
Il sistema di punteggio che decide quale regola vince in caso di conflitto
Il punteggio (ID, Classe/Attributo/Pseudo, Tag)
IMPORTANTE
Il punteggio si legge come 3 blocchi separati: (ID | Classe | Tag)
Non si sommano tra livelli: 11 classi (0,11,0) non battono 1 ID (1,0,0)!
inline style = (1,0,0,0) — sempre più specifico
!important = vince su tutto — usarlo solo come ultima risorsa
CSS
RISULTATO
▶ HTML usato in questo esempio
<p>Solo tag p → blu (0,0,1)</p>
<p class="rosso">p.rosso → arancio (0,1,1) batte .rosso (0,1,0)</p>
<p id="speciale" class="rosso">ID → viola (1,0,0) vince su tutto</p>
<p style="color: green;">inline style → verde (batte anche l'ID)</p>
🔗 Vedi anche: Tutti i selettori La Cascata
Pseudo-classi
Selezionare elementi in base al loro stato o posizione
Pseudo-classi: hover, focus, checked, nth-child, not e altre
PSEUDO
:hover — al passaggio del mouse
:focus — quando l'elemento ha il focus (input selezionato, link con tab…)
:active — durante il click
:visited / :link — link visitato / non visitato
:checked — checkbox/radio selezionato
:disabled / :enabled — input disabilitato/abilitato
:first-child / :last-child — primo/ultimo figlio
:nth-child(n) — n-esimo figlio (può usare formule: 2n=pari, 2n+1=dispari, odd, even)
:not(selector) — tutto tranne quel selettore
:empty — elementi senza figli
:first-of-type / :last-of-type — primo/ultimo di quel tipo di tag
CSS — interagisci!
RISULTATO
▶ HTML usato in questo esempio
<div class="btn">Hover + Active</div>
<input type="text" placeholder="Clicca → :focus">
<div>
  <input type="checkbox" id="cb">
  <label for="cb">Seleziona (checked → verde)</label>
</div>
<ul>
  <li>Primo (verde)</li>
  <li>Secondo (even=grigio)</li>
  <li>Terzo</li>
  <li>Quarto (even=grigio)</li>
  <li>Quinto (last=rosso)</li>
</ul>
<p>Paragrafo normale → blu (:not .escluso)</p>
<p class="escluso">Escluso da :not()</p>
<div></div> <!-- :empty → arancio -->
Pseudo-elementi
::before, ::after, ::first-line, ::first-letter, ::placeholder, ::selection
I pseudo-elementi principali
PSEUDO
I pseudo-elementi (con :: doppio) selezionano parti di un elemento, non elementi interi.
::before — inserisce contenuto virtuale PRIMA del contenuto dell'elemento (richiede content:)
::after — inserisce contenuto virtuale DOPO (richiede content:)
::first-line — prima riga di un testo
::first-letter — prima lettera (per effetti capolettera)
::placeholder — stila il testo placeholder degli input
::selection — stila il testo selezionato dall'utente
CSS
RISULTATO — seleziona del testo!
▶ HTML usato in questo esempio
<p class="icona">Con ::before icona stella</p>
<p class="nuovo">Prodotto</p>
<p class="linea-decorata">Riga con barra sinistra decorativa</p>
<p class="capolettera">Lorem ipsum dolor sit amet, questo paragrafo ha il capolettera.</p>
<input placeholder="placeholder stilato con ::placeholder">
<p>Seleziona questo testo → ::selection</p>
Proprietà display
Come ogni elemento occupa spazio nella pagina
block, inline, inline-block, none, visibility
LAYOUT
block — occupa tutta la larghezza disponibile, va a capo prima e dopo. Accetta width, height, margin, padding. (div, p, h1–h6, ul, li, section…)
inline — si inserisce nel flusso del testo. Non accetta width/height. Margin/padding orizzontali sì, verticali no. (span, a, strong, em, img…)
inline-block — come inline (rimane nella riga) ma accetta width, height e padding verticale
none — rimuove l'elemento dal flusso. Non occupa spazio. Come se non esistesse.
visibility: hidden — nasconde l'elemento ma mantiene lo spazio occupato (differenza chiave con display:none)
table / table-cell — simula le tabelle HTML
CSS
RISULTATO
▶ HTML usato in questo esempio
<label>display: block</label>
<div class="d-block">Block 1</div>
<div class="d-block">Block 2 (va a capo)</div>
<label>display: inline</label>
<span class="d-inline">Inline A</span>
<span class="d-inline">Inline B</span>
<label>display: inline-block</label>
<div class="d-iblock">A</div>
<div class="d-iblock">B</div>
<div class="d-iblock">C</div>
<label>display: none vs visibility: hidden</label>
<div class="segnaposto">Prima dell'elemento nascosto</div>
<div class="d-none">display:none — sparisce!</div>
<div class="v-hidden">visibility:hidden — spazio rimane!</div>
<div class="segnaposto">Dopo l'elemento nascosto</div>
Flexbox
Il sistema di layout più usato — allinea elementi in riga o colonna con precisione
Flexbox interattivo completo
LAYOUT
Si attiva con display: flex sul contenitore. I figli diventano flex items.
Proprietà del CONTAINER:
flex-direction: row (default) | column | row-reverse | column-reverse
justify-content: distribuzione sull'asse principale
align-items: allineamento sull'asse secondario
flex-wrap: nowrap (default) | wrap — permette agli item di andare a capo
gap: spazio tra items (riga e colonna)
Proprietà degli ITEM:
flex: 1 — occupa tutto lo spazio disponibile
flex-grow / flex-shrink / flex-basis
align-self — sovrascrive align-items per quell'item
order — cambia l'ordine visivo senza modificare l'HTML
flex-direction:
justify-content:
align-items:
flex-wrap:
CSS (aggiornato dai bottoni)
RISULTATO
▶ HTML usato in questo esempio
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2 (alto)</div>
  <div class="item">Item 3 (flex:1)</div>
  <div class="item">Item 4</div>
</div>
CSS Grid
Layout a due dimensioni — righe E colonne allo stesso tempo
Grid interattivo — colonne, righe, aree
LAYOUT
display: grid sul contenitore. A differenza di flexbox, Grid controlla righe e colonne insieme.
grid-template-columns — definisce le colonne: 200px 1fr 1fr, repeat(3, 1fr)
grid-template-rows — definisce le righe
fr — unità fractional: 1fr = "una frazione dello spazio disponibile"
gap — spazio tra righe e colonne
grid-column — su un item: quante colonne occupa (span 2 = occupa 2 colonne)
grid-row — su un item: quante righe occupa
grid-area — con grid-template-areas definisce layout nominati
grid-template-columns:
gap:
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="griglia">
  <div class="cella">1</div>
  <div class="cella wide">2 — wide (span 2)</div>
  <div class="cella tall">3 — tall (span 2 righe)</div>
  <div class="cella">4</div>
  <div class="cella">5</div>
  <div class="cella">6</div>
</div>
Grid con aree nominate — layout pagina completo
AVANZATO
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="pagina">
  <header class="header">Header (grid-area: header)</header>
  <aside class="sidebar">
    <b>Sidebar</b>
    <a href="#">Home</a>
    <a href="#">Profilo</a>
  </aside>
  <main class="main">Contenuto principale</main>
  <footer class="footer">Footer © 2025</footer>
</div>
Position
Posizionamento preciso degli elementi fuori dal flusso normale
static, relative, absolute, fixed, sticky
POSITION
static — default. Segue il flusso normale. top/left non funzionano.
relative — si sposta rispetto a dove sarebbe normalmente, ma mantiene il suo spazio nel flusso
absolute — esce dal flusso. Si posiziona rispetto al primo antenato con position ≠ static (o al body)
fixed — esce dal flusso. Rimane fisso rispetto alla finestra del browser (non scrolla)
sticky — si comporta come relative finché non raggiunge il punto specificato durante lo scroll, poi si "attacca"
CSS
RISULTATO — scrolla!
▶ HTML usato in questo esempio
<div>Elemento normale</div>
<div class="rel">relative: +12px top +20px left</div>
<div>Elemento normale (lo spazio del .rel è ancora lì)</div>
<div class="contenitore">
  Contenitore (position: relative)
  <div class="abs">absolute</div>
</div>
<div class="sticky">sticky top:0 — si attacca scrollando</div>
<div>Contenuto sotto lo sticky</div>
<div>Altro contenuto...</div>
<div class="fixed-box">📌 fixed</div>
Float & Clear
Tecnica classica per far scorrere il testo intorno agli elementi
float: left/right — clear: both
FLOAT
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="img-sx">LEFT</div>
<p>Il testo scorre intorno all'elemento float a sinistra. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.</p>
<div class="img-dx">RIGHT</div>
<p>Questo testo scorre intorno all'elemento float a destra. Adipiscing elit, sed do eiusmod.</p>
<div class="dopo-float">clear: both — questo va sotto tutti i float</div>
Overflow & Z-index
Cosa fare quando il contenuto è troppo grande, e chi sta sopra chi
overflow + z-index + white-space
OVERFLOW
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="box vis"><label>visible</label>testo lungo che fuoriesce dal box senza stop</div>
<div class="box hid"><label>hidden</label>testo lungo che viene tagliato quando esce</div>
<div class="box scr"><label>scroll</label>testo lungo con scrollbar sempre visibile anche se non serve</div>
<div class="box aut"><label>auto</label>scrollbar solo se il contenuto è troppo grande</div>
<div class="trunc">Testo troncato con i puntini...</div>
<div class="stack">
  <div class="z1">z-index: 1</div>
  <div class="z3">z-index: 3</div>
  <div class="z2">z-index: 2</div>
</div>
Ombre & Effetti visivi
box-shadow, text-shadow, clip-path, aspect-ratio
Ombre e forme speciali
VISUALE
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="s1">box-shadow leggera</div>
<div class="s2">box-shadow profonda</div>
<div class="s3">ombra solida</div>
<div class="s4">anello/ring</div>
<div class="s5">glow effect</div>
<p class="ts1">text-shadow base</p>
<p class="ts2">text glow</p>
<div class="clip-tri"></div>
<div class="clip-hex"></div>
<div class="ratio">aspect-ratio: 16/9</div>
Filter & Opacity
blur, brightness, contrast, grayscale, sepia, hue-rotate — effetti visivi sugli elementi
Filtri CSS e opacity
FILTRI
opacity — trasparenza dell'elemento (0=invisibile, 1=opaco). Colpisce l'elemento E i figli.
filter: blur(px) — sfuoca l'elemento
filter: brightness(%) — luminosità (100%=normale, 0%=nero, 200%=doppio brillante)
filter: contrast(%) — contrasto
filter: grayscale(%) — scala di grigi (0%=colore, 100%=B&N)
filter: sepia(%) — effetto seppia/vintage
filter: hue-rotate(deg) — ruota i colori
filter: drop-shadow() — ombra che segue la forma (non il rettangolo come box-shadow)
CSS
RISULTATO — hover sull'ultima!
▶ HTML usato in questo esempio
<div class="normale"><img src="https://picsum.photos/90/70?1">normale</div>
<div class="blur"><img src="https://picsum.photos/90/70?1">blur</div>
<div class="bright"><img src="https://picsum.photos/90/70?1">bright</div>
<div class="gray"><img src="https://picsum.photos/90/70?1">grayscale</div>
<div class="sepia"><img src="https://picsum.photos/90/70?1">sepia</div>
<div class="hue"><img src="https://picsum.photos/90/70?1">hue-rotate</div>
<div class="inv"><img src="https://picsum.photos/90/70?1">invert</div>
<div class="hover-ef"><img src="https://picsum.photos/90/70?1">hover!</div>
<div class="opacita">opacity: 0.4</div>
Transform
Traslazioni, rotazioni, scale, skew — senza spostare altri elementi
translate, rotate, scale, skew
TRANSFORM
transform modifica l'aspetto visivo dell'elemento senza influire sul layout degli altri.
translate(x, y) — sposta. translateX, translateY, translateZ
rotate(deg) — ruota. Positivo = senso orario
scale(x, y) — ridimensiona. scale(1.5) = 1.5× più grande
skew(deg) — inclina/distorce
Si possono combinare: transform: rotate(45deg) scale(1.2)
CSS — prova hover!
RISULTATO — hover per annullare
▶ HTML usato in questo esempio
<div class="box traslato">translate</div>
<div class="box ruotato">rotate 30°</div>
<div class="box scalato">scale 1.3</div>
<div class="box skewato">skewX 15°</div>
<div class="box combo">combo</div>
<div class="box origin">origin</div>
Transition
Effetti di cambio stato fluidi e animati
transition — sintassi e timing functions
TRANSITION
transition: proprietà durata timing delay
proprietà — quale proprietà animare. all = tutte
durata — es: 0.3s, 500ms
timing — come cambia la velocità: ease(default), linear, ease-in, ease-out, ease-in-out, cubic-bezier()
delay — ritardo prima che inizi
CSS — hover su tutto!
RISULTATO — hover!
▶ HTML usato in questo esempio
<div class="t-color">Hover → cambia colore</div>
<div class="t-multi">Hover → transizione multipla</div>
<br><b>Timing functions (hover per vedere differenza):</b><br>
<div class="timing-box t-ease">ease</div>
<div class="timing-box t-linear">linear</div>
<div class="timing-box t-ease-in">ease-in</div>
<div class="timing-box t-ease-out">ease-out</div>
<br><b>Delay diversi (hover qui sopra):</b><br>
<div class="delay1">delay 0s</div>
<div class="delay2">delay 0.2s</div>
<div class="delay3">delay 0.4s</div>
Animation & @keyframes
Animazioni CSS che girano automaticamente senza interazione
@keyframes + animation
ANIMATION
Si definisce l'animazione con @keyframes nome { } usando from/to o percentuali.
Si applica con animation: nome durata timing iteration direction
animation-iteration-count: infinite, o un numero
animation-direction: normal, reverse, alternate (avanti/indietro), alternate-reverse
animation-fill-mode: forwards (rimane all'ultimo frame), backwards, both
animation-play-state: paused / running — utile per pausare con hover
CSS
RISULTATO — hover sul cubo oro per pausare!
▶ HTML usato in questo esempio
<b>Pulsazione:</b> <div class="pulsante"></div>
<b>Slide alternate:</b>
<div class="scorrevole"></div>
<b>Spinner di caricamento:</b> <div class="spinner"></div>
<b>Fade in:</b>
<div class="fade-in">Questo elemento fa fade in al caricamento</div>
<b>Cambio colori:</b>
<div class="colori"></div>
<b>Hover per pausare:</b> <div class="pausabile"></div>
Cursor & Pointer
Cambiare il cursore del mouse sull'elemento
Tutti i valori di cursor
CURSOR
CSS
RISULTATO — passa il mouse!
▶ HTML usato in questo esempio
<p>Passa il mouse su ogni box per vedere il cursore:</p>
<div class="cbox default">default</div>
<div class="cbox pointer">pointer 👆</div>
<div class="cbox move-c">move</div>
<div class="cbox grab-c">grab</div>
<div class="cbox crosshair">crosshair</div>
<div class="cbox wait-c">wait ⏳</div>
<div class="cbox not-allowed">not-allowed 🚫</div>
<div class="cbox zoom-in">zoom-in 🔍</div>
<div class="cbox help-c">help ❓</div>
<div class="cbox ew-resize">ew-resize ↔</div>
White-space & Word-break
Controllare come va a capo il testo e come vengono gestiti gli spazi
white-space, word-break, overflow-wrap, text-overflow
TESTO
white-space: normal — default: va a capo, spazi multipli collassano a uno
white-space: nowrap — testo su una riga sola, non va a capo mai
white-space: pre — rispetta tutti gli spazi e gli a capo del codice HTML (come il tag <pre>)
white-space: pre-wrap — come pre ma va a capo se necessario
word-break: break-all — spezza le parole ovunque
overflow-wrap: break-word — spezza le parole solo se necessario (consigliato)
text-overflow: ellipsis — mette i puntini (…) al posto del testo troncato. Richiede overflow:hidden e white-space:nowrap
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="box normal"><label>normal</label>testo     con   spazi   multipli   che   va   a   capo</div>
<div class="box nowrap"><label>nowrap</label>testo molto lungo che non va mai a capo</div>
<div class="box pre"><label>pre</label>riga 1
riga 2  spazi</div>
<div class="box break-all"><label>break-all</label>parolamoltolungachenonsispezza</div>
<div class="box ellipsis"><label>ellipsis</label>testo molto lungo troncato con i puntini di sospensione</div>
<div class="card-trunc">
  <div class="titolo">Titolo molto lungo che viene troncato</div>
  <div class="corpo">Descrizione breve</div>
</div>
Object-fit & Object-position
Come le immagini si adattano al loro contenitore
object-fit per immagini e video
IMMAGINI
Quando un'immagine ha dimensioni diverse dal suo contenitore, object-fit decide come adattarsi:
fill — (default) distorce l'immagine per riempire completamente
contain — mostra tutta l'immagine, aggiunge spazio vuoto (letterbox)
cover — riempie completamente, taglia i bordi. Quello più usato!
none — dimensione originale, taglia se troppo grande
scale-down — il minore tra none e contain
object-position sposta il punto di focus (es: top, center, 20% 30%)
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="wrap fill"><img src="https://picsum.photos/300/200">fill</div>
<div class="wrap contain"><img src="https://picsum.photos/300/200">contain</div>
<div class="wrap cover"><img src="https://picsum.photos/300/200">cover ✓</div>
<div class="wrap pos-top"><img src="https://picsum.photos/300/200">cover+top</div>
<div class="wrap pos-bottom"><img src="https://picsum.photos/300/200">cover+bottom</div>
calc() e funzioni CSS
Calcoli dinamici, min(), max(), clamp() — CSS che si adatta da solo
calc(), min(), max(), clamp()
FUNZIONI
calc() — esegue calcoli mescolando unità diverse. calc(100% - 40px)
min(a, b) — usa il valore più piccolo tra i due
max(a, b) — usa il valore più grande
clamp(min, ideale, max) — valore che si adatta tra un minimo e un massimo. Molto utile per il responsive!
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="calc1">calc(100% - 40px)</div>
<div class="calc2">calc(50% + 20px)</div>
<div class="calc3">centrato con calc</div>
<div class="min-ex">min(100%, 300px)</div>
<div class="max-ex">max(200px, 50%)</div>
<div class="clamp-ex">font-size: clamp(14px, 2.5vw, 24px) — adatta con il viewport</div>
<div class="layout-calc">
  <div class="sidebar-c">sidebar 160px</div>
  <div class="main-c">main: calc(100% - 176px)</div>
</div>
Variabili CSS (Custom Properties)
Definire valori riutilizzabili — cambia uno, aggiornano tutti
:root, --variabile, var()
VARIABILI
Si definiscono con --nome-variabile: valore e si usano con var(--nome-variabile)
Definite in :root { } sono globali (disponibili ovunque). Si possono anche definire localmente su un elemento.
var(--colore, rosso) — il secondo parametro è il valore di fallback
Cambiate con JavaScript: document.documentElement.style.setProperty('--colore', 'blue')
CSS — modifica i colori in :root!
RISULTATO
▶ HTML usato in questo esempio
<div class="header">Header con variabili CSS</div>
<button class="btn-primario">Primario</button>
<button class="btn-accento">Accento</button>
<div class="card-v">Card con variabili — prova a cambiare --colore-primario in :root!</div>
<div class="dark-section">
  <p style="color:white">Sezione con variabile locale (--colore-primario: giallo)</p>
  <button class="btn-primario">Usa variabile locale</button>
</div>
Media Query & Responsive
Adattare il design a schermi di dimensioni diverse
@media — sintassi e breakpoint comuni
RESPONSIVE
@media (condizione) { regole CSS }
max-width — stili per schermi fino a quella larghezza (mobile first inverso)
min-width — stili per schermi da quella larghezza in su (mobile first)
Breakpoint comuni: 480px (mobile), 768px (tablet), 1024px (laptop), 1280px (desktop)
Si possono combinare: @media (min-width: 768px) and (max-width: 1024px)
Altre condizioni: orientation: landscape, prefers-color-scheme: dark, print
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="pagina">
  <nav>
    <b>MySite</b>
    <ul class="nav-links">
      <li><a href="#">Home</a></li>
      <li><a href="#">Chi siamo</a></li>
    </ul>
    <div class="hamburger"></div>
  </nav>
  <div class="hero"><h1>Titolo hero</h1><p>Sottotitolo</p></div>
  <div class="contenuto">
    <aside class="sidebar"><b>Menu</b>...</aside>
    <main><p>Contenuto principale...</p></main>
  </div>
</div>
Navbar
Barra di navigazione orizzontale — componente completo
Navbar con logo, link, voce attiva e hover
COMPONENTE
Una navbar tipica usa flexbox per allineare logo e link. I link attivi hanno una classe .attivo.
position: sticky; top: 0; la tiene fissa durante lo scroll. z-index alto per stare sopra tutto.
CSS
RISULTATO
▶ HTML usato in questo esempio
<nav>
  <div class="nav-inner">
    <a href="#" class="logo">My<span>Site</span></a>
    <ul class="nav-links">
      <li><a href="#" class="attivo">Home</a></li>
      <li><a href="#">Chi siamo</a></li>
      <li><a href="#">Servizi</a></li>
      <li><a href="#">Blog</a></li>
      <li><a href="#" class="nav-cta">Contatti</a></li>
    </ul>
  </div>
</nav>
<p style="padding:16px;color:#555;font-family:sans-serif">Contenuto della pagina...</p>
Banner / Hero
Sezione principale a tutta larghezza — con testo, pulsante, gradiente e overlay
Hero section completa
COMPONENTE
CSS
RISULTATO
▶ HTML usato in questo esempio
<section class="hero">
  <div class="hero-content">
    <div class="hero-tag">Novità 2025</div>
    <h1>Crea siti web <span>bellissimi</span></h1>
    <p>Impara CSS e crea pagine web professionali. Guida completa con esempi pratici.</p>
    <div class="hero-btns">
      <a href="#" class="btn-hero-p">Inizia ora</a>
      <a href="#" class="btn-hero-s">Scopri di più</a>
    </div>
  </div>
</section>
Card
Componente card — prodotto, articolo, utente — con hover e griglia
Card griglia con hover effect
COMPONENTE
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="card-grid">

  <div class="card">
    <div class="card-img-wrap">
      <img class="card-img" src="https://picsum.photos/200/130?1">
      <span class="card-badge">Nuovo</span>
    </div>
    <div class="card-body">
      <div class="card-cat">Elettronica</div>
      <div class="card-title">Prodotto fantastico</div>
      <div class="card-desc">Descrizione breve del prodotto.</div>
      <div class="card-footer">
        <span><span class="card-price">€29</span>
        <span class="card-price-old">€49</span></span>
        <button class="card-btn">Acquista</button>
      </div>
    </div>
  </div>

  <!-- ripeti per altre card -->
</div>
Form
Input, label, textarea, select, checkbox, radio — stilati con CSS
Form completo con focus e validazione visiva
COMPONENTE
CSS
RISULTATO — clicca sui campi!
▶ HTML usato in questo esempio
<div class="form-card">
  <h2>Registrazione</h2>

  <div class="field">
    <label class="required">Nome</label>
    <input type="text" placeholder="Il tuo nome" class="ok">
  </div>

  <div class="field">
    <label class="required">Email</label>
    <input type="email" placeholder="[email protected]" class="errore">
    <div class="msg-errore">Inserisci un'email valida</div>
  </div>

  <div class="field">
    <label>Messaggio</label>
    <textarea placeholder="Scrivi qui..."></textarea>
  </div>

  <div class="field">
    <label>Paese</label>
    <select>
      <option>Italia</option>
      <option>Francia</option>
    </select>
  </div>

  <div class="field">
    <label>Interessi</label>
    <div class="check-row">
      <input type="checkbox" id="c1" checked>
      <label for="c1">Web Design</label>
    </div>
    <div class="check-row">
      <input type="radio" name="pref" id="r1">
      <label for="r1">CSS</label>
    </div>
  </div>

  <button class="btn-submit">Registrati</button>
</div>
Tabella
Stilare le tabelle HTML — border-collapse, zebra, hover, caption
Tabella completa professionale
COMPONENTE
border-collapse: collapse — unisce i bordi adiacenti (senza si sovrappongono)
border-separate — mantiene bordi separati, con border-spacing si può regolare la distanza
vertical-align — allineamento verticale nelle celle: top, middle, bottom
caption — titolo della tabella stilato con caption-side: top/bottom
CSS
RISULTATO
▶ HTML usato in questo esempio
<div class="tabella-wrap">
<table>
  <caption>Ordini recenti</caption>
  <thead>
    <tr>
      <th>#</th>
      <th>Cliente</th>
      <th>Prodotto</th>
      <th>Totale</th>
      <th>Stato</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>001</td>
      <td>Mario Rossi</td>
      <td>Laptop Pro</td>
      <td class="num">€1.299</td>
      <td><span class="badge badge-ok">Consegnato</span></td>
    </tr>
    <tr>
      <td>002</td>
      <td>Sara Bianchi</td>
      <td>Mouse wireless</td>
      <td class="num">€45</td>
      <td><span class="badge badge-att">In attesa</span></td>
    </tr>
    <tr>
      <td>003</td>
      <td>Luca Verdi</td>
      <td>Tastiera mec.</td>
      <td class="num">€149</td>
      <td><span class="badge badge-err">Annullato</span></td>
    </tr>
  </tbody>
</table>
</div>
Liste
list-style, menu verticale, checklist, numerazione decorata
Liste stilate in tutti i modi
LISTE
CSS
RISULTATO
▶ HTML usato in questo esempio
<h4>Checklist</h4>
<ul class="checklis">
  <li>HTML completato</li>
  <li>CSS completato</li>
  <li class="no">JavaScript non ancora</li>
</ul>

<h4>Menu verticale</h4>
<ul class="menu-v">
  <li><a href="#" class="attivo"><span class="icon">🏠</span>Home</a></li>
  <li><a href="#"><span class="icon">👤</span>Profilo</a></li>
  <li><a href="#"><span class="icon">⚙️</span>Impostazioni</a></li>
</ul>

<h4>Numerazione decorata (CSS Counter)</h4>
<ol class="num-list">
  <li>Prima voce</li>
  <li>Seconda voce</li>
  <li>Terza voce</li>
</ol>
Bottoni
Tutti i tipi di bottoni — varianti, stati, effetti
Libreria bottoni completa
COMPONENTE
CSS — hover su tutti!
RISULTATO
▶ HTML usato in questo esempio
<h4>Varianti</h4>
<button class="btn btn-primary">Primary</button>
<button class="btn btn-success">Success</button>
<button class="btn btn-danger">Danger</button>
<button class="btn btn-warning">Warning</button>

<h4>Outline</h4>
<button class="btn btn-outline-b">Outline blu</button>
<button class="btn btn-outline-g">Outline verde</button>
<button class="btn btn-ghost">Ghost</button>

<h4>Dimensioni</h4>
<button class="btn btn-primary btn-sm">Small</button>
<button class="btn btn-primary">Medium</button>
<button class="btn btn-primary btn-lg">Large</button>

<h4>Stati</h4>
<button class="btn btn-primary btn-loading">Loading</button>
<button class="btn btn-primary btn-disabled">Disabilitato</button>
<button class="btn btn-primary btn-icon">★ Con icona</button>
Quiz CSS
Metti alla prova le tue conoscenze — 20 domande su tutto il CSS
0
punti
0
corrette
0/20
completate
Cheatsheet CSS
Tutte le proprietà essenziali a colpo d'occhio
📦 Box Model
margintop right bottom left
paddingtop right bottom left
borderspessore stile colore
border-radiuspx / %
box-sizingborder-box ✓
width / heightpx % auto
min/max-widthpx / % / none
🎨 Colori & Sfondo
colornome / #hex / rgb / hsl
backgroundcolor / image / gradient
background-sizecover / contain / px
background-poscenter / top / 50% 50%
opacity0 – 1
linear-gradient(dir, c1, c2)
radial-gradient(shape, c1, c2)
🔤 Testo
font-familyArial / sans-serif…
font-sizepx / rem / em / %
font-weightnormal / bold / 100-900
font-stylenormal / italic
text-alignleft / center / right / justify
text-decorationnone / underline / line-through
text-transformuppercase / lowercase / capitalize
line-height1.5 / px / normal
letter-spacingpx / em
text-shadowx y blur colore
📐 Flexbox (container)
display: flexattiva flexbox
flex-directionrow / column / *-reverse
justify-contentflex-start/end/center/space-*
align-itemsflex-start/end/center/stretch
flex-wrapnowrap / wrap
gappx (spazio tra items)
📐 Flexbox (item)
flex1 / grow shrink basis
align-selfsovrascrive align-items
order0 (default), ordine visivo
flex-growquanto cresce (0=no, 1=sì)
flex-shrinkquanto si restringe
flex-basisdimensione base
🔲 CSS Grid
display: gridattiva grid
grid-template-cols1fr 2fr / repeat(3,1fr)
grid-template-rowsauto 100px 1fr
gapriga colonna
grid-columnspan 2 / 1 / 3
grid-areanome area template
📍 Position
positionstatic/relative/absolute/fixed/sticky
top/right/bottom/leftpx / % / auto
z-indexnumero (più alto = sopra)
floatleft / right / none
clearleft / right / both
✨ Effetti
box-shadowx y blur spread colore
text-shadowx y blur colore
filterblur / brightness / grayscale…
clip-pathpolygon() circle()
aspect-ratio16/9 / 1/1 / auto
🎬 Animazioni
transitionprop dur timing delay
animationnome dur timing iter dir
@keyframesfrom/to o 0% 100%
transformtranslate/rotate/scale/skew
transform-origincentro rotazione
animation-play-statepaused / running
📱 Responsive
@media (max-width)fino a quella larghezza
@media (min-width)da quella larghezza in su
vw / vh% del viewport
clamp(min,val,max)valore adattivo
calc()calcoli con unità miste
min() / max()scegli il minore/maggiore
🎯 Selettori chiave
.classeelementi con quella classe
#idelemento unico
A BB discendente di A
A > BB figlio diretto di A
A + BB fratello adiacente
[attr="val"]attributo con valore
:hover :focusstato elemento
::before ::aftercontenuto virtuale
🔢 Specificità
!importantvince su tutto (evita)
inline style(1,0,0,0)
#id(0,1,0,0)
.classe [attr] :pseudo(0,0,1,0)
tag ::pseudo-el(0,0,0,1)
* (universale)(0,0,0,0)
📦 Overflow & Display
overflowvisible/hidden/scroll/auto
text-overflowellipsis (+ overflow:hidden)
white-spacenowrap/pre/pre-wrap
display: nonenasconde (no spazio)
visibility:hiddennasconde (spazio rimane)
object-fitcover/contain (img)
🎨 Variabili CSS
:root { --x: val }definisce variabile globale
var(--x)usa la variabile
var(--x, fallback)con valore di default
el { --x: val }variabile locale all'elemento