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:
| Valor | El espacio libre va | Huecos en la demo |
|---|---|---|
flex-start (y start) | todo después de los elementos | 0 / 0 / 0 / 240 |
center | la mitad antes, la mitad después | 120 / 0 / 0 / 120 |
flex-end (y end) | todo antes de los elementos | 240 / 0 / 0 / 0 |
space-between | solo entre los elementos | 0 / 120 / 120 / 0 |
space-around | igual a los dos lados de cada elemento, así que los bordes reciben la mitad | 40 / 80 / 80 / 40 |
space-evenly | todos los huecos iguales, bordes incluidos | 60 / 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:
| Valor | Qué 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 |
center | Los elementos quedan centrados, con su propia altura |
flex-end (y end) | Los elementos quedan abajo |
baseline | Los 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-contentes la dirección del flujo yalign-itemsla cruza. En una columna, centrar en vertical esjustify-content: center. - No hay espacio libre. Un elemento con
flex: 1toma todo el espacio, así quejustify-contentno tiene nada que repartir. Lo mismo pasa cuando el contenedor esinline-flexy exactamente tan ancho como sus elementos. - Sin altura para
align-items. Un contenedor tan alto como su contenido no deja nada que alinear. Define unheighto unmin-height. - Buscar
justify-selfen flexbox. Ahí se ignora. Usamargin-inline-start: auto(omargin-left: auto) en el elemento. - Un
align-items: stretchque no estira. Un elemento con su propioheightlo conserva. Quita la altura (usamin-heightsi necesita un mínimo). - Poner las propiedades en los elementos. Las dos van en el contenedor flex. Solo
align-selfva 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.