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
/* */.
▶ 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
2. Interno — tag
3. Inline — attributo
<link> nell'<head>2. Interno — tag
<style> nell'<head>3. Inline — attributo
style="" sul singolo tag. Specificità massima. Da evitare perché difficile da mantenere.
▶ 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
▶ 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.
La keyword
| ✓ 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 |
inherit forza l'ereditarietà anche per proprietà che di default non si ereditano.
▶ 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):
#hex 3 cifre — versione breve quando ogni coppia è uguale:
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
#hex 6 cifre — coppie RR GG BB in esadecimale (00–FF):
#ff0000 = rosso puro#hex 3 cifre — versione breve quando ogni coppia è uguale:
#f00 = #ff0000rgb(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)
▶ 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 a | Uso tipico |
|---|---|---|
| px | pixel fisico | bordi, shadow, icone |
| % | contenitore padre | width, height fluidi |
| em | font-size del genitore | padding, margin relativi al font |
| rem | font-size di <html> | font-size, spaziatura globale ✓ |
| vw | 1% larghezza viewport | sezioni full-width, font fluidi |
| vh | 1% altezza viewport | hero a schermo intero (height:100vh) |
| vmin | il minore tra vw e vh | elementi quadrati adattivi |
| vmax | il maggiore tra vw e vh | raro |
| ch | larghezza del carattere "0" | width righe di testo (60ch = leggibile) |
rem è stabile perché punta sempre all'<html>.
▶ 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
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
▶ 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à | Valori | Nota |
|---|---|---|
| font-family | Arial, sans-serif… | Elenco fallback separati da virgola |
| font-size | 16px, 1rem, 1.2em | Preferire rem per consistenza |
| font-weight | normal(400), bold(700), 100–900 | Dipende dal font disponibile |
| font-style | normal, italic, oblique | |
| font-variant | normal, small-caps | Maiuscoletto |
| line-height | 1.6, 24px, 150% | Senza unità = moltiplicatore. 1.5–1.8 ideale |
| letter-spacing | 0.5px, -1px | Negativo avvicina le lettere |
| word-spacing | 4px | Spazio tra parole |
| text-align | left, right, center, justify | justify → testo giustificato |
| text-decoration | none, underline, line-through, overline | Può avere colore e stile: underline red wavy |
| text-transform | uppercase, lowercase, capitalize, none | capitalize → Prima lettera maiuscola |
| text-indent | 20px, 2em | Rientro prima riga |
| text-shadow | x y blur colore | Ombra del testo. Più valori separati da virgola |
▶ 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
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).
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
▶ 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▶ 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:
border-radius: arrotonda gli angoli. Con
box-shadow:
spessore stile colore — stili: solid, dashed, dotted, double, noneborder-radius: arrotonda gli angoli. Con
50% su un quadrato → cerchiobox-shadow:
offset-x offset-y blur spread colore — con inset → ombra interna
▶ 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
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
:focus — non rimuoverla mai per accessibilità!
▶ 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"
.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"
▶ 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
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
▶ 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>
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
: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
▶ 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
::after — inserisce contenuto virtuale DOPO (richiede
::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
::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
▶ 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
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
▶ 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
Proprietà del CONTAINER:
—
—
—
—
—
Proprietà degli ITEM:
—
—
—
—
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:
▶ 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
LAYOUTdisplay: 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:
▶ 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▶ 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"
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"
▶ 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▶ 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▶ 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▶ 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)
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)
▶ 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
TRANSFORMtransform 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)
▶ 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
TRANSITIONtransition: proprietà durata timing delayproprietà — quale proprietà animare.
all = tuttedurata — es:
0.3s, 500mstiming — come cambia la velocità:
ease(default), linear, ease-in, ease-out, ease-in-out, cubic-bezier()delay — ritardo prima che inizi
▶ 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
Si applica con
animation-iteration-count:
animation-direction:
animation-fill-mode:
animation-play-state:
@keyframes nome { } usando from/to o percentuali.Si applica con
animation: nome durata timing iteration directionanimation-iteration-count:
infinite, o un numeroanimation-direction:
normal, reverse, alternate (avanti/indietro), alternate-reverseanimation-fill-mode:
forwards (rimane all'ultimo frame), backwards, bothanimation-play-state:
paused / running — utile per pausare con hover
▶ 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▶ 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
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
▶ 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,
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-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%)
▶ 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.
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!
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!
▶ 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
Definite in
Cambiate con JavaScript:
--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 fallbackCambiate con JavaScript:
document.documentElement.style.setProperty('--colore', 'blue')
▶ 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
▶ 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>
Banner / Hero
Sezione principale a tutta larghezza — con testo, pulsante, gradiente e overlay
Hero section completa
COMPONENTE▶ 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▶ 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▶ 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
vertical-align — allineamento verticale nelle celle:
caption — titolo della tabella stilato con
border-separate — mantiene bordi separati, con
border-spacing si può regolare la distanzavertical-align — allineamento verticale nelle celle:
top, middle, bottomcaption — titolo della tabella stilato con
caption-side: top/bottom
▶ 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▶ 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▶ 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