Modello della scatola

Podcast CSS - 001: The Box Model

Supponiamo che tu abbia questa porzione di HTML:

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

Quindi scrivi questo CSS:

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

I contenuti raggiungono una larghezza di 142 px, invece dei 100 px che hai specificato, e si disconnettono dall'elemento. Perché?

Il modello a riquadro è una base fondamentale del CSS. Capire come funziona il modello a scatola, in che modo è influenzato da altri aspetti del CSS e, soprattutto, come puoi controllarlo, può aiutarti a scrivere codice CSS più prevedibile.

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 dal CSS è una casella, anche se si tratta solo di testo, o ha un border-radius che lo fa sembrare un cerchio.

Contenuti e dimensioni

Le caselle hanno un comportamento diverso in base al valore display, alle dimensioni del set e ai contenuti che contengono. Può trattarsi di testo normale o più riquadri generati da elementi secondari. In ogni caso, le dimensioni della scatola influiscono sui contenuti per impostazione predefinita.

Puoi controllare questa opzione utilizzando le dimensioni estrinseche oppure puoi utilizzare le dimensioni intrinseche per consentire al browser di prendere decisioni per te in base alle dimensioni dei contenuti.

Ecco una demo di base che spiega la differenza:

Quando la scatola ha dimensioni estrinseche, c'è un limite alla quantità di contenuti che puoi aggiungere prima che vengano visualizzati in modo eccessivo. In questo modo la parola "fantastico" si riempie di informazioni.

La demo presenta le parole "CSS è fantastico" in una casella con dimensioni fisse e bordo spesso. Poiché la casella ha una larghezza specificata, le dimensioni sono estrinsecamente. Ciò significa che controlla le dimensioni dei relativi contenuti secondari. Tuttavia, la parola "fantastico" è troppo grande per essere inserita nella casella, quindi supera il riquadro bordo della casella principale (scoprirai di più più avanti). Un modo per evitare questo overflow è consentire le dimensioni intrinseche della casella non impostando la larghezza o, in questo caso, impostando width su min-content. La parola chiave min-content indica alla casella di avere la stessa larghezza intrinseca dei suoi contenuti (la parola "Fantastico"). In questo modo la casella si adatta perfettamente al testo.

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

Il dimensionamento estrinseco consente di controllare le dimensioni di un elemento. Il dimensionamento intrinseco impedisce l'overflow del testo.

Attiva e disattiva il dimensionamento intrinseco per vedere come il dimensionamento estrinseco offre un maggiore controllo, grazie a dimensioni estrinseche e intrinseche per un maggiore controllo sui contenuti. Per vedere gli effetti, aggiungi alcune frasi di testo alla scheda. Quando questo elemento ha dimensioni estrinseche, esiste un limite alla quantità di contenuti che puoi aggiungere prima dell'overflow, ma ciò non si verifica quando il dimensionamento intrinseco è attivato.

Per impostazione predefinita, questo elemento ha un insieme di width e height di 400px ciascuno. Queste dimensioni conferiscono limiti rigorosi a tutti i contenuti all'interno dell'elemento, che vengono rispettati, a meno che i contenuti non siano troppo grandi per il riquadro. Puoi vederlo in azione modificando la didascalia sotto l'immagine dei fiori con qualcosa che superi l'altezza della scatola.

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

Il passaggio al dimensionamento intrinseco consente al browser di prendere decisioni automaticamente in base alle dimensioni dei contenuti del riquadro. Ciò rende molto meno probabile l'overflow, perché il riquadro viene ridimensionato con il contenuto.

È 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 caselle sono composte da aree distinte dei modelli di riquadri che svolgono tutte un lavoro specifico.

Un diagramma che mostra le quattro aree principali del modello di riquadro: casella di contenuti, casella di spaziatura interna, casella di bordo e casella di margine
Le quattro aree principali del modello di riquadro: riquadro dei contenuti, casella di spaziatura interna, casella del bordo e casella dei margini.

Il riquadro dei contenuti è l'area in cui si trovano i contenuti. Il contenuto può controllare le dimensioni dell'elemento principale, che di solito è l'area con dimensioni più variabili.

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

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

La casella bordo circonda la casella di spaziatura e il suo spazio è definito dal valore border, che crea una cornice visiva per l'elemento. Il bordo dell'elemento rappresenta il limite di ciò che puoi vedere.

L'area finale, la casella a margine, è lo spazio attorno alla casella, definito dalla regola margin della casella. Anche proprietà come outline e box-shadow occupano questo spazio perché sono colorate sopra l'elemento e non influiscono sulle dimensioni del riquadro. La modifica del outline-width di 200px della casella in una casella non comporta modifiche all'interno del bordo del bordo.

I contorni ampi non incidono sulle dimensioni del resto dell'elemento.

Un'analogia utile

Il modello box è complesso da comprendere, quindi ecco un'analogia per ciò che hai imparato finora.

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

In questo diagramma, ci sono tre cornici montate una accanto all'altra su una parete. Gli elementi dell'immagine inquadrata corrispondono al modello della scatola come segue:

  • Il riquadro dei contenuti è l'artwork.
  • La scatola di imbottitura è la scheda di montaggio bianca, tra la cornice e l'illustrazione.
  • La casella del bordo è la cornice che fornisce un bordo letterale per l'artwork.
  • La casella a margine è lo spazio tra i frame.
  • L'ombra occupa lo stesso spazio della casella a margine.

Esegui il debug del modello box

Browser DevTools fornisce una visualizzazione dei calcoli del modello a scatola di una casella selezionata, utile per capire come funziona il modello a riquadro e come influisce sul sito web su cui stai lavorando.

Prova a utilizzare questo metodo nel tuo browser:

  1. Apri DevTools.
  2. Seleziona un elemento.
  3. Mostra il debugger del modello riquadro.
Il debugger del modello box per la demo degli schemi.

Controlla il modello della scatola

Per capire come controllare il modello box, devi prima capire cosa succede nel tuo browser.

Ogni browser applica un foglio di stile dello user agent ai documenti HTML che definisce l'aspetto e il comportamento degli elementi se non hanno CSS definito. Il CSS nei fogli di stile dello user agent varia da un browser all'altro, ma fornisce valori predefiniti appropriati per facilitare la lettura dei contenuti.

Una proprietà per cui il foglio di stile dello user agent imposta un valore predefinito di casella (display). Ad esempio, in un flusso normale, il valore display predefinito di un elemento <div> è block, <li> ha un valore display predefinito di list-item e <span> ha un valore predefinito di display pari a inline.

Un elemento inline ha un margine del blocco, ma gli altri elementi non lo rispettano. Con inline-block, altri elementi rispettano il margine del blocco, ma il primo elemento mantiene gli stessi comportamenti che aveva un elemento inline. Per impostazione predefinita, un elemento block riempie lo spazio in linea disponibile, mentre gli elementi inline e inline-block hanno dimensioni pari solo a quelle dei relativi contenuti.

Il foglio di stile dello user agent imposta anche box-sizing, che indica a una casella come calcolare le dimensioni della casella. Per impostazione predefinita, tutti gli elementi hanno il seguente stile user agent: box-sizing: content-box;. Ciò significa che quando imposti dimensioni come width e height, queste vengono applicate al riquadro dei contenuti. Se imposti padding e border, questi valori vengono aggiunti alle dimensioni della casella di contenuti.

Verifica le tue conoscenze

Verifica le tue conoscenze delle dimensioni del modello a scatola che influiscono sulle proprietà.

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

Quale larghezza pensi che avrà .my-box?

200px
Poiché il valore predefinito per le dimensioni del box è content-box, spaziatura interna e bordi aggiunti alla larghezza. 200px sarebbe corretto se la casella avesse box-sizing: border-box.
260px
Le dimensioni predefinite della casella sono content-box, il che significa che spaziatura interna e bordi vengono aggiunti all'intera casella.

La larghezza effettiva di questo riquadro è 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 rende visibile una larghezza totale di 260 px.

Puoi modificare questa impostazione specificando le dimensioni border-box:

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

Questo modello di riquadro alternativo indica al CSS di applicare width alla casella del bordo anziché alla casella dei contenuti. Questo significa che border e padding vengono inviati, quindi se imposti .my-box in modo che siano estesi a 200px, in realtà il rendering viene visualizzato con larghezza 200px.

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

Confronta gli effetti delle dimensioni dei riquadri dei contenuti e dei bordi.
*,
*::before,
*::after {
  box-sizing: border-box;
}

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

Poiché il modello a scatola alternativo può essere più prevedibile, gli sviluppatori spesso aggiungono questa regola per reimpostazioni e normalizzatori, come in questo caso.

Risorse

Fogli di stile dello user agent