Modello della scatola

The CSS Podcast - 001: The Box Model

Supponiamo che tu abbia questo frammento di codice HTML:

<p>I am a paragraph of text that has a few words in it.</p>

Poi scrivi questo CSS:

p {
  width: 100px;
  height: 50px;
  padding: 20px;
  border: 1px solid;
}

I contenuti finiscono per avere una larghezza di 142 px, anziché i 100 px specificati, e escono dall'elemento. Perché?

Il modello a scatola è una base fondamentale del CSS. Comprendere il funzionamento del modello a scatola, come viene influenzato da altri aspetti del CSS e, soprattutto, come controllarlo può aiutarti a scrivere CSS più prevedibili.

Comprendere il modello a scatola di CSS ti aiuterà a capire perché i tuoi contenuti non rientrano in un elemento.

È importante ricordare che tutto ciò che viene visualizzato da CSS è una casella, anche se si tratta solo di testo o ha un border-radius che lo fa sembrare un cerchio.

Contenuti e dimensionamento

Le caselle hanno un comportamento diverso in base al valore display, alle dimensioni impostate e ai contenuti che contengono. Questi contenuti potrebbero essere testo normale o più caselle generate da elementi secondari. In entrambi i casi, i contenuti influiscono sulle dimensioni della casella per impostazione predefinita.

Puoi controllare questo aspetto utilizzando il dimensionamento estrinseco oppure puoi utilizzare il dimensionamento intrinseco per lasciare che il browser prenda decisioni per te in base alle dimensioni dei contenuti.

Ecco una demo di base che spiega la differenza:

Quando la casella ha dimensioni estrinseche, esiste un limite alla quantità di contenuti che puoi aggiungere prima che superino i limiti della casella. In questo modo, la parola "fantastico" non rientra nello spazio disponibile.

La demo contiene le parole "CSS is awesome" (CSS è fantastico) in una casella con dimensioni fisse e un bordo spesso. Poiché la casella ha una larghezza specificata, le sue dimensioni sono estrinseche. Ciò significa che controlla il dimensionamento dei contenuti secondari. Tuttavia, la parola "fantastico" è troppo grande per la casella, quindi esce dalla casella di confine della casella principale (ne parleremo più avanti). Un modo per evitare questo overflow è consentire il dimensionamento intrinseco della casella non impostando la larghezza o, in questo caso, impostando width su min-content. La parola chiave min-content indica alla casella di essere larga solo quanto la larghezza minima intrinseca del suo contenuto (la parola "fantastico"). In questo modo, la casella si adatta perfettamente al testo.

Ecco un esempio più complesso che mostra l'impatto delle diverse dimensioni sui contenuti reali:

Il dimensionamento estrinseco ti consente di controllare le dimensioni di un elemento. Il dimensionamento intrinseco impedisce il riversamento del testo.

Attiva e disattiva il dimensionamento intrinseco per vedere come il dimensionamento estrinseco ti offre un maggiore controllo e come il dimensionamento intrinseco offre ai contenuti un maggiore controllo. Per vedere gli effetti, aggiungi alcune frasi di testo alla scheda. Quando questo elemento ha un dimensionamento estrinseco, esiste un limite alla quantità di contenuti che puoi aggiungere prima che si verifichi un overflow, ma ciò non accade quando il dimensionamento intrinseco è attivato.

Per impostazione predefinita, questo elemento ha un width e un height di 400px ciascuno. Queste dimensioni forniscono limiti rigidi a tutto ciò che si trova all'interno dell'elemento, che vengono rispettati a meno che i contenuti non siano troppo grandi per la casella. Puoi vedere questo in azione modificando la didascalia sotto l'immagine del fiore con un testo che supera l'altezza della casella.

Termine chiave: l'overflow si verifica quando i contenuti sono troppo grandi per la casella in cui si trovano. Puoi gestire il modo in cui un elemento gestisce i contenuti in eccesso utilizzando la proprietà overflow.

Il passaggio al dimensionamento intrinseco consente al browser di prendere decisioni in base alle dimensioni dei contenuti della casella. In questo modo, il rischio di overflow è molto meno probabile perché la casella viene ridimensionata in base ai contenuti.

È importante ricordare che il dimensionamento intrinseco è il comportamento predefinito del browser e di solito offre molta più flessibilità rispetto al dimensionamento estrinseco.

Le aree del modello a scatola

Le scatole sono costituite da aree distinte del modello di scatola, ognuna delle quali svolge una funzione specifica.

Un diagramma che mostra le quattro aree principali del modello a scatole: scatola dei contenuti, scatola del padding, scatola del bordo e scatola del margine
Le quattro aree principali del modello a scatole: scatola dei contenuti, scatola del padding, scatola del bordo e scatola del margine.

La casella dei contenuti è l'area in cui si trovano i contenuti. I contenuti possono controllare le dimensioni del contenitore principale, quindi questa è in genere l'area con le dimensioni più variabili.

La casella di spaziatura interna circonda la casella dei contenuti ed è lo spazio creato dalla proprietà padding. Poiché il padding si trova all'interno della casella, lo sfondo della casella è visibile nello spazio che crea. Se la casella ha impostato regole di overflow, ad esempio overflow: auto o overflow: scroll, anche le barre di scorrimento occupano questo spazio.

Le barre di scorrimento si trovano nella casella di spaziatura interna.

