Menu

Width e height no CSS: min, max, % e auto explicados

width e height definem o tamanho da caixa de um elemento. Veja tamanhos fixos e em porcentagem, por que height: 100% muitas vezes não faz nada, min-height e max-width para layouts flexíveis, auto vs 100% e as palavras-chave fit-content.

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

Definir width e height

width e height definem o tamanho da caixa de conteúdo de um elemento. Por padrão, o padding e a borda são somados por fora desse tamanho.

A caixa tem 260 por 100 pixels: 240 por 80 de conteúdo, mais 10px de padding de cada lado. Com box-sizing: border-box, ela teria exatamente 240 por 80; a página do box model explica os dois casos.

Valores

ValorExemploSignificado
autowidth: autoO padrão. Blocos ocupam a largura do contêiner; a altura se ajusta ao conteúdo
Comprimento300px, 20remUm tamanho fixo
Porcentagem50%Da largura (para width) ou da altura (para height) do bloco que o contém
Unidades de viewport100vh, 50vw, 100dvhDa janela do navegador
min-contentwidth: min-contentO mais estreito possível, quem decide é a palavra mais longa
max-contentwidth: max-contentTão largo quanto o conteúdo em uma linha
fit-contentwidth: fit-contentComo max-content, mas nunca mais largo que o contêiner

Por que height: 100% não faz nada

Um height em porcentagem precisa de um pai com altura definida para servir de base. Quando a altura do pai é auto, que é o caso normal, o height: 100% do filho também se comporta como auto.

O primeiro filho tem só a altura do texto. O segundo preenche o pai porque o pai tem uma altura. Para fazer a cadeia funcionar com porcentagens na página toda, cada ancestral até html e body precisa de uma altura, e é por isso que a maioria dos layouts usa flexbox ou grid: os filhos deles se esticam para preencher sem nenhuma porcentagem.

min-height e max-width: tamanhos que se adaptam

Tamanhos fixos quebram fácil: uma altura fixa transborda quando o texto é maior que o esperado, e uma largura fixa é larga demais para um celular. As propriedades min- e max- definem limites em vez de tamanhos exatos.

PropriedadeSignificado
min-widthNunca mais estreito que isso
max-widthNunca mais largo que isso
min-heightNunca mais baixo que isso, mas pode crescer
max-heightNunca mais alto que isso (o conteúdo extra transborda)

Em uma tela com menos de 360px, como a de um celular, os cards encolhem junto, porque max-width é só um teto.

Quando um tamanho e um limite se aplicam ao mesmo tempo, os limites vencem: max-width vence width, e min-width vence max-width.

width: auto vs width: 100%

Em um elemento de bloco, deixar width em auto é quase sempre o que você quer. auto encaixa a caixa inteira, com padding e borda, no contêiner. 100% deixa o conteúdo tão largo quanto o contêiner e depois soma o padding e a borda por cima:

width: 100% continua útil em elementos que não são blocos por padrão (um <input>, um <img>, um inline-block), de preferência junto com box-sizing: border-box.

Ajustar ao conteúdo: fit-content

Para deixar um bloco só com a largura do texto, sem trocá-lo para inline-block, use fit-content:

fit-content com margin-inline: auto centraliza um rótulo ou um bloco com cara de botão que fica exatamente com a largura do texto.

Seções com altura da tela e unidades de viewport

vh é 1% da altura da viewport e vw 1% da largura. No celular, a barra de endereço do navegador cresce e encolhe conforme você rola, então 100vh pode ser mais alto que a área visível. A unidade dinâmica dvh acompanha a área visível, e svh usa a menor altura visível:

.hero {
  min-height: 100vh;  /* fallback */
  min-height: 100dvh; /* follows mobile toolbars */
}

Use min-height, não height, em seções de tela cheia, para que uma tela pequena com muito texto tenha uma seção que cresce. Uma altura fixa com conteúdo que não cabe transborda, e é disso que trata a página de overflow no CSS.

Erros comuns

  • height: 100% dentro de um pai sem altura. Ele age como auto. Dê uma altura ao pai ou use flex ou grid.
  • width: 100% mais padding. O elemento transborda o contêiner. Deixe a largura dos blocos em auto ou use box-sizing: border-box.
  • Alturas fixas em contêineres de texto. Use min-height para que um texto maior ou uma fonte maior não transborde.
  • width em um elemento inline. <span> e <a> ignoram width e height; transforme-os em inline-block ou block.
  • width: 1200px no invólucro da página. Ele rola para o lado em qualquer celular. Use max-width: 1200px.

Perguntas frequentes

Por que height: 100% não funciona?

Uma altura em porcentagem é uma porcentagem da altura do pai, e só funciona quando essa altura é definida. Se a altura do pai é auto (medida pelo conteúdo), a porcentagem é tratada como auto. Dê uma altura ao pai ou use flexbox ou grid, que esticam os filhos sem porcentagens.

Qual a diferença entre width: 100% e width: auto?

Em um elemento de bloco, auto preenche o contêiner incluindo o padding e a borda. width: 100% define a largura do conteúdo igual à largura do contêiner, então com o box-sizing: content-box padrão qualquer padding ou borda faz o elemento transbordar.

O que o min-height faz no CSS?

Define a menor altura que um elemento pode ter e ainda deixa ele crescer com o conteúdo. min-height: 200px dá 200px a um card vazio, e um card com mais texto fica mais alto em vez de transbordar, o que um height fixo não permitiria.

Qual a diferença entre width e max-width?

width define um tamanho exato. max-width define um limite máximo: o elemento pode ser mais estreito, por exemplo no celular, mas nunca mais largo. width: 100%; max-width: 600px; preenche telas pequenas e para em 600px nas grandes.

Como deixar um elemento com a altura da tela inteira?

Use min-height: 100vh (ou 100dvh, para levar em conta as barras do navegador no celular). min-height em vez de height deixa a seção crescer se o conteúdo for mais alto que a tela.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR