I documenti html aderiscono allo standard DOM, Document Object Model,
secondo il quale gli elementi che compongono un documento sono disposti secondo una struttura
ad albero il cui nodo radice è l'elemento html. Dalla radice html
si diramano normalmente i nodi head e body. Possiamo anche dire che
l'elemento html contiene gli elementi head e body. Head e body, a loro
volta, sono i contenitori di altri elementi. In realtà quasi tutti gli
elementi di html possono fungere da contenitori di qualcosaltro secondo una gerarchia
di contenimento che, per i discendenti da head, termina con metadati, mentre per
i discendenti di body termina con i contenuti fruibili dagli utenti, testi, immagini,
ed elementi grafici vari.
Ogni elemento visualizzabile è pertanto all'interno di un contenitore. Quando
parliamo di posizionamento di un elemento intendiamo il posizionamento rispetto al
suo contenitore più prossimo.
La figura a destra mostra il frammento iniziale dell'albero degli elementi di un possibile
documento html. Notare come l'elemento paragrafo possa fungere da contenitore non solo per
frammenti di testo ma anche per immagini e per molti altri elementi. Il primo paragrafo di
questo documento ne è un esempio.
Il posizionamento di un elemento nel proprio contenitore dipende dal contesto di
formattazione in cui l'elemento è inserito e dalle proprietà di stile display,
position, float, left, top, right, bottom
Nel presente documento mostreremo come i diversi tipi di elementi si dispongono in
un contesto di formattazione normale, ovvero in un contenitore in cui non siano
presenti elementi flottanti, ne elementi posizionati in maniera assoluta. Inoltre lasceremo
il valore di default per la proprietà display di tutti gli elementi.
Per ben evidenziare i box degli elementi coinvolti negli esempi di posizionamento
assegneremo ad essi, quando utile e dove permesso, colori di background, bordi e margini.
Esempi di posizionamento statico
Static è il valore di default della property position.
I box con position:static sono box non posizionati. Su di essi non agiscono le
properties left, top, right, bottom.
Codice html e css
<h3>Line box</h3><p>Primo paragrafo del contenitore grigio. I paragrafi, elementi p, sono elementi che
generano block box. Al loro interno possono contenere altri elementi.<br>
In questo paragrafo sono presenti elementi <em>em</em>, <em>br</em> e <em>mark</em>.
<mark>Notare come tutti i box interni a p abbiano generato box di altezze differenti
e come ogni linea sia alta abbastanza per contenere il box più alto.</mark><br><em>Per ogni linea di testo viene creata un'area rettangolare, larga quanto l'area di
contenuto del suo contenitore, ed alta abbastanza per il suo elemento più alto.</em><mark>Quest'area viene chiamata <em>line-box</em></mark>.</p><p>I line-boxes all'interno di un contenitore si comportano come block-boxes, pertanto
si dispongono verticalmente uno sotto l'altro con il loro margine sinistro adiacente
al lato sinistro del loro contenitore.<p><h3>Baseline ed allineamento verticale<h3><p>Per evidenziare ancor meglio il significato di line-box inserisco in questo paragrafo
una immagine. L'elemento <em>img</em> dal punto di vista del comportamento dei box
generati per contenerla è dello stesso tipo degli elementi em, mark, strong. Genera
un inline-box. <strong>Immagine 1: </strong>
<img src="../images/toolsOld.png" style="vertical-align=baseline;"> <br>
Il box dell'immagine si dispone consecutivamente al box dell'elemento strong che la precede,
che a sua volta è consecutivo al box contenente la stringa di testo "anonima".
Il box contente l'immagine è il box più alto della line-box che lo contiene.
La property vertical-align del box più alto della line-box determina l'allineamento
verticale del testo e degli eventuali altri box presenti nella line-box.<br>
Per <strong>Immagine 1:</strong> vertical-align ha il valore
di default:baseline che determina il posizionamento del testo adiacente sulla base della
line box. Ripeto la stessa immagine con diversi valori di vertical-align:<br>
<img src="../images/toolsOld.png" style="vertical-align:middle;"> vertical-align:middle;<br>
<img src="../images/toolsOld.png" style="vertical-align:bottom;"> vertical-align:bottom;<br></p>
I paragrafi sono evidenziati dal colore di background bianco. Essi contengono stringhe di caratteri, che possono
essere considerate "elementi anonimi" il cui aspetto è determinato da numerose properties, fra cui
font-style, font-size, text-align, color, ..., ereditate dall'elemento paragrafo stesso o dagli ascendenti di
paragrafo.
La prima linea di testo del paragrafo contiene solo testo anonimo che genera una line-box la cui altezza è determinata
dalla property line-height del suo ascendente più prossimo.
Anche la seconda linea viene visualizzata come testo anonimo ma in realtà contiene
un elemento br. La terza linea oltre al testo anonimo contiene elementi em e mark, i quali, non essendo
anonimi possono essere formattati con proprie properties. L'altezza della line-box è quella del box
dell'elemento più alto. In questo caso i em.
Primo paragrafo del contenitore grigio. I paragrafi, elementi p, sono elementi che generano block box.
Al loro interno possono contenere altri elementi.
In questo paragrafo sono presenti elementi em, br e mark. Notare
come tutti i box interni a p abbiano generato box di altezze differenti e come ogni linea sia alta
abbastanza per contenere il box più alto. Per ogni linea di testo viene creata un'area rettangolare, larga quanto l'area di contenuto
del suo contenitore, ed alta abbastanza per il suo elemento più alto.
Quest'area viene chiamata line-box.
I line-boxes all'interno di un contenitore si comportano come block-boxes, pertanto
si dispongono verticalmente uno sotto l'altro con il loro margine sinistro adiacente
al lato sinistro del loro contenitore.
Baseline ed allineamento verticale
Per evidenziare ancor meglio il significato di line-box inserisco in questo paragrafo
una immagine. L'elemento img dal punto di vista del comportamento dei box
generati per contenerla è dello stesso tipo degli elementi em, mark, strong. Genera
un inline-box. Immagine 1:
Il box dell'immagine si dispone consecutivamente al box dell'elemento strong che la precede, che
a sua volta è consecutivo al box contenente la stringa di testo "anonima". Il box contente l'immagine
è il box più alto della line-box che lo contiene. La property vertical-align del box più alto della line-box
determina l'allineamento verticale del testo e degli eventuali altri box presenti nella line-box.
Per Immagine 1: vertical-align ha il valore di default:baseline che determina il posizionamento
del testo adiacente sulla base della line box. Ripeto la stessa immagine con diversi valori di vertical-align:
vertical-align:middle;
vertical-align:bottom;
Esempi di posizionamento relativo
Sui box con posizionamento relativo (position:relative;) agiscono le
properties left, top, right e bottom determinando uno spostamento del box rispetto alla sua
sua posizione normale (quella che avrebbe occupato il box non posizionato).
Esempio
Note
In caso di posizionamento relativo:
la property left determina lo spostamento del box rispetto al suo margine sinistro;
la property top determina lo spostamento del box rispetto al suo margine superiore;
la property right determina lo spostamento del box rispetto al suo margine destro;
la property bottom determina lo spostamento del box rispetto al suo margine inferiore;
Nel caso siano applicate ad uno stesso box le properties top e bottom prevale top;
Nel caso siano applicate ad uno stesso box le properties left e right prevale left;
Per la descrizione completa delle properties left, top, right, bottom vedi:
Box offsets.
Properties left, top, bottom, right
Osserviamo l'effetto del posizionamento relativo determinato dalle properties left,top, right, bottom, sui box presenti
in un contenitore.
La prossima line-box contiene due immagini in posizione normale.
immagine 1: immagine 2:
Ora applichiamo alle properties left e top della prima immagine rispettivamente i valori -50pt e -20em:
immagine 1: immagine 2:
Notiamo come il box si sposti dalla sua posizione normale senza influenzare in alcun modo gli altri box. I box posizionati
relativamente non sono vincolati a restare nel proprio container come si può osservare nella prossima line-box:
immagine 1: immagine 2:
Esempi di posizionamento assoluto
Sui box con posizionamento assoluto (position:absolute;) agiscono le
properties left, top, right e bottom determinando uno spostamento del box rispetto ai
lati left, top, right e bottom del loro container.
La posizione e dimensione del/dei box di un elemento sono, a volte, calcolate rispetto
ad un'area rettangolare chiamata blocco contenitore dell'elemento, Containing block.
La definizione di blocco contenitore è la seguente:
Il blocco contenitore in cui risiede l'elemento root è chiamato blocco contenitore iniziale.
Per i media di tipo continuo, esso ha le dimensioni della viewport ed è ancorato alla origine del
canvas; esso è la page area per i page media. La property 'direction' del blocco contenitore iniziale
è lo stesso dell'elemento root.
Per gli altri elementi, se la posizione degli elementi è 'relativa' o 'statica', il blocco contenitore
è quello delimitato dai lati del suo più prossimo ascendente che sia di tipo block box o che stabilisca
un contesto di formattazione.
Se l'elemento ha posizione 'fissa', il suo blocco contenitore è la viewport per i media di tipo continuo,
o la page area per i medi di tipo paginato.
Se l'elemento ha posizione assoluta, i blocco contenitore deriva dal suo più prossimo ascendente posizionato
in maniera assoluta, relativa, o fissa nel seguente modo:
Se l'ascendente è un elemento inline, i blocco contenitore è il box che circonda i padding box del
primo e dell'ultimo box inline generato per quell'elemento. In CSS 2.2, se l'elemento è splittato su più
linee, il blocco contenitore è indefinito.
Negli altri casi il blocco contenitore è costituito dai lati del padding dell'ascendente.
diversamente il blocco contenitore è il blocco contenitore iniziale.
Il primo paragrafo nel box a destra è posizionato in maniera relativa. Il paragrafo successivo è identico ma posizionato
in maniera statica.
Nelle due sezioni rossa e verde sono stati provati i diversi tipi di posizionamento di box block e di box inline in
box contenitori rispettivamente statici e relativi. Ecco le regole css assegnate ai diversi blocchi rappresentati.
Osserviamo le differenze fra posizonamento relativo e posizionamento assoluto vedendo come gli stessi valori
di offset applicati ad oggetti identici agiscano in maniera diversa in caso di posizionamento assoluto e relativo.
La line-box seguente contiene una immagine non posizionata
immagine 1: (non posizionata)
La prossima line-box contiene una immagine posizionata con offsets relativi alla posizione normale.
immagine 1: (posizionata relativamente)
Ora vediamo cosa succede quando gli stessi valori di offset sono applicati con posizionamento assoluto:
immagine 1: (posizionata in maniera assoluta):
Osserviamo le differenze fra posizonamento relativo e posizionamento assoluto vedendo come gli stessi valori
di offset applicati ad oggetti identici agiscano in maniera diversa in caso di posizionamento assoluto e relativo.
La line-box seguente contiene una immagine non posizionata
immagine 1: (non posizionata)
La prossima line-box contiene una immagine posizionata con offsets relativi alla posizione normale.
immagine 1: (posizionata relativamente)
Ora vediamo cosa succede quando gli stessi valori di offset sono applicati con posizionamento assoluto:
immagine 1: (posizionata in maniera assoluta):
Blocco contenitore posizionato in modo statico
Box block statico in un box contenitore statico
Box block relativo in un box contenitore statico
Box block assoluto in un box contenitore statico
Box inline statico in un box contenitore statico
Box inline relative in un box contenitore statico
Box inline absolute in un box contenitore statico
Blocco contenitore posizionato in modo relativo
Box block statico in un box contenitore relativo
Box block relativo in un box contenitore relativo
Box block assoluto in un box contenitore statico
Box inline statico in un box contenitore relativo
Box inline relative in un box contenitore relativo
Box inline absolute in un box contenitore relativo
Posizionamento fisso
Il posizionamento fisso è un particolare tipo di posizionamento in cui
il blocco contenitore è la viewport per i media
di tipo continuo o la page area per i media di tipo paginato.