Il riquadro del bordo circonda il riquadro di riempimento e il suo spazio è definito dal valore border, che crea una cornice visiva per l'elemento. Il bordo del bordo dell'elemento è il limite di ciò che puoi vedere.

L'ultima area, la casella del margine, è lo spazio intorno alla casella, definito dalla regola margin della casella. Anche proprietà come outline e box-shadow occupano questo spazio perché vengono disegnate sopra l'elemento e non influenzano le dimensioni della casella. La modifica del outline-width di 200px di una casella non cambia nulla all'interno del bordo.

Un contorno ampio non influisce sulle dimensioni del resto dell'elemento.

Un'analogia utile

Il modello a scatola è complesso da capire, quindi ecco un'analogia per ciò che hai imparato finora.

Tre cornici.
Il modello a scatola illustrato utilizzando cornici fisiche.

In questo diagramma, tre cornici sono montate una accanto all'altra su una parete. Gli elementi dell'immagine incorniciata corrispondono al modello di riquadro nel seguente modo:

  • La casella dei contenuti è la copertina.
  • Il riempimento è il cartone di montaggio bianco, tra la cornice e l'opera.
  • Il riquadro di selezione è la cornice che fornisce un bordo letterale per l'artwork.
  • La casella del margine è lo spazio tra i frame.
  • L'ombra occupa lo stesso spazio della casella del margine.

Eseguire il debug del modello di riquadro

Gli strumenti per sviluppatori del browser forniscono una visualizzazione dei calcoli del box model di una casella selezionata, il che può aiutarti a capire come funziona il box model e come influisce sul sito web su cui stai lavorando.

Per provare questa funzionalità in Chrome:

  1. Apri DevTools.
  2. Seleziona un elemento.
  3. Mostra il debugger del modello a scatola.
Il debugger del modello a scatole per la demo di outline.

Controllare il modello di casella

Per capire come controllare il modello a scatola, devi prima capire cosa succede nel browser.

Ogni browser applica un foglio di stile user-agent ai documenti HTML. Il foglio di stile definisce l'aspetto e il comportamento degli elementi, se non viene fornito un CSS definito. Il CSS nei fogli di stile user agent varia in base al browser, ma ogni browser ha impostazioni predefinite che rendono i contenuti più facili da leggere.

Il foglio di stile dell'user agent imposta il valore predefinito per gli elementi che accettano display. Ad esempio, il valore predefinito di display di un elemento <div> è block, un <li> ha un valore predefinito di display pari a list-item e un <span> ha un valore predefinito di display pari a inline.

Un elemento inline ha un margine di blocco, ma altri elementi non lo rispettano. Con inline-block, gli altri elementi rispettano il margine del blocco, ma il primo elemento mantiene la maggior parte dei comportamenti che aveva come elemento inline. Un elemento block riempie lo spazio in linea disponibile per impostazione predefinita, mentre gli elementi inline e inline-block sono grandi quanto i loro contenuti.

Il foglio di stile dell'user agent imposta anche i valori predefiniti per box-sizing, che indica a una casella come calcolare le sue dimensioni. Per impostazione predefinita, tutti gli elementi sono impostati su box-sizing: content-box;. Ciò significa che quando imposti dimensioni come width e height, queste dimensioni si applicano alla casella dei contenuti. Se poi imposti padding e border, questi valori vengono aggiunti alle dimensioni della casella dei contenuti.

Verifica la tua comprensione

Metti alla prova le tue conoscenze sulle proprietà che influiscono sulle dimensioni del modello di riquadro.

.my-box {
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

Quanto pensi che sarà largo .my-box?

200px
Poiché il valore predefinito per box-sizing è content-box, il padding e i bordi vengono aggiunti alla larghezza. 200px sarebbe corretto se la casella avesse box-sizing: border-box.
260px
Il dimensionamento predefinito della casella è content-box, il che significa che il padding e i bordi vengono aggiunti alla casella complessiva.

La larghezza effettiva di questa casella è 260 px. Poiché il CSS utilizza il valore predefinito box-sizing: content-box, la larghezza applicata è la larghezza dei contenuti, a cui vengono aggiunti padding e border su entrambi i lati. 200 px per i contenuti + 40 px di spaziatura interna + 20 px di bordo per una larghezza visibile totale di 260 px.

Puoi modificare questa opzione specificando il dimensionamento di border-box:

.my-box {
  box-sizing: border-box;
    width: 200px;
    border: 10px solid;
    padding: 20px;
}

Questo modello di casella alternativo indica al CSS di applicare width alla casella del bordo anziché alla casella dei contenuti. Ciò significa che i nostri border e padding vengono inseriti, quindi quando imposti .my-box su una larghezza di 200px, il rendering viene eseguito a una larghezza di 200px.

Scopri come funziona nella seguente demo interattiva. Quando attivi/disattivi il valore box-sizing, l'area blu mostra il CSS applicato all'interno della casella.

Confronta gli effetti del dimensionamento content-box e border-box.
*,
*::before,
*::after {
  box-sizing: border-box;
}

Questa regola CSS seleziona ogni elemento del documento e ogni pseudo elemento ::before e ::after e applica box-sizing: border-box. Ciò significa che ogni elemento ora utilizza questo modello di scatola alternativo.

Poiché il modello di scatola alternativo può essere più prevedibile, gli sviluppatori spesso aggiungono questa regola ai reset e ai normalizzatori, come questo.

Risorse

Fogli di stile dello user agent