Menu

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

A propriedade display decide como um elemento participa do layout. Veja block, inline e inline-block com caixas medidas lado a lado, display none vs visibility hidden e onde entram flex, grid, flow-root e contents.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O que o display faz

Todo elemento tem um valor de display que decide como ele é disposto na página. Os três que você encontra primeiro são block, inline e inline-block. Aqui estão três caixas idênticas, com o mesmo width, height, padding e margin; só o display muda:

blockinlineinline-block
Começa em uma nova linhaSimNãoNão
Largura padrãoOcupa o contêinerSe ajusta ao conteúdoSe ajusta ao conteúdo
width e heightValemIgnoradosValem
Margin verticalValeIgnoradaVale
Padding verticalEmpurra o conteúdoPintado, mas não afasta as linhasEmpurra o conteúdo
Elementos típicosdiv, p, h1, ul, sectionspan, a, strong, embutton, input, img (elementos substituídos se comportam assim)

Na prévia, a caixa block fica sozinha na linha, com 120px de largura. A inline ignora largura e altura e envolve só a palavra dela, e o padding e a borda verticais saem acima e abaixo da linha sem deixá-la mais alta. A caixa inline-block fica na linha do texto, mas mantém o tamanho completo.

display: block

Um elemento block ocupa toda a largura disponível e empurra o que vem depois para uma nova linha. Transformar um link em block é o jeito de deixar uma linha inteira clicável:

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

A largura de um block pode ser definida, e margin: 0 auto o centraliza assim que ele tem uma, como mostra a página de como centralizar uma div.

display: inline-block

inline-block é o meio-termo: ele corre na linha como uma palavra, mas você pode dar tamanho a ele. É útil para badges, botões e ícones dentro do texto:

Várias caixas inline-block em sequência ganham um pequeno espaço entre elas por causa do espaço em branco do HTML. Para fileiras de caixas, display: flex no pai é a ferramenta melhor.

display: none vs visibility: hidden

Os dois deixam um elemento invisível. A diferença é se ele mantém o espaço:

display: nonevisibility: hiddenopacity: 0
Ocupa espaçoNãoSimSim
Pode ser clicadoNãoNãoSim
Lido por leitores de telaNãoNãoSim
Pode ser animado suavementeNãoNãoSim

O atributo HTML hidden faz o mesmo que display: none pela folha de estilo do navegador, o que significa que qualquer regra CSS que defina display no elemento (por exemplo .card { display: flex; }) o sobrescreve e o elemento volta a aparecer. Acrescente [hidden] { display: none !important; } se isso atrapalhar você.

Para esconder algo visualmente mas mantê-lo para leitores de tela (o rótulo de um botão só com ícone, por exemplo), use uma classe "visually hidden" em vez de display: none.

display: flex e display: grid

Esses dois transformam um elemento em um contêiner de layout para os filhos:

  • display: flex dispõe os filhos em uma linha ou coluna, com controle de alinhamento e espaçamento. Veja flexbox.
  • display: grid posiciona os filhos em linhas e colunas ao mesmo tempo.

O contêiner em si continua sendo um block. inline-flex e inline-grid fazem o mesmo pelos filhos, mas deixam o contêiner correr inline, como inline-block.

Os outros valores

ValorO que faz
flow-rootUm block que contém os floats e impede que as margens dos filhos vazem; o "clearfix" moderno
contentsA caixa do próprio elemento some e os filhos agem como filhos do pai dele. Evite em botões, listas e tabelas: alguns navegadores descartam o significado do elemento para leitores de tela
list-itemUm block com marcador de lista, o padrão do li
table, table-row, table-cellLayout de tabela em elementos que não são tabela
inline-flex, inline-gridUm contêiner flex ou grid que fica inline

Erros comuns

  • Definir width ou height em um span ou a. Elementos inline os ignoram. Use inline-block ou block.
  • Margin vertical em um elemento inline. Também é ignorada. A solução é a mesma.
  • Usar display: none para esconder um texto destinado a leitores de tela. Ele fica escondido deles também.
  • Esperar que um filho apareça dentro de um pai com display: none. Nada dentro de um pai escondido é renderizado.
  • Uma regra de display sobrescrevendo o atributo hidden. A regra CSS vence.
  • Tentar animar o display. Definir display: none esconde o elemento na hora, sem fade; anime a opacity e troque o display (ou a visibility) no final.

Perguntas frequentes

Qual a diferença entre block, inline e inline-block?

Um elemento block começa em uma nova linha e ocupa a largura disponível. Um elemento inline corre dentro do texto e ignora width, height e margens verticais. inline-block corre dentro do texto como o inline, mas aceita largura, altura, padding e margens como um bloco.

O que display: none faz?

Remove o elemento da página por completo: ele não ocupa espaço, não é renderizado e fica escondido dos leitores de tela. Os filhos são escondidos junto e não podem ser exibidos com um display próprio.

Qual a diferença entre display: none e visibility: hidden?

display: none remove o elemento e o espaço dele. visibility: hidden o deixa invisível, mas mantém o espaço no layout, então nada se move.

Uma div é block ou inline por padrão?

Block. div, p, títulos, ul, section e form são block por padrão; span, a, strong, em, img, input e button são inline ou inline-block.

Por que elementos inline-block ficam com um espaço entre eles?

O espaço em branco entre as tags no HTML é renderizado como um espaço, igual ao espaço entre palavras. Use display: flex com gap no pai ou remova o espaço em branco.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR