Il box model

Per chi inizia ad utilizzare i fogli di stile, il box model è la causa dei primi problemi nel cercare di ottenere una presentazione cross browser (cioè simile con i principali browser). Cerchiamo di capire cos’è il box model e perchÃ?© crea tanti problemi.

Cosa sono i box?

Ogni elemento block-level (div, ul, li, p, per esempio) genera un box con quattro aree: un’area destinata ai contenuti e tre aree opzionali (il padding, il border e il margin).

Illustrazione: Le quattro aree di un box generico. [D 1]

Se il padding è impostato a zero, il perimetro del padding è uguale a quella del contenuto; se il border è impostato a zero (o a none) il perimetro del border coincide con quella del padding, e cosÃ?¬ via. Quindi se sia padding che border che margin sono impostati a zero, i quattro perimetri coincidono.

Quando nascono i problemi?

I problemi causati dal box model possono nascere quando applichiamo ad un elemento block-level di tipo block o list-item un width e un border e/o un padding.

Questo perch�© per le specifiche W3C, come si pu�² vedere dalla seguente illustrazione, il width serve per definire la larghezza del perimetro destinata ai contenuti (il perimetro della prima delle quattro aree, quindi), mentre per Internet Explorer 5 e 6 in modalit�  retrocompatibile, il width definisce la larghezza del perimetro del border.

Illustrazione: Confronto tra l'interpretazione del width di Internet Explorer 5 rispetto allo standard definito dal W3C. [D 2]

Dal lato pratico il problema è quello descritto nellÃ?â??immagine seguente, e cioè che se definiamo il width, il padding ed il border di un box, avremo, nel caso in cui il box sia visualizzato con un navigatore conforme agli standard, la larghezza totale del box pari a border left + padding left + width + padding right + margin right, mentre, nel caso di visualizzazione con Interenet Explorer, una larghezza pari al solo width.

Illustrazione: Lo stesso box visualizzato da un interprete conforme agli standard e da Internet Explorer 5 e 6 in modalit�   retro compatibile. [D 3]

Lo stesso discorso fatto per la larghezza del box è applicabile all’altezza, anche se i problemi legati all’altezza sono più rari (e forse più gravi, perchÃ?© spesso legati non al box model ma ad un problema concettuale di progettazione, ma non è questo il luogo per parlarne).

Come risolvere?

Solitamente se non specifichiamo nessun valore come width agli elementi block-level, il box generato occupa tutto lo spazio a disposizione. Ora che sappiamo questo e sappiamo che ciÃ?² che ci crea problemi è la combinazione di width, padding e border, abbiamo giÃ?  tutti gli elementi per trovare una possibile soluzione per rendere un box cross browser: basta annidare due box, definire in quello più esterno un width pari alla larghezza che si vuole abbia il box, e in quello più interno solo il padding ed il border desiderato.

Quindi:

<html>
   <head>
      <title>Due box annidati per crearne uno cross browser</title>
      <style type='text/css'>
      div.esterno {
         width: 400px;
      }
      div.interno {
         border: 10px solid #000;
         padding: 20px;
      }
      </style>
   </head>
   <body>
      <div class=’esterno’>
         <div class=’interno’>
            Questo è un box cross browser!
         </div>
      </div>
   </body>
</html>

Risultato:

Questo è un box cross browser!

In questo esempio abbiamo inserito del codice HTML inutile, ma spesso, al posto del DIV#interno, si possono usare gli elementi che il DIV#esterno probabilmente conterrÃ?  (paragrafi, elenchi, moduli,… ).

L’alternativa è far leggere in modo diverso il foglio di stile a Internet Explorer rispetto che ad un altro browser più rispettoso degli standard. In questo caso bisognerebbe verificare se Internet Explorer 6 (e 5 per Machintosh), in base al DOCTYPE specificato, leggeranno il documento in modalitÃ?  standard o retrocompatibile (vedi l’articolo Il doctype switch), e dopo di che scegliere il più adatto tra i tanti metodi possibili. Ad esempio, nel caso solo IE 6 funzioni in modalitÃ?  retrocompatibile o nel caso sia IE 6 e IE 5 per Mac funzionino in modalitÃ?  standard, l’utilizzo di commenti condizionali puÃ?² essere una buona soluzione, mentre in altre combinazioni di funzionamento opterei per dei filtri con i selettori.

Approfondimenti e risorse correlate:

Documentazione del W3C:

Hai trovato interessante questo articolo? Se vuoi, inscrivendoti alla newsletter, puoi ricevere una notifica ogni volta che c'è un nuovo articolo da leggere, oppure puoi sottoscrivere il feed RSS. Se non sai cos'è puoi leggere: Cos'è e come si legge un feed.
di Francesco Terenzani, 23 December 2005

post<li>

tag: , , , , .

post correlati:


Commenti (4). Commenti in formato RSS

  1. lele scrive:

    Avevo comprato 2 libri per saperlo!!!
    schitto e sincero! see yaa!

  2. Pingback: L'allineamento orizzontale degli elementi XHTML con i CSS.

    […] paragrafo è un blocco delimitato dai tag <p> e </p>. Il suo allineamento è diverso ed indipendente […]

  3. Sergejpinka scrive:

    Ciao Terenzani! :-)

    Ho un problema che penso sia dovuto al box-model: in IE, il bordo delle immagini, posto ad un padding di 2px e spesso 1px, che è attorno a tutta l’immagine “collassa” sull’immagine stessa.

    Detto in parole povere: con FF, il bordo è presente e dista dall’immagine 2px ed è tutto intorno all’immagine. Con IE, il bordo è sempre presente ma fra il bordo e l’immagine non v’è spazio.
    Io penso che derivi da un problema con il box model. Tra l’altro ho seguito le istruzioni presenti in Wrapping Text Around ImagesWordpress.org del sito Wordpress.org (le misure del padding, border, ecc.ecc. le ho prese tutte li), ma non continua a non funzionare in IE e “collassa” tutto.

    Grazie dell’aiiuto. :-)

  4. Fra_T scrive:

    Ciao Sergejpinka,
    il problema è che il padding ad un’immagine funziona solo da Internet Explorer 6 (quindi non funziona da ie5.5 in giù).

    Ad esempio, nel tuo blog, il bordo nelle immagine nei tuoi post si vedono bene con IE6.

    Se anche con ie6 non si vede come vorresti, potrebbe essere che sta funzionando in modalit�  retrocompatibile, puoi risolvere modificando il doctype: http://www.terenzani.it/11/il-doctype-switch-quirks-standars-mode/
    ma modificando il doctype potrebbero nascere altri problemi, comunque prova, al massimo aggiusti gli eventuali difetti del layout con un CSS ad hoc per IE6…

    Spero di esserti stato utile :-P

Scrivi un commento

XHTML: Puoi usare questi tag XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>