Menu

justify-content y align-items en CSS: todos los valores

justify-content coloca los elementos flex a lo largo del eje principal y align-items a lo largo del eje transversal. Mira todos los valores lado a lado, medidos, con una cuadrícula de alineación clicable, align-self y las razones por las que a veces justify-content no hace nada.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

justify-content y align-items en una frase cada uno

En un contenedor flex, justify-content reparte los elementos a lo largo del eje principal (a lo largo de la fila) y align-items los alinea en el eje transversal (de arriba abajo en la fila). Los dos van en el contenedor:

La caja está centrada en las dos direcciones: a la misma distancia de los bordes de inicio y de fin, y de arriba y de abajo. Quita height: 140px y align-items: center no tiene nada que hacer, porque el contenedor se encoge hasta la altura propia del elemento.

Todos los valores de justify-content, medidos

Cada fila de abajo tiene los mismos tres elementos con un justify-content distinto. Los números de la etiqueta encima de cada fila son los huecos que dejó el navegador: antes del primer elemento, entre elementos y después del último.

El contenedor mide 420px y los elementos ocupan 180px, así que hay 240px de espacio libre. Adónde va:

ValorEl espacio libre vaHuecos en la demo
flex-start (y start)todo después de los elementos0 / 0 / 0 / 240
centerla mitad antes, la mitad después120 / 0 / 0 / 120
flex-end (y end)todo antes de los elementos240 / 0 / 0 / 0
space-betweensolo entre los elementos0 / 120 / 120 / 0
space-aroundigual a los dos lados de cada elemento, así que los bordes reciben la mitad40 / 80 / 80 / 40
space-evenlytodos los huecos iguales, bordes incluidos60 / 60 / 60 / 60

flex-start sigue la dirección flex y start sigue la dirección de escritura. Solo se diferencian con row-reverse o column-reverse, donde flex-start queda en el extremo invertido.

Todos los valores de align-items

align-items trabaja a lo ancho de la fila. Los elementos de abajo tienen alturas distintas para que veas qué hace cada valor con ellos:

ValorQué pasa en el eje transversal
stretch (el valor por defecto)Los elementos sin altura definida crecen hasta llenar el contenedor
flex-start (y start)Los elementos quedan arriba, con su propia altura
centerLos elementos quedan centrados, con su propia altura
flex-end (y end)Los elementos quedan abajo
baselineLos elementos se mueven para que sus primeras líneas de texto compartan una línea base

En la caja baseline, las tres etiquetas "Ag" quedan sobre una misma línea aunque la primera sea más grande y la segunda tenga padding arriba. Es el valor para una fila que mezcla un título grande con texto pequeño, o una etiqueta con un input.

Haz clic para alinear

Haz clic en cualquier celda de la cuadrícula de 3 por 3. La caja se mueve ahí, y el CSS que la pone ahí aparece debajo:

Las filas del selector cambian align-items y las columnas cambian justify-content. La celda del medio es el clásico "centrar un div".

En una columna, los dos se intercambian

justify-content siempre sigue el eje principal. Con flex-direction: column el eje principal es vertical, así que justify-content mueve los elementos hacia arriba y hacia abajo y align-items los mueve a lo ancho:

Si los confundes, intercambia las dos propiedades en lugar de reescribir el layout.

align-self y márgenes auto: un solo elemento

align-self en un elemento sobrescribe align-items para ese elemento. En flexbox no existe justify-self; para mover un elemento a lo largo del eje principal, dale un margin auto, que toma todo el espacio libre de ese lado:

El elemento verde baja solo hasta abajo, y el ámbar queda empujado al otro extremo de la fila mientras los demás se quedan al inicio.

Cuando hay varias líneas: align-content

align-items alinea los elementos dentro de su línea. Cuando un contenedor pasa a varias líneas, align-content espacia las líneas en sí, y acepta los mismos valores que justify-content. No hace nada en un contenedor nowrap, cuya única línea siempre ocupa toda la altura del contenedor. La página de flex-wrap lo muestra.

Errores comunes

  • Confundir los ejes. justify-content es la dirección del flujo y align-items la cruza. En una columna, centrar en vertical es justify-content: center.
  • No hay espacio libre. Un elemento con flex: 1 toma todo el espacio, así que justify-content no tiene nada que repartir. Lo mismo pasa cuando el contenedor es inline-flex y exactamente tan ancho como sus elementos.
  • Sin altura para align-items. Un contenedor tan alto como su contenido no deja nada que alinear. Define un height o un min-height.
  • Buscar justify-self en flexbox. Ahí se ignora. Usa margin-inline-start: auto (o margin-left: auto) en el elemento.
  • Un align-items: stretch que no estira. Un elemento con su propio height lo conserva. Quita la altura (usa min-height si necesita un mínimo).
  • Poner las propiedades en los elementos. Las dos van en el contenedor flex. Solo align-self va en un elemento.

Preguntas frecuentes

¿Qué diferencia hay entre justify-content y align-items?

justify-content reparte los elementos a lo largo del eje principal, la dirección en la que fluyen (horizontal con flex-direction: row). align-items los coloca a lo largo del eje transversal (vertical en una fila). En una columna los dos se intercambian: justify-content pasa a ser vertical.

¿Qué diferencia hay entre space-between, space-around y space-evenly?

space-between no pone espacio antes del primer elemento ni después del último y reparte el resto entre los elementos. space-around le da a cada elemento el mismo espacio a los dos lados, así que los bordes reciben medio hueco. space-evenly hace que todos los huecos sean iguales, incluidos los bordes.

¿Por qué no funciona justify-content?

Normalmente no hay espacio libre que repartir: un elemento tiene flex-grow o flex: 1, o el contenedor es tan ancho como sus elementos (por ejemplo display: inline-flex o un contenedor con float). Comprueba también que display: flex esté en el padre y no en los elementos.

¿Por qué align-items center no centra en vertical?

Probablemente el contenedor es exactamente tan alto como su contenido, así que no hay nada en lo que centrar. Dale al contenedor flex una altura o un min-height, y los elementos se moverán a su centro.

¿Qué hace align-self?

align-self sobrescribe el align-items del contenedor para un solo elemento. Por ejemplo, align-self: flex-end en un hijo mueve solo ese hijo al final del eje transversal, mientras los demás se quedan donde los puso align-items.

¿Existe justify-self en flexbox?

No. Flexbox ignora justify-self, porque el eje principal lo comparten todos los elementos. Para empujar un elemento a lo largo del eje principal, usa un margin auto, como margin-inline-start: auto. justify-self funciona en grid.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR