Semplicemente

Introduzione ai CSS - Il visual formatting model

Tuesday 29 January 2008 Marco Bertoni, ultimo aggiornamento: Tuesday 19 August 2008.

Il visual formatting model stabilisce le regole per la generazione dei box da parte degli elementi.

La posizione che un box assume nel flusso dei contenuti della pagina può essere determinata:

  • Dalle dimensioni e dal tipo di box.
  • Dallo schema di posizionamento.
  • Dalle relazioni tra gli elementi nell'albero.
  • Da informazioni esterne: dimensioni dell'area di visualizzazione, dimensioni intrinseche delle immagini ecc.

La posizione e le dimensioni dei box sono calcolate rispetto ai contorni di un box rettangolare chiamato blocco contenitore.

In generale i box generati dagli elementi si comportano come blocco contenitore per gli elementi discendenti.

Ad ogni box è assegnata una posizione rispetto al suo blocco contenitore, ed in alcuni casi può anche superarne le dimensioni (overflow).

Gli schemi di posizionamento

Flusso normale
I box a blocco scorrono a partire dalla sommità del loro blocco contenitore mentre i box in linea scorrono da sinistra a destra. I margini verticali si combinano (collapse).
Floating (fluttuazione)
Il box fluttuante è proiettato il più possibile a sinistra, o a destra. Il contenuto dei box adiacenti può scorrere su un lato del box. I margini verticali non si combinano.
Posizionamento assoluto
Il box è rimosso dal flusso della pagina. Non influenza la posizione dei box adiacenti e non è influenzato da essi. La posizione è assegnata rispetto al blocco contenitore e i margini verticali non si combinano.

La proprietà position

Questa proprietà determina quale degli algoritmi di posizionamento sarà utilizzato. I valori possibili sono:

static
E' il valore predefinito. Il box è disposto secondo il flusso normale. Le proprietà top, right, bottom e left non si applicano.
relative
Il box è inizialmente disposto in accordo al flusso normale. Successivamente è deviato dalla sua posizione iniziale in funzione dei valori assegnati alle proprietà top, right, bottom e left. I box adiacenti non sono influenzati: si comportano come se il box fosse ancora nella sua posizione iniziale.
absolute
La posizione dell'elemento è definita rispetto al suo blocco contenitore dai valori assegnati alle proprietà top, right, bottom e left
fixed
La posizione è calcolata in modo analogo al valore absolute, tranne per il fatto che il box è fisso: non si muove quando il documento è scrollato. Il blocco contenitore di un box fisso è l'area di visualizzazione (viewport) del browser.

IE 6 e le versioni precedenti non supportano il valore fixed associato al posizionamento (mentre è parzialmente supportato per lo sfondo). IE 5.2 per Mac e IE 7 lo supportano.

Le proprietà top, right, bottom e left

Consentono di disporre i box generati dagli elementi posizionati in modo assoluto, relativo e fisso. I valori possibili sono:

lunghezza
Una distanza fissa dal limite di riferimento espressa in una delle unità di misura CSS. Sono ammessi valori negativi.
percentuale
Una percentuale della larghezza, o dell'altezza, del blocco contenitore. Sono ammessi valori negativi.
auto
Il valore è calcolato automaticamente dal browser.

Queste proprietà, nel posizionamento assoluto indicano le distanze dei lati del box dai corrispondenti lati del blocco contenitore. Nel posizionamento relativo la distanza è riferita alla posizione iniziale del box stesso.

Ecco un esempio di regola che posiziona un box in modo assoluto, esattamente a 10 pixel dall'alto e a 10 pixel da sinistra:

  1. #box {
  2. width: 200px;
  3. position: absolute;
  4. top: 10px;
  5. left: 10px;
  6. }

La proprietà z-index

Si applica agli elementi posizionati e consente di controllarne l'ordinamento nell'asse z. I valori possibili sono numeri interi positivi o negativi oppure auto.

Normalmente, gli elementi che compaiono per ultimi nel codice sono in primo piano rispetto ai precedenti.

Uno z-index negativo pone l'elemento dietro il suo blocco contenitore mentre un valore pari a 0 o maggiore lo pone davanti.

Se due elementi hanno lo stesso blocco contenitore e lo stesso valore per la proprietà z-index l'elemento che compare per ultimo nel codice sarà in primo piano.

Posizionamento dei box fluttuanti

La proprietà float specifica se un box fluttuerà a sinistra, a destra, oppure in nessuna delle due direzioni, rispetto al suo blocco contenitore.

I valori possibili sono:

left
L'elemento fluttua a sinistra rispetto al suo blocco contenitore. Il contenuto esterno al box scorre sul lato destro a partire dalla sommità del box.
right
Il box fluttua a destra e il contenuto esterno scorre sulla sinistra.
none
Il box non fluttua.

