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:
block | inline | inline-block | |
|---|---|---|---|
| Começa em uma nova linha | Sim | Não | Não |
| Largura padrão | Ocupa o contêiner | Se ajusta ao conteúdo | Se ajusta ao conteúdo |
width e height | Valem | Ignorados | Valem |
| Margin vertical | Vale | Ignorada | Vale |
| Padding vertical | Empurra o conteúdo | Pintado, mas não afasta as linhas | Empurra o conteúdo |
| Elementos típicos | div, p, h1, ul, section | span, a, strong, em | button, 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: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| Ocupa espaço | Não | Sim | Sim |
| Pode ser clicado | Não | Não | Sim |
| Lido por leitores de tela | Não | Não | Sim |
| Pode ser animado suavemente | Não | Não | Sim |
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: flexdispõe os filhos em uma linha ou coluna, com controle de alinhamento e espaçamento. Veja flexbox.display: gridposiciona 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
| Valor | O que faz |
|---|---|
flow-root | Um block que contém os floats e impede que as margens dos filhos vazem; o "clearfix" moderno |
contents | A 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-item | Um block com marcador de lista, o padrão do li |
table, table-row, table-cell | Layout de tabela em elementos que não são tabela |
inline-flex, inline-grid | Um contêiner flex ou grid que fica inline |
Erros comuns
- Definir
widthouheightem umspanoua. Elementos inline os ignoram. Useinline-blockoublock. - Margin vertical em um elemento inline. Também é ignorada. A solução é a mesma.
- Usar
display: nonepara 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
displaysobrescrevendo o atributohidden. A regra CSS vence. - Tentar animar o
display. Definirdisplay: noneesconde o elemento na hora, sem fade; anime aopacitye troque odisplay(ou avisibility) 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.