Selettori
Selettori Base
*Universale — tutti gli elementi
divTipo — tutti gli elementi
.classClasse — elementi con quella classe
#idID — elemento con quell'id
[attr]Attributo — ha l'attributo
[attr="val"]Attributo uguale al valore
Combinatori
A BDiscendente (qualsiasi profondità)
A > BFiglio diretto
A + BFratello adiacente (successivo)
A ~ BFratello generale (tutti i successivi)
Pseudo-classi
:hoverMouse sopra l'elemento
:focusElemento ha il focus
:first-childPrimo figlio del genitore
:nth-child(n)Ennesimo figlio (1-based, odd, even, 2n+1)
:not(sel)Negazione — esclude corrispondenze
:has(sel)Selettore genitore (contiene corrispondenza)
Pseudo-elementi
::beforeInserisce contenuto prima dell'elemento
::afterInserisce contenuto dopo l'elemento
::placeholderStile del testo placeholder
::selectionStile del testo selezionato
Box Model
Box Sizing
/* Include padding/border in width */ *, *::before, *::after { box-sizing: border-box; }
Proprietà
marginSpazio fuori dal bordo
borderBordo attorno al padding
paddingSpazio dentro il bordo
width / heightDimensioni del contenuto
outlineAnello fuori dal margine (non occupa spazio)
Shorthand
margin: 10px; /* all sides */ margin: 10px 20px; /* vertical | horizontal */ margin: 10px 20px 30px; /* top | horiz | bottom */ margin: 10px 20px 30px 40px; /* T R B L */
Flexbox
Container
.flex { display: flex; justify-content: center; /* main axis */ align-items: center; /* cross axis */ gap: 1rem; }
Proprietà del Container
flex-directionrow | column | row-reverse | column-reverse
flex-wrapnowrap | wrap | wrap-reverse
justify-contentflex-start | center | space-between | space-around | space-evenly
align-itemsstretch | center | flex-start | flex-end | baseline
align-contentAllineamento asse trasversale multi-linea
gapSpazio tra gli elementi flex
Proprietà degli Item
flex: 1Cresce per riempire lo spazio disponibile
flex: 0 0 200pxLarghezza fissa, senza grow/shrink
align-selfOverride align-items per un singolo item
orderOrdine visivo (default 0)
Grid
Container
.grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: auto 1fr auto; gap: 1rem; }
Proprietà del Container
grid-template-columnsDefinisce le colonne: 1fr 2fr, repeat(3, 1fr)
grid-template-rowsDefinisce le righe
grid-template-areasAree con nome: "header header" "nav main"
gapSpaziatura righe e colonne
justify-itemsAllinea item inline (orizzontale)
align-itemsAllinea item block (verticale)
Posizionamento Item
.item { grid-column: 1 / 3; /* span cols 1-2 */ grid-row: 1 / -1; /* span all rows */ grid-area: header; /* named area */ }
Tipografia
Proprietà dei Font
font-familyStack di caratteri: 'Inter', sans-serif
font-sizeDimensione: 1rem, 16px, clamp(1rem, 2vw, 2rem)
font-weightnormal (400) | bold (700) | 100-900
font-stylenormal | italic | oblique
line-heightInterlinea: 1.5 (senza unità consigliato)
letter-spacingSpaziatura caratteri: 0.05em
Proprietà del Testo
text-alignleft | center | right | justify
text-decorationnone | underline | line-through
text-transformuppercase | lowercase | capitalize
text-overflowellipsis (con overflow: hidden)
white-spacenowrap | pre | pre-wrap
word-breakbreak-all | break-word
Colori e Sfondi
Formati Colore
color: #ff6600; /* hex */ color: rgb(255, 102, 0); /* rgb */ color: hsl(24, 100%, 50%); /* hsl */ color: oklch(70% 0.15 50); /* oklch */
Proprietà dello Sfondo
background-colorColore solido: #f0f0f0
background-imageurl(img.jpg) o gradiente
background-sizecover | contain | 100px 200px
background-positioncenter | top right | 50% 50%
background-repeatno-repeat | repeat-x | repeat-y
Gradienti
background: linear-gradient(to right, #f00, #00f); background: radial-gradient(circle, #fff, #000); background: conic-gradient(red, yellow, green);
Transizioni e Animazioni
Transizioni
.btn { transition: background 0.3s ease, transform 0.2s; } .btn:hover { background: #0056b3; transform: scale(1.05); }
Proprietà delle Transizioni
transition-propertyQuale proprietà animare
transition-durationDurata: 0.3s, 300ms
transition-timing-functionease | linear | ease-in-out | cubic-bezier()
transition-delayAttesa prima di iniziare
Animazione Keyframe
@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .icon { animation: spin 1s linear infinite; }
Proprietà delle Animazioni
animation-nameRiferimento al nome @keyframes
animation-durationDurata di un ciclo
animation-iteration-count1 | 3 | infinite
animation-directionnormal | alternate | reverse
animation-fill-modeforwards | backwards | both
Design Responsivo
Media Query
@media (max-width: 768px) { .sidebar { display: none; } } @media (prefers-color-scheme: dark) { body { background: #1a1a1a; color: #eee; } }
Breakpoint Comuni
max-width: 480pxTelefoni
max-width: 768pxTablet
max-width: 1024pxLaptop piccoli
max-width: 1280pxDesktop
Unità Viewport
vw / vh% della larghezza / altezza del viewport
dvhAltezza viewport dinamica (safe per mobile)
svh / lvhAltezza viewport piccola / grande
cqiDimensione inline container query
Container Query
.card-wrapper { container-type: inline-size; } @container (min-width: 400px) { .card { flex-direction: row; } }
Posizionamento
Valori di Position
staticDefault — flusso normale del documento
relativeOffset dalla posizione normale; mantiene spazio
absolutePosizionato rispetto al più vicino antenato posizionato
fixedPosizionato rispetto al viewport; rimane durante lo scroll
stickyAlterna relative/fixed in base allo scroll
Pattern di Centratura
/* Flex center */ display: flex; justify-content: center; align-items: center; /* Grid center */ display: grid; place-items: center;
Stacking
z-indexOrdine di sovrapposizione (più alto = in cima); richiede position
isolation: isolateCrea nuovo contesto di stacking
Proprietà Custom
Definire e Usare
:root { --color-primary: #3b82f6; --spacing-md: 1rem; } .btn { background: var(--color-primary); padding: var(--spacing-md); }
Valori di Fallback
color: var(--accent, #ff6600); /* uses #ff6600 if --accent is not defined */
Temi Dinamici
[data-theme="dark"] { --bg: #1a1a2e; --text: #e0e0e0; } body { background: var(--bg); color: var(--text); }