Curso de CSS / display: block, inline, inline-block e ocultação
A propriedade display determina como um elemento gera caixas e participa do layout. Block, inline e inline-block se comportam de maneiras diferentes no fluxo normal; display: none remove a caixa, enquanto visibility: hidden mantém o espaço do layout.
Compare block, inline e inline-block
| valor | Posicionamento no fluxo básico | largura·altura de elementos de texto comuns |
|---|---|---|
| block | Comece em uma nova linha, seguido por uma quebra de linha | Aplicável |
| inline | Continuando na mesma linha das letras ao redor | Não se aplica a elementos em linha normais, como span ou a |
| inline-block | Uma caixa que continua na linha ao redor | Aplicável |
div·p geralmente é exibido como um bloco, e span·a geralmente é exibido em linha. Se você não der a um bloco uma largura separada, ele geralmente preencherá a largura disponível de seu elemento pai. Inline é colocado dentro de uma linha como letras em uma frase, permitindo que um conteúdo longo seja dividido em várias linhas. Um inline-block é tratado como uma única caixa colocada dentro de uma linha, então mesmo que o conteúdo dentro da caixa seja quebrado, a própria caixa não é dividida em várias partes como um inline comum.
.item { width: 120px; height: 48px; padding: 8px; margin: 8px; }
.blocks .item { display: block; }
.inlines .item { display: inline; }
.inline-blocks .item { display: inline-block; }
O exemplo inteiro dá o mesmo tamanho e margem aos mesmos três spans e apenas altera a exibição. block escreve uma nova linha para cada item, enquanto inline-block os coloca na mesma linha se houver espaço. A declaração de width·height de inline não faz o tamanho real da caixa do span de texto simples se tornar esse número, mesmo que permaneça na lista de estilos. Verifique a declaração calculada e o tamanho realmente usado separadamente.
Entenda o espaçamento inline e os elementos substituídos
Em inline regular, as margens e o preenchimento esquerdo e direito afetam o espaço dentro da linha. O preenchimento e as bordas superior e inferior podem ser desenhados, mas não determinam a altura da linha empurrando as linhas ao redor como os blocos. Se você der um grande preenchimento vertical a um texto com várias linhas, ele pode parecer sobreposto. Ao longo do exemplo, observamos a exibição permitindo alguma margem de manobra na altura da linha.
Não aplique “elementos inline não podem ter tamanho” a todos os elementos. Elementos substituídos, como img, exibem conteúdo externo e podem usar largura e altura mesmo quando sua exibição padrão é inline. O retângulo azul no exemplo tem 120 × 60px. Trate-o de forma diferente de um span de texto comum. O guia MDN sobre layout de bloco e inline explica o fluxo subjacente.
Compare display: none e visibility: hidden
| declaração | exibição na tela | o espaço que originalmente ocupava | HTML em si |
|---|---|---|---|
| display: none | Suprime a caixa de um elemento e seus filhos | não deixa nada | Permanece no DOM |
| visibility: hidden | invisível | manter | Permanece no DOM |
DOM (Document Object Model, modelo de objetos do documento) é um modelo no qual os navegadores tratam documentos HTML como uma estrutura de elementos. Ocultar com CSS é diferente de deletar um elemento HTML. Parágrafos com display: none também podem ser encontrados em Elements nas ferramentas de desenvolvedor. Na linha com Front, o elemento-alvo e Back no exemplo completo, hidden deixa o espaço do alvo, enquanto none retira sua caixa e aproxima o texto seguinte. Um descendente de visibility: hidden pode reaparecer com visibility: visible. Com display: none no ancestral, os descendentes não geram caixas, mesmo que tenham visibility: visible.
Ocultar um elemento pode alterar o acesso pelo teclado e sua disponibilidade para tecnologias assistivas, assim como sua aparência. Este exercício compara o espaço da caixa em um documento estático. Para menus e controles reais, verifique também o gerenciamento de foco e se as informações necessárias continuam disponíveis. Veja MDN: display, MDN: visibility.
Alinhe caixas inline-block no fluxo normal
Como inline-block está dentro de uma linha de texto, ele é alinhado à linha de base da linha por padrão. Se você vir espaço vazio sob um item ou itens com alturas diferentes estiverem desalinhados, verifique vertical-align e line-height juntos. Até mesmo espaços em branco ou quebras de linha entre itens no HTML podem ser lacunas visíveis no posicionamento inline.
Mesmo que você altere a aparência com o display, o span não possui um significado de título ou o div não funciona como um botão. Escolha o HTML que se ajusta ao seu significado e defina sua colocação. Se você precisar gerenciar o alinhamento, espaçamento e tamanho de múltiplas caixas juntas, as regras que você aprenderá mais tarde em Flexbox·Grid podem ser mais apropriadas. Uma vez que você entenda o fluxo básico, fica mais fácil determinar como a disposição muda. Como posicionar itens ao longo de um eixo é abordado com um exemplo completo em Noções Básicas de Flexbox: Containers, Itens e Eixos. Como projetar linhas e colunas juntas é abordado com um exemplo completo em Noções Básicas de CSS Grid: Trilhas, Linhas e Colocação de Itens.
Execute o exemplo e altere um valor de cada vez
Salve o código abaixo como UTF-8 em display.html e abra-o. Os exemplos de imagens contêm dados SVG que podem ser executados sem um arquivo. Compare três métodos de posicionamento e três estados ocultos no mesmo documento.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Comparison of display and hiding</title>
<style>
* { box-sizing: border-box; }
body { margin: 16px; color: #333; font: 16px/1.6 sans-serif; }
.example { margin-block: 24px; padding: 8px; border: 1px dashed #777; }
.item { width: 120px; height: 48px; padding: 8px; margin: 8px;
border: 1px solid #a8653e; background: #ffe8dd; }
.blocks .item { display: block; }
.inlines { line-height: 3; }
.inlines .item { display: inline; }
.inline-blocks .item { display: inline-block; }
.visibility-row { margin-block: 16px; padding: 8px; border: 1px solid #aaa; }
.target { display: inline-block; width: 120px; height: 48px; background: #d9eee2; }
.none .target { display: none; }
.hidden .target { visibility: hidden; }
.replaced { width: 120px; height: 60px; vertical-align: middle; }
</style>
</head>
<body>
<h1>Comparing block and inline elements</h1>
<h2>block</h2><div class="example blocks"><span class="item">Item A</span><span class="item">Item B</span><span class="item">Item C</span></div>
<h2>inline</h2><div class="example inlines"><span class="item">Item A</span><span class="item">Item B</span><span class="item">Item C</span></div>
<h2>inline-block</h2><div class="example inline-blocks"><span class="item">Item A</span><span class="item">Item B</span><span class="item">Item C</span></div>
<h2>Comparing visible, hidden, and removed boxes</h2>
<div class="visibility-row">Front <span class="target">Visible target</span> Back</div>
<div class="visibility-row hidden">Front <span class="target">Hidden target</span> Back</div>
<div class="visibility-row none">Front <span class="target">Target with no box</span> Back</div>
<h2>An image as an inline replaced element</h2>
<p>Front <img class="replaced" alt="A blue rectangle 120px wide and 60px tall." src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='24'%3E%3Crect width='48' height='24' fill='%237ebad3'/%3E%3C/svg%3E"> Back</p>
</body>
</html>
- Nas ferramentas de desenvolvimento, verifique o tamanho dos itens block e inline-block até suas bordas. É 120×48px devido à regra comum de border-box. Itens inline não têm largura fixa de 120px, mesmo que tenham a mesma declaração de largura.
- Reduza a janela para ver se o terceiro item no inline-block pula para a próxima linha. Cada bloco começa em uma nova linha, mesmo em telas largas.
- Desative temporariamente a declaração display: none da regra .none .target. Verifique se a posição das letras atrás dele muda quando o alvo aparece. Se você desativar a declaração de visibilidade hidden, o objeto aparecerá, mas o espaço originalmente reservado será mantido.
- Altere apenas a largura da imagem para 160px. Ao contrário de um span inline comum, a caixa da imagem aceita essa largura. Confira suas dimensões nas ferramentas de desenvolvimento e restaure 120px. Mantendo a altura em 60px, a caixa passa de 120×60 para 160×60 e muda sua proporção; confira a caixa, pois o conteúdo de um SVG também pode ter regras internas de apresentação.
Se o posicionamento for diferente do esperado, verifique o valor final de display, o método de posicionamento do pai, o tamanho da caixa e a altura da linha. Em vez de adicionar repetidamente declarações de tamanho que não se aplicam, é útil primeiro distinguir entre tipos de elementos e fluxos básicos.




