Menu

Display CSS: block, inline, inline-block, none e flex

La proprietà display decide come un elemento partecipa al layout. Impara block, inline e inline-block con box misurati uno accanto all'altro, display none contro visibility hidden, e dove si collocano flex, grid, flow-root e contents.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Cosa fa display

Ogni elemento ha un valore di display che decide come viene disposto. I primi tre che incontri sono block, inline e inline-block. Ecco tre box identici, con gli stessi width, height, padding e margin, in cui cambia solo display:

blockinlineinline-block
Inizia su una nuova rigaSìNoNo
Larghezza predefinitaRiempie il contenitoreSi adatta al contenutoSi adatta al contenuto
width e heightSi applicanoIgnoratiSi applicano
Margin verticaleSi applicaIgnoratoSi applica
Padding verticaleSpinge il contenutoDisegnato, ma non allontana le righeSpinge il contenuto
Elementi tipicidiv, p, h1, ul, sectionspan, a, strong, embutton, input, img (gli elementi sostituiti si comportano così)

Nell'anteprima, il box block sta su una riga tutta sua ed è largo 120px. Quello inline ignora larghezza e altezza e avvolge solo la sua parola, e il suo padding e il suo bordo verticali sporgono sopra e sotto la riga senza renderla più alta. Il box inline-block resta nella riga di testo ma mantiene tutte le sue dimensioni.

display: block

Un elemento block occupa tutta la larghezza disponibile e manda a capo ciò che segue. Trasformare un link in un blocco è il modo per rendere cliccabile un'intera riga:

.menu a {
  display: block;       /* the full row is the link */
  padding: 10px 16px;
}

La larghezza di un blocco si può impostare, e margin: 0 auto lo centra una volta che ce l'ha, come mostra la pagina su come centrare un div.

display: inline-block

inline-block è la via di mezzo: scorre in una riga come una parola, ma puoi dargli dimensioni. È utile per badge, pulsanti e icone dentro il testo:

Più box inline-block in fila ricevono un piccolo spazio tra loro dagli spazi bianchi nell'HTML. Per le file di box, display: flex sul genitore è lo strumento migliore.

display: none o visibility: hidden

Entrambi rendono invisibile un elemento. La differenza è se mantiene il suo spazio:

display: nonevisibility: hiddenopacity: 0
Occupa spazioNoSìSì
Si può cliccareNoNoSì
Letto dagli screen readerNoNoSì
Si può animare in modo fluidoNoNoSì

L'attributo HTML hidden fa lo stesso di display: none tramite il foglio di stile del browser, il che significa che qualsiasi regola CSS che imposta display sull'elemento (per esempio .card { display: flex; }) lo sovrascrive e l'elemento ricompare. Aggiungi [hidden] { display: none !important; } se ti capita.

Per nascondere qualcosa alla vista ma lasciarlo agli screen reader (per esempio l'etichetta di un pulsante con icona), usa una classe "visually hidden" invece di display: none.

display: flex e display: grid

Questi due trasformano un elemento in un contenitore di layout per i suoi figli:

  • display: flex dispone i figli in una riga o in una colonna, con controllo su allineamento e spaziatura. Vedi flexbox.
  • display: grid colloca i figli su righe e colonne contemporaneamente.

Il contenitore in sé resta un blocco. inline-flex e inline-grid fanno lo stesso per i figli ma fanno scorrere il contenitore inline, come inline-block.

Gli altri valori

ValoreCosa fa
flow-rootUn blocco che contiene i suoi float e impedisce ai margini dei figli di uscire; il "clearfix" moderno
contentsIl box dell'elemento sparisce e i suoi figli si comportano come figli del suo genitore. Evitalo su pulsanti, liste e tabelle: alcuni browser perdono il significato dell'elemento per gli screen reader
list-itemUn blocco con un marcatore di lista, il valore predefinito di li
table, table-row, table-cellLayout a tabella su elementi che non sono tabelle
inline-flex, inline-gridUn contenitore flex o grid che sta inline

Errori comuni

  • Impostare width o height su uno span o un a. Gli elementi inline li ignorano. Usa inline-block o block.
  • Margin verticale su un elemento inline. Anche questo viene ignorato. Stessa soluzione.
  • Usare display: none per nascondere un testo pensato per gli screen reader. Lo nasconde anche a loro.
  • Aspettarsi che un figlio si veda dentro un genitore con display: none. Niente dentro un genitore nascosto viene disegnato.
  • Una regola display che sovrascrive l'attributo hidden. Vince la regola CSS.
  • Provare ad animare display. Impostare display: none nasconde subito l'elemento, senza dissolvenza; anima opacity e cambia display (o visibility) alla fine.

Domande frequenti

Che differenza c'è tra block, inline e inline-block?

Un elemento block inizia su una nuova riga e occupa tutta la larghezza disponibile. Un elemento inline scorre dentro il testo e ignora width, height e i margini verticali. inline-block scorre dentro il testo come inline, ma accetta larghezza, altezza, padding e margini come un blocco.

Cosa fa display: none?

Rimuove completamente l'elemento dalla pagina: non occupa spazio, non viene disegnato ed è nascosto agli screen reader. I suoi figli vengono nascosti con lui e non si possono mostrare con un proprio valore di display.

Che differenza c'è tra display: none e visibility: hidden?

display: none rimuove l'elemento e il suo spazio. visibility: hidden lo rende invisibile ma mantiene il suo spazio nel layout, quindi non si sposta nulla.

Un div è block o inline per impostazione predefinita?

Block. div, p, i titoli, ul, section e form sono block per impostazione predefinita; span, a, strong, em, img, input e button sono inline o inline-block.

Perché c'è uno spazio tra gli elementi inline-block?

Lo spazio bianco tra i tag nell'HTML viene reso come uno spazio, proprio come tra le parole. Usa invece display: flex con gap sul genitore, oppure togli lo spazio bianco.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA