position: absolute in un esempio
Un elemento posizionato in modo assoluto viene sollevato dal flusso normale e posizionato con top, right, bottom e left. Quegli offset si misurano dall'antenato più vicino che ha un position diverso da static, ed è per questo che il genitore riceve position: relative:
Cancella position: relative da .card e il badge salta in alto a destra dell'intera pagina, perché non ha più un antenato posizionato. Questa sola riga spiega la maggior parte delle domande del tipo "position absolute non funziona".
Cose da sapere sugli elementi absolute:
- Non occupano spazio. Il titolo e il paragrafo vengono disposti come se il badge non esistesse.
- La loro larghezza si restringe al contenuto, a meno che tu non imposti
widthoppure sialeftsiaright. - Gli offset si misurano fino al bordo del padding del blocco contenitore, dentro il suo bordo.
I cinque valori di position
| Valore | Nel flusso? | Offset misurati da | Uso tipico |
|---|---|---|---|
static (predefinito) | Sì | Gli offset vengono ignorati | Elementi normali |
relative | Sì, il suo spazio resta | La sua posizione normale | Riferimento per figli absolute, piccoli spostamenti |
absolute | No | Antenato posizionato più vicino (o la pagina) | Badge, tooltip, sovrapposizioni, pulsanti di chiusura |
fixed | No | Il viewport | Header, pulsanti della chat, barre dei cookie |
sticky | Sì | Il suo contenitore di scorrimento, una volta raggiunto l'offset | Intestazioni di tabelle, titoli di sezione, barre laterali |
position: relative
Un elemento posizionato in modo relativo resta dov'era nel flusso. Gli offset spostano il punto in cui viene disegnato, ma il suo spazio originale resta riservato, quindi niente intorno si sposta:
Il riquadro 2 viene disegnato 20px più in basso e 20px più a destra, sovrapponendosi al riquadro 3, ma il riquadro 3 non si è mosso: lascia ancora spazio al riquadro 2 nella sua posizione originale. Da solo relative si usa raramente per spostare le cose; il suo compito principale è fare da riquadro di riferimento per i figli absolute.
Offset e inset
top, right, bottom e left accettano lunghezze, percentuali (del blocco contenitore) e auto. La forma abbreviata inset li imposta tutti e quattro nello stesso ordine di margin:
.overlay {
position: absolute;
inset: 0; /* top: 0; right: 0; bottom: 0; left: 0; */
}
.corner {
position: absolute;
inset: auto 16px 16px auto; /* bottom right corner, 16px in */
}
Impostare lati opposti allarga l'elemento: left: 0; right: 0 lo rende largo quanto il blocco contenitore. inset: 0 su un figlio absolute è il modo standard per coprire una card con una sovrapposizione.
Centrare con absolute e transform
top: 50%; left: 50% mette l'angolo in alto a sinistra dell'elemento al centro. translate(-50%, -50%) poi lo riporta indietro di metà della sua dimensione:
Flexbox e grid centrano in modo più semplice quando l'elemento può restare nel flusso; la pagina su come centrare un div confronta tutti i metodi.
position: fixed
Un elemento fixed viene posizionato rispetto al viewport e resta lì mentre la pagina scorre:
.chat-button {
position: fixed;
bottom: 16px;
right: 16px;
}
Due insidie. Un elemento fixed non occupa spazio, quindi un header fixed copre la parte alta della pagina a meno che tu non aggiunga padding-top al body. E se un antenato ha un transform, un filter o una perspective, quell'antenato diventa il riquadro di riferimento al posto del viewport, quindi l'elemento scorre insieme a lui.
position: sticky
Un elemento sticky scorre normalmente finché non raggiunge il suo offset, poi resta attaccato lì finché la fine del suo genitore non scorre via. Fai scorrere il riquadro qui sotto:
Ogni lettera resta attaccata in cima al riquadro di scorrimento mentre la sua sezione è visibile, poi viene spinta via dalla successiva, perché un elemento sticky non esce mai dal suo genitore.
Quando sticky non si attacca, controlla questi punti:
- Nessun offset.
position: stickynon fa niente senzatop,bottom,leftoright. - Un antenato con
overflow: hidden,autooscroll. Diventa il contenitore di scorrimento, e se in realtà non scorre, non si attacca niente. Usaoverflow: clipse ti serve solo nascondere ciò che trabocca. - Un genitore non più alto dell'elemento sticky. Al suo interno non c'è spazio per attaccarsi.
- Un genitore flex o grid che lo allunga. In una riga flex, aggiungi
align-self: flex-startalla barra laterale sticky.
Errori comuni
- Dimenticare
position: relativesul genitore di un elemento absolute. - Usare absolute per il layout della pagina. Gli elementi absolute si ignorano tra loro e ignorano il contenuto, quindi sugli schermi più piccoli il testo si sovrappone. Usa flexbox o grid per il layout e absolute per piccole decorazioni.
- Offset su un elemento static.
top: 10pxnon fa niente senza unposition. - Litigare su quale elemento sta sopra. Gli elementi posizionati che si sovrappongono vengono ordinati da z-index.
- Un header fixed che nasconde il contenuto. Aggiungi padding alla pagina, oppure
scroll-padding-topperché i link alle ancore finiscano sotto l'header.
Domande frequenti
Cosa fa position: absolute?
Toglie l'elemento dal flusso normale (gli altri elementi si comportano come se non ci fosse) e lo posiziona con top, right, bottom e left, misurati dal suo blocco contenitore: l'antenato più vicino il cui position non è static.
Come posiziono un elemento in modo assoluto rispetto al genitore?
Dai al genitore position: relative; e al figlio position: absolute; con offset come top: 0; right: 0;. Senza un genitore posizionato, il figlio viene posizionato rispetto alla pagina.
Qual è la differenza tra position relative e absolute?
relative mantiene l'elemento nel flusso e sposta solo il punto in cui viene disegnato, lasciando libero il suo spazio originale. absolute lo toglie dal flusso e lo posiziona rispetto al suo antenato posizionato.
Perché position: sticky non funziona?
Di solito per uno di tre motivi: non è impostato top (o un altro offset), un antenato ha overflow: hidden o auto e diventa il contenitore di scorrimento, oppure il genitore dell'elemento sticky non è più alto dell'elemento, quindi non c'è spazio per attaccarsi.
Qual è la differenza tra fixed e sticky?
fixed viene tolto dal flusso e fissato al viewport (a meno che un antenato abbia un transform o un filter). sticky resta nel flusso e scorre normalmente finché non raggiunge il suo offset, poi resta attaccato finché il suo genitore è ancora sullo schermo.