Prerequisiti: classi, dimensioni, spaziature e normale flusso degli elementi.
Le proprietà CSS per il posizionamento
Normalmente gli elementi partecipano al flusso della pagina: un blocco viene dopo quello precedente e gli elementi in linea seguono le righe di testo. Position permette di modificare questo comportamento per esigenze come etichette sovrapposte, pulsanti fissi e intestazioni che rimangono visibili durante lo scorrimento.
Per organizzare intere pagine, menu e gruppi di schede, Flexbox e Grid sono spesso più adatti. Il posizionamento assoluto è utile quando vogliamo collocare un elemento rispetto a un riferimento preciso, tenendo conto che non riserva spazio nel flusso.
Come leggere le anteprime
Il contenitore giallo ha dimensioni definite e position: relative. Il riquadro blu è l’elemento da posizionare; quello verde mostra dove finisce l’elemento successivo. Ogni anteprima è isolata dagli stili del sito.
1. I valori principali di position
Position determina il metodo di posizionamento. Le distanze top, right, bottom e left hanno significati diversi in base al metodo scelto.
| Proprietà o valore | Descrizione | Esempio HTML e CSS | Risultato |
|---|---|---|---|
position: static | È il valore iniziale. L’elemento segue il normale flusso; le proprietà di distanza dai lati non lo spostano. | HTMLCSS | Top e left non hanno effetto. Il secondo elemento rimane sotto il primo. |
position: relative | Mantiene il proprio spazio nel flusso. Le distanze spostano la rappresentazione dell’elemento rispetto alla posizione normale, senza spostare il posto riservato agli elementi successivi. | HTMLCSS | Il riquadro si sposta in basso e a destra. Il successivo resta nella posizione originaria e può essere coperto. |
position: absolute | Rimuove l’elemento dal normale flusso. In questo esempio il riferimento è il contenitore con position: relative. | HTMLCSS | Il riquadro è posizionato rispetto al contenitore. L’elemento successivo non conserva uno spazio per il riquadro e parte dall’alto. |
2. Distanze dai lati e proprietà abbreviata
Questi esempi usano position: absolute dentro un contenitore posizionato. Le distanze si misurano dal relativo blocco di riferimento; non sono margini.
| Proprietà o valore | Descrizione | Esempio HTML e CSS | Risultato |
|---|---|---|---|
top e left | Impostano la distanza dal lato superiore e da quello sinistro. | HTMLCSS | Il riquadro è vicino all’angolo superiore sinistro, con le distanze indicate. |
bottom e right | Impostano la distanza dal lato inferiore e da quello destro. | HTMLCSS | Il riquadro è vicino all’angolo inferiore destro. |
inset | Abbrevia top, right, bottom e left. Con un valore assegna la stessa distanza ai quattro lati. Con quattro valori segue l’ordine alto, destra, basso, sinistra. | HTMLCSS | La larghezza e l’altezza automatiche permettono al riquadro di estendersi tra i quattro lati, lasciando 15 pixel lungo ciascuno. |
left e right insieme | Con posizione assoluta e larghezza automatica, le due distanze possono determinare la larghezza disponibile. | HTMLCSS | Il riquadro si estende tra i due limiti laterali, senza impostare una larghezza fissa. |
Distanze in percentuale | Nel posizionamento assoluto, left e right sono riferiti alla larghezza del blocco di riferimento; top e bottom alla sua altezza. | HTMLCSS | Il bordo superiore sinistro del riquadro è a metà larghezza e altezza del riferimento. Questo, da solo, non centra l’intero riquadro. |
Qual è il blocco di riferimento?
Per un elemento absolute, il riferimento è comunemente il più vicino antenato con position diverso da static. In mancanza di un riferimento di questo tipo o di altri antenati che lo stabiliscono, si usa il blocco contenitore iniziale. Alcune altre proprietà, per esempio transform, possono creare un riferimento anche senza position: relative.
Il riferimento non è necessariamente il genitore immediato. Per evitare ambiguità, negli esempi assegnamo position: relative al contenitore in cui vogliamo collocare l’elemento. Non è necessario spostare il contenitore con top o left.
3. Position: fixed
Un elemento fixed è rimosso dal normale flusso e, normalmente, è posizionato rispetto alla finestra di visualizzazione. Rimane nella stessa posizione mentre la pagina scorre. Nell’anteprima la finestra di riferimento è quella dell’iframe, non l’intera pagina della lezione.
HTML
<div class="pagina">
<h2>Scorri questa anteprima</h2>
<p>Il cartellino rimane nell’angolo della finestra.</p>
</div>
<div class="cartellino">Elemento fisso</div>CSS
.pagina {
min-height: 800px;
background: linear-gradient(#fff0d1, #dceeff);
}
.cartellino {
position: fixed;
right: 12px;
bottom: 12px;
padding: 12px;
border: 2px solid #17365d;
background-color: #dceeff;
}Risultato
Scorri dentro l’anteprima: il cartellino resta in basso a destra. Un antenato con proprietà come transform può cambiare il blocco di riferimento di un elemento fixed. Verifica anche che elementi fissi non coprano contenuti o controlli importanti.
4. Position: sticky
Un elemento sticky mantiene il proprio spazio nel flusso. Quando lo scorrimento raggiunge la soglia impostata, rimane vicino al lato indicato, entro i limiti del suo contenitore. In questo esempio il riferimento per lo scorrimento è un div con overflow: auto.
HTML
<div class="scorrevole">
<div class="introduzione">Scorri per raggiungere l’intestazione.</div>
<div class="titolo">Intestazione sticky</div>
<div class="contenuto">Il contenuto continua più in basso.</div>
</div>CSS
.scorrevole {
height: 220px;
overflow: auto;
border: 2px solid #17365d;
background-color: #fff0d1;
}
.introduzione {
padding: 15px;
height: 70px;
}
.titolo {
position: sticky;
top: 0;
padding: 12px;
background-color: #17365d;
color: white;
z-index: 1;
}
.contenuto {
height: 500px;
padding: 15px;
}Risultato
Il titolo inizialmente segue il contenuto. Dopo aver raggiunto il bordo superiore dell’area scorrevole, rimane visibile mentre scorri. Per attivare il vincolo serve una distanza non auto sul relativo asse: qui top: 0.
5. Sovrapposizione: z-index
Z-index controlla l’ordine di sovrapposizione nei contesti in cui si applica, tra cui gli elementi posizionati e i figli flex o grid. Accetta interi, anche negativi, e auto. Non è una misura in pixel.
HTML
<div class="area"><div class="blu">Blu: z-index 1</div><div class="verde">Verde: z-index 2</div></div>CSS
.area {
position: relative;
width: 280px;
height: 180px;
background-color: #fff0d1;
}
.blu, .verde {
position: absolute;
width: 150px;
height: 100px;
box-sizing: border-box;
padding: 12px;
border: 2px solid #17365d;
}
.blu {
top: 15px;
left: 15px;
background-color: #dceeff;
z-index: 1;
}
.verde {
top: 60px;
left: 90px;
background-color: #dff0e5;
z-index: 2;
}Risultato
Il verde copre la parte del blu con cui si sovrappone perché i due elementi sono confrontabili nello stesso contesto e il verde ha z-index maggiore.
I contesti di sovrapposizione
La pagina può contenere gruppi di sovrapposizione separati, chiamati stacking context. Un figlio con z-index molto alto non può semplicemente superare un elemento esterno a un contesto che, nel complesso, viene disegnato più in alto.
Tra le condizioni che creano un contesto ci sono position: relative o absolute con z-index diverso da auto, position: fixed o sticky, opacity minore di 1, transform diverso da none e isolation: isolate. L’elenco non è completo, ma mostra perché aumentare z-index senza controllare gli antenati può non risolvere il problema.
6. Esempio completo: un’etichetta su una scheda
La scheda rimane nel normale flusso ed è il riferimento dell’etichetta assoluta. Il padding superiore riserva spazio al testo, perché l’etichetta non lo fa automaticamente.
HTML
<article class="scheda">
<span class="etichetta">Novità</span>
<h2>Imparare il CSS</h2>
<p>Un’etichetta evidenzia questa scheda.</p>
</article>CSS
.scheda {
position: relative;
margin: 15px;
padding: 45px 20px 20px;
border: 2px solid #17365d;
border-radius: 10px;
background-color: #eef5ff;
}
.etichetta {
position: absolute;
top: 10px;
right: 10px;
padding: 5px 10px;
border-radius: 6px;
background-color: #17365d;
color: white;
}Risultato
Centrare un elemento assoluto
Top: 50% e left: 50% portano l’angolo del riquadro al centro del riferimento. Con translate possiamo correggere lo spostamento in base alle dimensioni del riquadro stesso:
.contenitore {
position: relative;
height: 250px;
}
.riquadro {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Le percentuali di translate sono riferite alla dimensione del riquadro trasformato, mentre quelle di top e left al blocco di riferimento. Per una semplice centratura nel layout, Flexbox o Grid possono offrire una soluzione più diretta senza rimuovere l’elemento dal flusso.
Proprietà logiche di distanza
Inset-inline-start, inset-inline-end, inset-block-start e inset-block-end seguono la direzione di scrittura. Nella scrittura orizzontale italiana da sinistra a destra corrispondono rispettivamente a left, right, top e bottom. Esistono anche le abbreviazioni inset-inline e inset-block.
| Valore | Conserva spazio nel flusso? | Riferimento principale |
|---|---|---|
| static | Sì. | Il normale layout; le distanze non si applicano. |
| relative | Sì. | La propria posizione normale. |
| absolute | No. | Il blocco contenitore stabilito dagli antenati. |
| fixed | No. | Normalmente il viewport; alcuni antenati possono cambiarlo. |
| sticky | Sì. | La zona di scorrimento e i limiti del contenitore. |
Problemi frequenti
- Top e left non spostano l’elemento: controlla che position non sia static.
- Absolute si posiziona nel punto sbagliato: individua il blocco di riferimento e assegna position: relative al contenitore appropriato.
- Il contenuto successivo finisce sotto l’elemento: absolute e fixed non riservano spazio. Prevedi una struttura o una spaziatura adatta.
- Il contenitore perde altezza: se tutti i figli sono assoluti, non contribuiscono alla sua altezza automatica.
- Z-index non risolve la sovrapposizione: controlla i contesti creati dagli antenati. Un valore più grande non supera tutti gli altri elementi della pagina.
- L’elemento viene tagliato: controlla i limiti di ritaglio e overflow dei contenitori; z-index non annulla il ritaglio.
- Su schermi piccoli un elemento fisso copre il testo: verifica il layout a diverse dimensioni e con caratteri ingranditi.