Menu

justify-content e align-items no CSS: todos os valores

justify-content posiciona os itens flex ao longo do eixo principal, e align-items ao longo do eixo cruzado. Veja todos os valores lado a lado, medidos, com uma grade de alinhamento clicável, align-self e os motivos de o justify-content às vezes não fazer nada.

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

justify-content e align-items em uma frase cada

Em um contêiner flex, justify-content distribui os itens ao longo do eixo principal (ao longo da linha) e align-items os alinha no eixo cruzado (para cima e para baixo na linha). Os dois vão no contêiner:

A caixa fica centralizada nas duas direções: à mesma distância das bordas inicial e final, e do topo e da base. Tire o height: 140px e o align-items: center fica sem ter o que fazer, porque o contêiner encolhe até a altura do próprio item.

Todos os valores de justify-content, medidos

Cada linha abaixo tem os mesmos três itens com um justify-content diferente. Os números no rótulo acima de cada linha são os espaços que o navegador deixou: antes do primeiro item, entre os itens e depois do último.

O contêiner tem 420px e os itens ocupam 180px, então sobram 240px de espaço livre. Para onde ele vai:

ValorO espaço livre vaiEspaços na demo
flex-start (e start)todo depois dos itens0 / 0 / 0 / 240
centermetade antes, metade depois120 / 0 / 0 / 120
flex-end (e end)todo antes dos itens240 / 0 / 0 / 0
space-betweensó entre os itens0 / 120 / 120 / 0
space-aroundigual dos dois lados de cada item, então as bordas ficam com a metade40 / 80 / 80 / 40
space-evenlytodos os espaços iguais, bordas incluídas60 / 60 / 60 / 60

flex-start segue a direção do flex e start segue a direção da escrita. Eles só diferem com row-reverse ou column-reverse, em que flex-start fica na ponta invertida.

Todos os valores de align-items

align-items age através da linha. Os itens abaixo têm alturas diferentes para você ver o que cada valor faz com eles:

ValorO que acontece no eixo cruzado
stretch (o padrão)Itens sem altura definida crescem até preencher o contêiner
flex-start (e start)Os itens ficam no topo, com a própria altura
centerOs itens ficam centralizados, com a própria altura
flex-end (e end)Os itens ficam na base
baselineOs itens se movem para que as primeiras linhas de texto dividam a mesma linha de base

Na caixa baseline, os três rótulos "Ag" ficam na mesma linha, embora o primeiro seja maior e o segundo tenha padding em cima. Esse é o valor para uma linha que mistura um título grande com um texto pequeno, ou um rótulo com um input.

Clique para alinhar

Clique em qualquer célula da grade 3 por 3. A caixa vai para lá, e o CSS que a coloca ali aparece embaixo:

As linhas do seletor mudam o align-items e as colunas mudam o justify-content. A célula do meio é o clássico "centralizar uma div".

Em uma coluna, os dois se invertem

justify-content sempre segue o eixo principal. Com flex-direction: column o eixo principal é vertical, então justify-content move os itens para cima e para baixo e align-items os move para os lados:

Se você trocar os dois, inverta as duas propriedades em vez de reescrever o layout.

align-self e margens auto: um item só

align-self em um item sobrescreve o align-items para aquele item. Não existe justify-self no flexbox; para mover um item ao longo do eixo principal, dê a ele uma margin auto, que ocupa todo o espaço livre daquele lado:

O item verde desce sozinho para a base, e o item âmbar é empurrado para a outra ponta da linha, enquanto os outros ficam no início.

Quando há várias linhas: align-content

align-items alinha os itens dentro da linha deles. Quando um contêiner quebra em várias linhas, align-content espaça as próprias linhas, e aceita os mesmos valores do justify-content. Ele não faz nada em um contêiner nowrap, cuja única linha sempre ocupa a altura do contêiner. A página do flex-wrap mostra isso.

Erros comuns

  • Confundir os eixos. justify-content é a direção do fluxo, align-items é a transversal. Em uma coluna, centralizar na vertical é justify-content: center.
  • Sem espaço livre. Um item com flex: 1 ocupa todo o espaço, então o justify-content não tem nada para distribuir. O mesmo acontece quando o contêiner é inline-flex e tem exatamente a largura dos itens.
  • Sem altura para o align-items. Um contêiner com a altura do conteúdo não deixa nada para alinhar. Defina um height ou min-height.
  • Procurar justify-self no flexbox. Ele é ignorado ali. Use margin-inline-start: auto (ou margin-left: auto) no item.
  • align-items: stretch que não estica. Um item com height próprio o mantém. Remova a altura (use min-height se precisar de um mínimo).
  • Colocar as propriedades nos itens. As duas vão no contêiner flex. Só o align-self vai em um item.

Perguntas frequentes

Qual a diferença entre justify-content e align-items?

justify-content distribui os itens ao longo do eixo principal, a direção em que eles correm (horizontal para flex-direction: row). align-items os posiciona ao longo do eixo cruzado (vertical em uma linha). Em uma coluna, os dois se invertem: justify-content passa a ser vertical.

Qual a diferença entre space-between, space-around e space-evenly?

space-between não põe espaço antes do primeiro item nem depois do último e divide o resto entre os itens. space-around dá a cada item o mesmo espaço dos dois lados, então as bordas ficam com meio espaço. space-evenly deixa todos os espaços iguais, inclusive nas bordas.

Por que o justify-content não funciona?

Normalmente não há espaço livre para distribuir: um item tem flex-grow ou flex: 1, ou o contêiner só tem a largura dos itens (por exemplo display: inline-flex ou um contêiner com float). Confira também se o display: flex está no pai, e não nos itens.

Por que align-items center não centraliza na vertical?

Provavelmente o contêiner tem exatamente a altura do conteúdo, então não há onde centralizar. Dê ao contêiner flex um height ou min-height, e os itens vão para o meio dele.

O que o align-self faz?

align-self sobrescreve o align-items do contêiner para um item. Por exemplo, align-self: flex-end em um filho move só esse filho para o fim do eixo cruzado, enquanto os outros ficam onde o align-items os colocou.

Existe justify-self no flexbox?

Não. O flexbox ignora justify-self, porque o eixo principal é compartilhado por todos os itens. Para empurrar um item ao longo do eixo principal, use uma margin auto, como margin-inline-start: auto. O justify-self funciona no grid.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR