Esempi di posizionamento

DocumentTree.png

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.

La property vertical-align può assumere molti più valori di quelli esemplificati ed il suo funzionamento è un po meno intuitivo di quanto ci si aspetti a prima vista. Vedi: Line height calculations: the 'line-height' and 'vertical-align' properties

Line box

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: ToolsOld
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:
ToolsOld vertical-align:middle;
ToolsOld 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:

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:favicon immagine 2: favicon
Ora applichiamo alle properties left e top della prima immagine rispettivamente i valori -50pt e -20em:
immagine 1:favicon immagine 2: favicon
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:favicon immagine 2: favicon

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.

Note

Esempio

Definizione di Containing block

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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:
    1. 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.
    2. 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.

   #static{
      background-color:red;
      position:static;
      width:600px;
      height:450px;  
   }
   #relative{
      background-color:green;
      position:relative;
      width:600px;
      height:450px;
   }
  .boxStatic {
      display:block;
      background-color:yellow;
      width:120px;
      height:80px;  
      position:static;
      left:10%;
      top:15%;
   }
   .boxRelative{
      display:block;
      background-color:yellow;
      width:120px;
      height:80px;
      position:relative;
      left:30%;
      top:-5%;   
   }
   .boxAbsolute{
      display:block;
      background-color:yellow;
      width:120px;
      height:80px;
      position:absolute;
      left:50%;
      top:50%;
   }
   
   .box2Static{
      display:inline;    
      background-color:blue;
      color:white;
      position:static;
      left:10%;
      top:10%;
   }
   .box2Relative{
      display:inline;    
      background-color:blue;
      color:white;
      position:relative;
      left:15%;
      top:20px;
   }
   .box2Absolute{
      display:inline;    
      background-color:blue;
      color:white;
      position:absolute;
      left:5%;
      top:60%;
   }

Properties left, top, bottom, right

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: favicon (non posizionata)
La prossima line-box contiene una immagine posizionata con offsets relativi alla posizione normale.
immagine 1: favicon (posizionata relativamente)
Ora vediamo cosa succede quando gli stessi valori di offset sono applicati con posizionamento assoluto:
immagine 1: favicon (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: favicon (non posizionata)
La prossima line-box contiene una immagine posizionata con offsets relativi alla posizione normale.
immagine 1: favicon (posizionata relativamente)
Ora vediamo cosa succede quando gli stessi valori di offset sono applicati con posizionamento assoluto:
immagine 1: favicon (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.

Pagina con esempi di posizionamento fisso.