Considere el eje principal y el eje transversal de un contenedor flexible:
Fuente: W3C
Para alinear elementos flexibles a lo largo del eje principal hay una propiedad:
Para alinear elementos flexibles a lo largo del eje transversal, hay tres propiedades:
En la imagen de arriba, el eje principal es horizontal y el eje transversal es vertical. Estas son las direcciones predeterminadas de un contenedor flexible.
Sin embargo, estas direcciones pueden intercambiarse fácilmente con la flex-direction
propiedad.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(El eje transversal siempre es perpendicular al eje principal).
Mi punto al describir cómo funcionan los ejes es que no parece haber nada especial en ninguna dirección. Eje principal, eje transversal, ambos son iguales en términos de importancia y flex-direction
hace que sea fácil cambiar de un lado a otro.
Entonces, ¿por qué el eje transversal obtiene dos propiedades de alineación adicionales?
¿Por qué son align-content
y align-items
consolidado en una propiedad para el eje principal?
¿Por qué el eje principal no obtiene una justify-self
propiedad?
Escenarios donde estas propiedades serían útiles:
colocando un elemento flexible en la esquina del contenedor flexible
#box3 { align-self: flex-end; justify-self: flex-end; }
hacer que un grupo de elementos flexibles se alinee a la derecha (
justify-content: flex-end
) pero que el primer elemento se alinee a la izquierda (justify-self: flex-start
)Considere una sección de encabezado con un grupo de elementos de navegación y un logotipo. Con
justify-self
el logotipo podría alinearse a la izquierda, mientras que los elementos de navegación permanecen muy a la derecha, y todo se ajusta sin problemas ("flexiona") a diferentes tamaños de pantalla.en una fila de tres elementos flexibles, fije el elemento central al centro del contenedor (
justify-content: center
) y alinee los elementos adyacentes a los bordes del contenedor (justify-self: flex-start
yjustify-self: flex-end
).Tenga en cuenta que los valores
space-around
yspace-between
en lajustify-content
propiedad no mantendrán el elemento central centrado sobre el contenedor si los elementos adyacentes tienen anchuras diferentes.
Al momento de escribir esto, no hay mención de justify-self
o justify-items
en la especificación de flexbox .
Sin embargo, en el Módulo de alineación de cajas CSS , que es la propuesta inacabada del W3C para establecer un conjunto común de propiedades de alineación para su uso en todos los modelos de cajas, existe esto:
Fuente: W3C
Notarás eso justify-self
y justify-items
estás siendo considerado ... pero no para flexbox .
Terminaré reiterando la pregunta principal:
¿Por qué no hay propiedades "justify-items" y "justify-self"?
justify-content: flex-start
, así que los artículos están llenos al principio como | abcd |. ¿Qué esperarías que hiciera si justify-self: [anything]
justify-self
trabajar para un artículo flexible? Yo diría que no de manera diferente a los auto
márgenes que ya funcionan en artículos flexibles. En su segundo ejemplo, justify-self: flex-end
en el elemento d lo movería al borde lejano. Eso en sí mismo sería una gran característica, que los auto
márgenes ya pueden hacer. Publiqué una respuesta con una demostración.
justify-content
y justify-self
específica, de modo que los casos con conflictos (como los escenarios que pregunté) están definidos de manera clara y sensata. Como señalé en mi respuesta aquí, {justify|align}-self
se trata de alinear elementos dentro de un cuadro más grande que tiene un tamaño independiente del {justify|align}-self
valor , y no existe dicho cuadro, en el eje principal, para alinear un elemento flexible.
justify-self
e justify-content
interactuarías, en los casos en que entran en conflicto (como los escenarios que expuse). Los márgenes automáticos simplemente no interactúan justify-content
en absoluto: roban todo el espacio de empaque antes de tener la justify-content
oportunidad de usarlo. Entonces, los márgenes automáticos no son realmente un buen análogo de cómo funcionaría esto.
justify-self
trabajar para un artículo flexible? Supongamos que tiene elementos a, b, c, d con espacio adicional para distribuir a su alrededor, y el contenedor flexible tienejustify-content: space-between
, por lo que terminan como | abcd |. ¿Qué significaría agregar, por ejemplo,justify-self: center
o 'justify-self: flex-end' solo al elemento 'b' allí? ¿Dónde esperarías que fuera? (Veo algunas demostraciones en una de las respuestas aquí, pero no veo una forma clara de que funcione en general.)