Cosa fa transform
transform cambia il modo in cui un elemento viene disegnato: spostato, ridimensionato, ruotato o inclinato. I contorni tratteggiati qui sotto mostrano dove sarebbe ogni riquadro senza la sua trasformazione:
translate(20px, 10px) sposta il riquadro blu di 20px in avanti e 10px in basso. scale(1.3) rende quello verde più grande del 30% attorno al suo centro. rotate(20deg) ruota quello ambra in senso orario, e skewX(-20deg) inclina quello scuro. In ogni caso lo spazio tratteggiato, cioè lo spazio che l'elemento occupa nel layout, resta esattamente dov'era.
Le funzioni di trasformazione
| Funzione | Cosa fa | Esempio |
|---|---|---|
translate(x, y) | sposta | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | sposta su un asse | translateY(-4px) |
scale(s) / scale(x, y) | ridimensiona (1 = originale, 0.5 = metà, negativo specchia) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | ridimensiona su un asse | scaleX(0.5) |
rotate(angle) | ruota in senso orario (negativo = antiorario) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | inclina | skewX(-15deg) |
matrix(a, b, c, d, e, f) | tutto quanto sopra in un'unica matrice, di solito è ciò che il browser restituisce | |
none | nessuna trasformazione |
Le percentuali in translate() sono relative alla dimensione dell'elemento stesso, non a quella del genitore. La rotazione ha una pagina tutta sua con gradi, giri e rotazioni continue: CSS rotate.
Playground di transform
Muovi i cursori. La prima riga è il valore di transform che hai costruito; la seconda è la matrice calcolata dal browser a partire da esso, cioè ciò che getComputedStyle restituisce per qualsiasi trasformazione:
Le trasformazioni non spostano il layout
Un elemento trasformato viene disegnato altrove, ma la pagina viene impaginata come se non fosse trasformato. I suoi vicini mantengono la loro posizione. È questo che rende le trasformazioni adatte agli effetti hover e alle animazioni: niente intorno deve essere reimpaginato.
Entrambi i riquadri centrali sembrano 1,5 volte più grandi. Quello scalato si sovrappone ai vicini e C resta dov'è; quello ingrandito con width e height spinge C 40px più in là.
Più trasformazioni e il loro ordine
Metti più funzioni in un solo transform, separate da spazi. L'ordine cambia il risultato, perché, leggendo da sinistra a destra, ogni funzione lavora nel sistema di coordinate lasciato dalle funzioni precedenti:
Il riquadro blu si è spostato di 120px in linea retta e poi è stato ruotato sul posto. Il riquadro verde è stato ruotato prima, quindi il suo "asse x" punta in diagonale, e translateX(120px) lo sposta lungo la diagonale. Stesse funzioni, posizione diversa.
L'altra trappola: una seconda dichiarazione transform sostituisce la prima. Se una card ha transform: rotate(-2deg) e la sua regola hover dice transform: scale(1.05), la rotazione sparisce in hover. Ripetile entrambe (rotate(-2deg) scale(1.05)), oppure usa le proprietà individuali descritte più avanti.
transform-origin
Ridimensionamento, rotazione e inclinazione avvengono attorno a un punto fisso, l'origine della trasformazione, che per impostazione predefinita è il centro. Cambiala con parole chiave, lunghezze o percentuali:
Tutti e tre i riquadri ruotano di 25 gradi. Il primo ruota attorno al suo centro, il secondo tiene l'angolo in alto a sinistra fissato all'angolo del suo spazio, il terzo l'angolo in basso a destra. Un menu a tendina che cresce dal suo pulsante usa transform-origin: top con scale().
Le proprietà translate, scale e rotate
I browser moderni hanno anche tre proprietà separate che fanno la stessa cosa delle funzioni, ma si possono impostare e animare in modo indipendente:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
Si combinano sempre come se fossero scritte transform: translate(...) rotate(...) scale(...) prima di qualsiasi valore transform, in qualunque ordine le dichiari. Fai attenzione alla sintassi: translate: 10px 20px e scale: 1.2 accettano valori senza le parentesi delle funzioni.
Centrare con translate(-50%, -50%)
Siccome le percentuali di translate() si riferiscono alla dimensione dell'elemento stesso, top: 50%; left: 50%; transform: translate(-50%, -50%) centra nel suo genitore un elemento posizionato in modo assoluto di qualsiasi dimensione. La pagina su come centrare un div lo confronta con flexbox e grid.
Errori comuni
- Due dichiarazioni
transform. Quella scritta dopo vince del tutto. Combina le funzioni, oppure usa le proprietàrotate,scaleetranslate. - Trasformare un elemento inline. Un semplice
<span>o<a>ignoratransform. Rendiloinline-block. - Aspettarsi che i vicini si spostino. Le trasformazioni non cambiano mai il layout. Per fare spazio, cambia
width,marginogap. - Ordine delle funzioni sbagliato.
rotate()prima ditranslate()sposta lungo l'asse ruotato. - Sorprese con i figli in
position: fixed. Un elemento trasformato diventa il blocco contenitore dei discendenti con posizione fissa, quindi un header fixed al suo interno scorre con lui. Crea anche un nuovo contesto di impilamento perz-index.
Domande frequenti
Cosa fa transform in CSS?
Cambia il modo in cui un elemento viene disegnato: spostato (translate), ridimensionato (scale), ruotato (rotate) o inclinato (skew). L'elemento mantiene il suo posto originale nel layout, quindi gli elementi intorno non si spostano.
Come applico più trasformazioni in CSS?
Elencale in un solo valore transform, separate da spazi: transform: translateX(50px) rotate(20deg) scale(1.2);. Scrivere una seconda dichiarazione transform sostituisce la prima invece di aggiungersi.
L'ordine delle funzioni di transform conta?
Sì. Leggendo da sinistra a destra, ogni funzione lavora negli assi lasciati dalle precedenti, quindi rotate(45deg) translateX(100px) sposta l'elemento lungo un asse ruotato, mentre translateX(100px) rotate(45deg) lo sposta in linea retta e poi lo ruota.
Cos'è transform-origin?
Il punto fisso attorno a cui avvengono ridimensionamento, rotazione e inclinazione. Il valore predefinito è il centro (50% 50%). transform-origin: top left fa crescere o ruotare un elemento a partire dal suo angolo in alto a sinistra.
Perché transform non funziona sul mio span?
Le trasformazioni non si applicano agli elementi inline non sostituiti, come un semplice <span> o <a>. Dai all'elemento display: inline-block o block e la trasformazione funziona.