La proprietà clear, se applicata a un elemento che segue un box fluttuante, impedisce a quest'ultimo di sovrapporsi ad esso nel flusso normale.

Una spaziatura (clearance) è introdotta sopra il margine superiore dell'elemento al quale è applicata la proprietà, allo scopo di spingerlo verticalmente verso il basso oltre il box flottante evitando che quest'ultimo gli si sovrapponga.

I valori possibili sono:

left
Il margine superiore è incrementato della quantità necessaria per posizionare il limite del bordo superiore del box sotto il limite esterno inferiore di ogni box flottante a sinistra che compare prima nel documento.
right
Il margine superiore è incrementato della quantità necessaria per posizionare il limite del bordo superiore del box sotto il limite esterno inferiore di ogni box flottante a destra che compare prima nel documento.
both
Il margine superiore è incrementato della quantità necessaria per posizionare il limite del bordo superiore del box sotto il limite esterno inferiore di ogni box flottante a sinistra e a destra che compare prima nel documento.
none
Nessun vincolo è applicato alla posizione del box rispetto ai box flottanti.

Articolo incompleto. Lo finisco appena posso!

Contribuisci alla serie di articoli Introduzione ai CSS

12 Commenti a “Introduzione ai CSS - Il visual formatting model”

  1. Dimitri Giani dice:

    Ottimo articolo!
    Ci provai anche io con uno screencast a spiegare qualcosa sulle posizioni, ma sono molto meno bravo a spiegare :D

    Complimenti ancora!!!

  2. Marco Bertoni dice:

    Ciao Dimitri, grazie ;). Lo sai che questa guida è aperta alle collaborazioni?

  3. cirio dice:

    molto utile, grazie;)

  4. Ciel dice:

    Ottimo articolo! Avrei una domanda riguardo a
    >>Posizionamento assoluto
    Il box è rimosso dal flusso della pagina. Non influenza la posizione dei box adiacenti e non è influenzato da essi. La posizione è assegnata rispetto al blocco contenitore e i margini verticali non si combinano.

    Non ci sarebbe un modo per influenzare un altro box della pagina da questo sudetto assoluto?
    Se io volessi appunto posizionare absolute un box che però varia la sua altezza a seconda di quanto testo deve contenere, e volessi che sempre sotto di esso ne stesse un altro, di conseguenza, non absolute…
    Consigli?

  5. Marco Bertoni dice:

    Ciao Ciel, purtroppo non è possibile. Un box posizionato in modo assoluto non “spinge” sotto i box che lo seguono proprio perchè è slegato dal flusso del documento. Se proprio vuoi però ci sono delle soluzioni con Javascript: Multi-Column Layout With Footer, Footer positioned using Javascript.

    Ricorda sempre però di controllare che succede disabilitando Javascript.

  6. Ciel dice:

    Grazie del chiarimento.
    Posso chiederti un’altra cosa?
    Ma se questa operazione senza js non è possibile, solitamente che “tecnica” si usa per i layout grafici con “div-main” centrato/quasi centrato (comunque non attaccato al bordo della pagina), che usano un footer (per il copyright e/o magari la chiusura grafica dello sfondo che fa da contorno)?
    Si mettono 1 div (o 2) che fa da “colonna” la quale larghezza è la distanza da cui il div-main è separato da margine sinistro della pagina?

    Scusa la confusione… e grazie ^.^

  7. Marco Bertoni dice:

    Di solito si usa il posizionamento float. Ti suggerisco questa risorsa: Floatutorial che spiega passo dopo passo tutto ciò che puoi fare con i box fluttuanti ;).

  8. Ciel dice:

    Grazie mille, ci ho dato un’occhiata di “anteprima”… se ho capito bene, per esempio, potrei usare un layout di questo tipo dove i div di destra e sinistra servono semplicemente da “distanziatori” dal bordo della pagina per il centrale… sbaglio?

  9. Marco Bertoni dice:

    Il link che hai inserito non ha l’href :D

  10. Ciel dice:

    No comment… scusa: questo!

  11. Marco Bertoni dice:

    Ciao, il layout che indichi lo visualizzo male con ie7 e ff3, fai qualche test prima di usarlo. Ma i contenitori di destra e di sinistra non sono semplici distanziatori: possono contenere testo, immagini ecc. e se superassero in altezza il contenitore centrale non ci sarebbe problema: il footer sarebbe spinto in basso. Nella pagina ThreeColumnLayouts della lista CSS Discuss (moderata dal grande Eric Meyer) puoi trovare un bel po’ di esempi di layout a tre colonne ;).

  12. Ciel dice:

    Grazie ancora! ^.^

Scrivi un commento

XHTML: Puoi utilizzare questi marcatori: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Non ho commentato ma desidero ugualmente essere avvisato quando è pubbicato un commento: